Как запросить Sphinx для точного соответствия фразе?

Создается впечатление, что Sphinx ищет в документах слово за словом. Я не знаю, как искать в документах точную фразу. Я пробовал 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 ищет в документах слово за словом...


person Kevin Lee    schedule 24.03.2011    source источник


Ответы (8)


Лучше всего использовать синтаксис SPH_MATCH_EXTENDED2 и заключать запрос в двойные кавычки.

$sphinx->SetMatchMode(SPH_MATCH_EXTENDED2);
$sphinx->Query('"Lorem ipsum dolor"'); 

Расширенный синтаксис

person Iaroslav Vorozhko    schedule 15.11.2011
comment
SetMatchMode() устарела. Вы должны переписать свои запросы, чтобы использовать расширенный синтаксис для того же эффекта. - person cosmix; 21.04.2015

использовать:

$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, плюс поддержка ранжирования и поиска кворума.

person Faraona    schedule 24.03.2011

В настоящее время я нашел лучший способ сделать это с помощью модификаторов ^$.

Если вы посмотрите здесь: Расширенный синтаксис Sphinx, вы увидите, что вы можете выполнить сопоставление похоже на что-то вроде:

^Exact String$

Это должно помочь решить проблему.

person Petrogad    schedule 03.12.2012

Я знаю, что опаздываю на вечеринку, но что происходит, когда вы выполняете поиск из командной строки?

sphinx/bin/search -i indexName Lorem ipsum -e2

-e2 является расширенным режимом совпадения 2.

Также не забудьте переиндексировать индексы sphinx:

sphinx/bin/indexer --rotate --config sphinx/etc/sphinx.conf --all

И убедитесь, что searchd запущен.

person kakubei    schedule 15.11.2011

Я думаю, это лучший способ...
1. использовать режим extended2
и
2. использовать синтаксис следующим образом -> (начало поля и конец поля) && двойные кавычки

Например

$sphinx->SetMatchMode(SPH_MATCH_EXTENDED2);
$sphinx->Query('(^Lorem ipsum dolor$ "Lorem ipsum dolor")'); 
person user2219620    schedule 28.03.2013

Лучшее решение, которое у меня есть, это:

$searchTemplate = '@(%s) "^%s$" | "^%s" | "%s" | (%s)';
$sqlToSearch .= sprintf($searchTemplate, 
        "part_name", //Index to search in
        trim($stringToSearch),
        trim($stringToSearch),
        trim($stringToSearch),
        trim($stringToSearch));

В этом случае точное совпадение будет первым.

person user1025280    schedule 01.06.2013

Я считаю, что вы видите статистику, которая возвращается вместе с результатами поиска. Когда sphinx завершает работу, он возвращает статистику о том, где были найдены слова, чтобы вы могли при необходимости скорректировать свой поиск. Чтобы проверить, вы должны выполнить поиск, который возвращает результаты. Вы также должны провести некоторое тестирование на тестовом индексе, где вы знаете, какие результаты будут для любого конкретного поиска.

person Kibbee    schedule 24.03.2011
comment
Да, я сейчас проверяю свои документы. я хочу точно сопоставить мою строку с полем имени в базе данных... но массив возвращает total=>0, даже если у меня есть эта строка в документе.. - person Kevin Lee; 24.03.2011
comment
Я предполагаю, что он не находит его вообще. Вы должны попробовать простой поиск, чтобы убедиться, что данные правильно проиндексированы. Возможно, попробуйте функции поиска в командной строке, чтобы убедиться, что у вас нет проблем с PHP. - person Kibbee; 24.03.2011

если вы пробовали все вышеперечисленное и ничего не получилось, проверьте эти параметры в вашем файле sphinx.conf, в вашем index 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 нулевое значение

и не забудьте снова переиндексировать!!

person jacktrade    schedule 21.07.2014