Кажется, что Сфинкс ищет слово словом. Я не знаю, как искать документы для точной фразы. Я попробовал SPH_MATCH_ALL
, SPH_MATCH_PHRASE
но все разыскивали документы по слову. Я использую его в своем приложении PHP.
Как запросить Sphinx для соответствия точной строке?
Вот мой код:
$sphinx = new SphinxClient(); $mode = SPH_MATCH_PHRASE; $sphinx->setServer('127.0.0.1', 9312); $sphinx->setLimits(0,1); $sphinx->setMaxQueryTime(5000); $sphinx->setMatchMode($mode); $sphinx->setFieldWeights(array('name' => 100)); $sphinx->setArrayResult(true); $result = $sphinx->query('Lorem ipsum dolor sit amet, consectetur adipiscing elit.'); print_r($result);
Результат возврата:
Array ( [error] => [warning] => [status] => 0 [fields] => Array ( [0] => name [1] => company [2] => image [3] => price ) [attrs] => Array () [total] => 0 [total_found] => 0 [time] => 0.000 [words] => Array ( [lorem] => Array ( [docs] => 0 [hits] => 0 ) [ipsum] => Array ( [docs] => 0 [hits] => 0 ) [dolor] => Array ( [docs] => 0 [hits] => 0 ) [sit] => Array ( [docs] => 0 [hits] => 0 ) [amet] => Array ( [docs] => 0 [hits] => 0 ) [consectetur] => Array ( [docs] => 0 [hits] => 0 ) [adipiscing] => Array ( [docs] => 0 [hits] => 0 ) [elit] => Array ( [docs] => 0 [hits] => 0 ) ) )
Как видите, Sphinx выполняет поиск документов по слову …
Лучший способ – использовать синтаксис SPH_MATCH_EXTENDED2 и взять запрос в двойных кавычках.
$sphinx->SetMatchMode(SPH_MATCH_EXTENDED2); $sphinx->Query('"Lorem ipsum dolor"');
Расширенный синтаксис
использовать:
$sphinx->SetMatchMode(SPH_MATCH_PHRASE);
SPH_MATCH_ALL Сопоставьте все слова запроса (режим по умолчанию).
SPH_MATCH_ANY Сопоставьте любые слова запроса.
SPH_MATCH_PHRASE Сопоставьте запрос как фразу, требующую идеального соответствия.
SPH_MATCH_BOOLEAN Задайте запрос как булево выражение.
SPH_MATCH_EXTENDED Запрос соответствия как выражение во внутреннем языке запросов Sphinx.
SPH_MATCH_FULLSCAN Включает полноэкранный режим.
SPH_MATCH_EXTENDED2 То же, что и SPH_MATCH_EXTENDED плюс рейтинг и поддержка поиска кворума.
В настоящее время я нашел лучший способ сделать это, используя модификаторы ^ $.
Если вы посмотрите здесь: Sphinx Extended Syntax вы можете увидеть, что вы можете сделать матч, похожий на что-то вроде:
^Exact String$
Это должно помочь решить проблему.
Я знаю, что опаздываю на вечеринку, но что происходит, когда вы ищете из командной строки?
sphinx/bin/search -i indexName Lorem ipsum -e2
-e2 – режим расширенного соответствия 2.
Также не забудьте переиндексировать индексы sphinx:
sphinx/bin/indexer --rotate --config sphinx/etc/sphinx.conf --all
И убедитесь, что searchd запущен.
Я думаю, лучший способ …
1. использование режима расширенного2
а также
2. используя синтаксис таким образом -> (filed-start и filed-end) && double quot;
Например
$sphinx->SetMatchMode(SPH_MATCH_EXTENDED2); $sphinx->Query('(^Lorem ipsum dolor$ "Lorem ipsum dolor")');
Самое лучшее, что у меня есть, это:
$searchTemplate = '@(%s) "^%s$" | "^%s" | "%s" | (%s)'; $sqlToSearch .= sprintf($searchTemplate, "part_name", //Index to search in trim($stringToSearch), trim($stringToSearch), trim($stringToSearch), trim($stringToSearch));
В этом случае точное совпадение будет первым.
Я считаю, что вы видите статистику, которая возвращается вместе с результатами поиска. Когда sphinx завершается, он возвращает статистику о том, где были найдены слова, чтобы вы могли при необходимости корректировать ваш поиск. Чтобы проверить, вы должны выполнить поиск, который возвращает результаты. Вы также должны провести тестирование в тестовом индексе, где вы знаете, какие результаты будут получены для любого конкретного поиска.
если вы пробовали все выше и ничего не работали, проверьте эти параметры в файле sphinx.conf, на вашем индексе conf
index lol { source = lol path = /var/lib/sphinxsearch/data/lol morphology = none min_word_len = 3 min_prefix_len = 0 min_infix_len = 0 ...
установить min_prefix_len в ноль
и не забудьте снова переоткрыть!