+2.28
Рейтинг
3.96
Сила
На счёт utf8_decode() не знаю, не проверял. Кто проверит — отпишитесь.
Сорри, ступил… забыл отметить тегами код (для удобочитаемости), повтор:
public function GetSimilarTopics($oTopic){
		$iNumTitle = 0;
		foreach (array_unique(preg_split('/[\s,]+/',$oTopic->getTitle())) as $var)
		{
			if (mb_strlen($var,'UTF-8')>1 and $var!='—') $iNumTitle++;
		}
		$iNumTags = 0;
		foreach (array_unique(preg_split('/[\s,]+/',$oTopic->getTags())) as $var)
		{
			if (mb_strlen($var,'UTF-8')>1 and $var!='—') $iNumTags++;
		}
		$iNumTags = count(array_unique(preg_split('/[\s,]+/',$oTopic->getTags())));
		$iNumTags = ($iNumTags > Config::Get('module.similartopics.num_tags')-1 ) ? Config::Get('module.similartopics.num_tags') : $iNumTags;
        $sTitleTags='@topic_tags "'.$oTopic->getTags().'"/'.$iNumTags.' @(topic_title,topic_text) "'.$oTopic->getTitle().'"/'.round($iNumTitle*Config::Get('module.similartopics.percent_title'));
        $aTopics=array();
        if($data=$this->Sphinx_FindSimilarTopics($sTitleTags,Config::Get('module.similartopics.count')+1,array('topic_publish' => 1))){
            foreach($data['matches'] as $k=>$v){
                $obj=$this->Topic_GetTopicById($k);
                if($k!=$oTopic->getId() && isset($obj)) $aTopics[]=$obj;
            }
        }
        return $aTopics;
    }
Проблему решил. Вот решение

class LsSimilarTopics extends Module {
public function Init() {
}
public function GetSimilarTopics($oTopic){
$iNumTitle = 0;
foreach (array_unique(preg_split('/[\s,]+/',$oTopic->getTitle())) as $var)
{
if (mb_strlen($var,'UTF-8')>1 and $var!='—') $iNumTitle++;
}
$iNumTags = 0;
foreach (array_unique(preg_split('/[\s,]+/',$oTopic->getTags())) as $var)
{
if (mb_strlen($var,'UTF-8')>1 and $var!='—') $iNumTags++;
}
$iNumTags = count(array_unique(preg_split('/[\s,]+/',$oTopic->getTags())));
$iNumTags = ($iNumTags > Config::Get('module.similartopics.num_tags')-1 )? Config::Get('module.similartopics.num_tags'): $iNumTags;
$sTitleTags='@topic_tags "'.$oTopic->getTags().'"/'.$iNumTags.' @(topic_title,topic_text) "'.$oTopic->getTitle().'"/'.round($iNumTitle*Config::Get('module.similartopics.percent_title'));
$aTopics=array();
if($data=$this->Sphinx_FindSimilarTopics($sTitleTags,Config::Get('module.similartopics.count')+1,array('topic_publish' => 1))){
foreach($data['matches'] as $k=>$v){
$obj=$this->Topic_GetTopicById($k);
if($k!=$oTopic->getId() && isset($obj)) $aTopics[]=$obj;
}
}
return $aTopics;
}
}

в конфиг similartopics внести строчки
$config['num_tags'] = 2; // какое количество тегов должно совпадать с тегами других топиков, что бы другие топики были «похожим»
$config['percent_title'] = 0.6; // процент количества всех слов из заголовка, которые должны совпасть с заголовками и текстами других топиков, чтобы именоваться похожими

Мб проверка на тире лишняя. Я повторных тестов не делал, поэтому решил оставить, время выполнения скрипта от неё не возрастёт.

Забыл уточнить… это всё работает для последних SVN. Не для 0.3.1
Проблемы не было, глючил FirePHP
Спасибо Максиму за помощь
поэкспериментировал с различными локалями. И с ISO_8859-5, и с KOI8-R, и с CP1251… чёт ничего не изменяется от этого… Не считая языка в самой консоли. То русский, то английский, то кряки )

Куда далее копать?
А вот на команду locale без параметров выдал следущее:
LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=


Как я тут прочёл — POSIX ставиться автономно.
Выполнил команду: export LANG=«ru_RU.UTF-8»
Проверил командой: locale. Вывод:
locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=


На всяк случай перезапустил nginx и apache (хз надо ли было)

Но к сожалению все эти действия моей ситуации не помогли — всё те же крякозябры. На самом деле у меня теперь ещё и в Putty некоторые результаты показываются неверной кодировкой, например перезапуск мемкеша выдал следующее:
п·я│я┌п╟пҐп╟п╡п╩п╦п╡п╟п╣я┌я│я▐ Distributed memory caching ([  OK  ]d):
п≈п╟п©я┐я│п╨п╟п╣я┌я│я▐ Distributed memory caching (memcache[  OK  ]


Кстати после перезапуска сервера кодировка почему-то заново сбрасывается в POSIX. У меня VPS. Перезагрузку выполнял командой shutdown -r now
На эту команду серв мне выдал огромный листинг различных локалей.
ru_RU.utf8 в этом списке имеется
Ты имеешь ввиду функцию:
/**
 * Установка локали
 */
setlocale(LC_ALL, "ru_RU.UTF-8");

которая в конце конфига?
Хм. Единственное, что я узнал из этой кучи текста — это «У FastVPS хороший саппорт»… и то это всё относительно, по данному сообщению понятно лишь то, что саппорт может выполнить примитивное администрирование. За дополнительные деньги саппорт везде хороший будет. Бесполезное сообщение… пока бесполезное. Надеюсь после тестирования появится более интересная инфа. Вот пример полезного обзора. Ждём-с нечто подобное.
Хм… str_word_count работает не так как хотелось бы… она не считает русские слова почему то… Когда я решил вывести в консоль FirePHP значение $sTitle и $sTags, то все русские слова отображались крякозябрами (но на сайте всё норм отображается)

Куда копать? Или мб кто знает аналог функции по подсчёту слов в строке?
Итак. Просидел почти всю ночь. Вот чего я добился:

в SimilarTopics.class.php

class LsSimilarTopics extends Module {
    public function Init() {
    }
    
	public function GetSimilarTopics($oTopic){
		$sTags = $oTopic->getTags();
		$sTitle = $oTopic->getTitle();
		$iNumTags = str_word_count($sTags);
		$iNumTitle = str_word_count($sTitle);
		($iNumTags > 1) ? 2 : $iNumTags;
        $sTitleTags='@topic_tags "'.$oTopic->getTags().'"/'.$iNumTags.' @(topic_title,topic_text) "'.$oTopic->getTitle().'"/'.round($iNumTitle*0.6);
        $aTopics=array();
        if($data=$this->Sphinx_FindSimilarTopics($sTitleTags,Config::Get('module.similartopics.count')+1,array('topic_publish' => 1))){
            foreach($data['matches'] as $k=>$v){
                $obj=$this->Topic_GetTopicById($k);
                if($k!=$oTopic->getId() && isset($obj)) $aTopics[]=$obj;
            }
        }
        return $aTopics;
    }
}


в Sphinx.class.php

public function FindSimilarTopics($sTerms,$iLimit,$aExtraFilters){
		$cacheKey=Config::Get('module.search.entity_prefix')."similartopics_{$sTerms}_{$iLimit}";
		if(false===($data=$this->Cache_Get($cacheKey))){
			$this->oSphinx->SetMatchMode(SPH_MATCH_EXTENDED2);
			$this->oSphinx->SetLimits(0,$iLimit);
			/**
			 * Устанавливаем атрибуты поиска
			 */
			if(!is_null($aExtraFilters)){
				foreach($aExtraFilters AS $sAttribName => $sAttribValue){
					$this->oSphinx->SetFilter(
						$sAttribName, 
						(is_array($sAttribValue)) ? $sAttribValue : array($sAttribValue)
					);
				}
			}
			if(!is_array($data=$this->oSphinx->Query($sTerms,Config::Get('module.search.entity_prefix').'topicsIndex'))) return FALSE;

			# no results = no cache
			if($data['total']>0) $this->Cache_Set($data,$cacheKey,array(),60*15);
		}
		return $data;
	}


Слегка поясню что же я сделал:
1) Ищется теперь только в опубликованных
2) Усложнён запрос, теперь он формулируется так:
$sTitleTags='@topic_tags "'.$oTopic->getTags().'"/'.$iNumTags.' @(topic_title,topic_text) "'.$oTopic->getTitle().'"/'.round($iNumTitle*0.6);

Теперь теги ищются среди тегов, а заголовок в заголовках и текстах, причём совпадения в тегах по двум словам, а в заголовке должны совпасть 60% слов.

P.S. Конечно в конфигурациях сфинкса (там где вы писали запросы к БД) нужно в запрос к топикам добавить поле topic_tags

Написал просто ппц как, но мне простительно, см. время коммента. Надеюсь кто нить разберётся в этом ночном бреде
Стоп… сорри… Заметил что тут стоит параметр «SPH_MATCH_ANY», а не «SPH_MATCH_ALL».

Ну тогда хотелось бы добавить следущее: необходимо добавить поиск только по опубликованным топикам.
Так… поразбирался немного… по сути вы просто берёте запрос «поиска» и применяете его для похожести. То бишь то же самое, что вставить набор тегов топика в поиск по сайту. Я правильно понимаю или нет?
>можете добавить и по тайтлу, как было первоначально в плагине

А как это сделать? Что-то не догоняю никак…
Какая версия? 0.3.1 или последняя SVN?
Ничё так. Аккуратненько )
1) А что можно быть сильно сильным? ) Поправьте опечатку )
2) Копировать надо не в тупую а в умную. У Эвента EventCountry() первыми строками идёт:
if (!($oCountry=$this->User_GetCountryByName(urldecode($this->getParam(0))))) {
	return parent::EventNotFound();
}

Вот это скорее всего вас и выкидывает на 404

+
это:
$this->AddEvent('group','EventGroup');
исправить на это:
$this->AddEventPreg('/^group$/i','/^.+$/i','/^(page(\d+))?$/i','EventGroup');

Ну это всё как минимум для начала. Далее я думаю разберётесь и допилите всё до конца.
Зачёт ))
gladbox[doggy]gmail.com
Заранее спасибо
А демо посмотреть как-нибудь можно? А то что-то судя по скрину ну оооч большие сомнения, что этот модуль удобнее и симпотичнее тимера.
Вообще планировал с тимера перейти на Redmin… Оч нефиговые возможности… но разбираться надо, не всё так интуитивно понятно, как в тимере