yous
@yous

Bitrix поиск sphinx как задать вес определенным полям?

как задать вес для поиска?
например если найдено совпадение в заголовке документа, то ставить в результатах на первое место, если находит в описании ставить ниже, в свойствах ещё ниже итд.?
  • Вопрос задан
  • 401 просмотр
Пригласить эксперта
Ответы на вопрос 3
opium
@opium
Просто люблю качественно работать
В опциях можно задать свои формулу подсчёта веса, укажите больший для заголовка
Ответ написан
WebDev2030
@WebDev2030
Битриксоид до мозга и костей
Из коробки скорее всего никак.
Дело в том, что в сфинксе два поля title, body в которых и хранится текстовая информация. Поэтому ты можешь поднять либо title либо body. Пример запроса из сети для выставления весов полям:
SELECT id FROM tx3nh_users WHERE MATCH('keyword1') 
             OPTION field_weights=(p.fullname=3, s.staff_title=2, s.bio=1)

Чтобы ранжировать по положению поискового запроса в тексте стоит использовать ранкер sph04. Я унаследовался от Sphinx класса битрикса и в методах Search и SearchTitle дописал OPTION ranker=sph04
Ответ написан
Комментировать
yous
@yous Автор вопроса
а там уже стоит OPTION, просто через запятую дописывать? и ещё sph04 сам вес расставляет? как он понимает что title выше всех остальных?

}

			$ts = time()-CTimeZone::GetOffset();
			if ($bTagsCloud)
			{
				$sql = "
					select groupby() tag_id
					,count(*) cnt
					,max(date_change) dc_tmp
					,if(date_to, date_to, ".$ts.") date_to_nvl
					,if(date_from, date_from, ".$ts.") date_from_nvl
					".($cond1 != ""? ",$cond1 as cond1": "")."
					from ".$this->indexName."
					where ".implode("\nand\t", $arWhere)."
					group by tags
					order by cnt desc
					limit 0, ".$limit."
					option max_matches = ".$limit."
				";

				$DB = CDatabase::GetModuleConnection('search');
				$startTime = microtime(true);

				$r =  $this->query($sql);

				if($DB->ShowSqlStat)
					$DB->addDebugQuery($sql, microtime(true)-$startTime);

				if (!$r)
				{
					throw new \Bitrix\Main\Db\SqlQueryException('Sphinx select error', $this->getError(), $sql);
				}
				else
				{
					while($res = $this->fetch($r))
						$result[] = $res;
				}
			}
			else
			{
				$sql = "
					select id
					,item
					,param1
					,param2
					,module_id
					,param2_id
					,date_change
					,custom_rank
					,weight() as rank
					".($cond1 != ""? ",$cond1 as cond1": "")."
					,if(date_to, date_to, ".$ts.") date_to_nvl
					,if(date_from, date_from, ".$ts.") date_from_nvl
					from ".$this->indexName."
					where ".implode("\nand\t", $arWhere)."
					".$this->__PrepareSort($aSort)."
					limit ".$offset.", ".$limit."
					option max_matches = ".($offset + $limit)."
				";
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы