Думаешь о нечетком поиске в sphinx?

#sphinx #thinking-sphinx

#сфинкс #мышление-сфинкс

Вопрос:

Я внедряю поиск в sphinx в своем приложении rails.
Я хочу выполнить поиск с включенным fuzzy. Он должен искать орфографические ошибки, например, если ввести поисковый запрос charact * a * ristics, он должен искать charact * e * ristics.

Как я должен это реализовать

Ответ №1:

Sphinx, естественно, не допускает орфографических ошибок — ему все равно, правильно написаны слова или нет, он просто индексирует их и сопоставляет.

Есть два варианта решения этой проблемы — либо использовать thinking-sphinx-raspell для обнаружения орфографических ошибок пользователями при поиске и предложить им на выбор повторный поиск с улучшенным запросом (очень похоже на Google); или, возможно, использовать морфологии soundex или metaphone, чтобы слова индексировались таким образом, чтобы учитывалось, как они звучат. Поищи на этой странице, что касается stemming, ты найдешь соответствующий раздел. Также ознакомьтесь с документацией Sphinx по этому вопросу.

Я понятия не имею, насколько надежным был бы любой из вариантов — лично я бы выбрал # 1.

Комментарии:

1. Спасибо, Пэт, я думал использовать raspell, но он не соответствует моим требованиям. Я читаю содержимое электронной почты и ищу возможные названия продуктов, заказанных по электронной почте. У меня нет способа предложить пользователю исправленные параметры. А с raspell случается, что он заменяет некоторые сокращенные названия на нерелевантные альтернативы, например led (СИД) заменен на lid. Пробовал также с soundex и metaphone, это улучшило результаты для меня, но не точно.

Ответ №2:

По умолчанию Sphinx не обращает никакого внимания на поиск по шаблону с использованием символа звездочки. Вы можете включить его, хотя:

 development:
  enable_star: true
  # ... repeat for other environments
  

Видишь http://pat.github.io/thinking-sphinx/advanced_config.html Раздел синтаксиса подстановочных знаков / звездочек.

Ответ №3:

Да, Sphinx обычно всегда использует расширенные режимы сопоставления.

Доступны следующие режимы сопоставления:

 SPH_MATCH_ALL, matches all query words (default mode);
SPH_MATCH_ANY, matches any of the query words;
SPH_MATCH_PHRASE, matches query as a phrase, requiring perfect match;
SPH_MATCH_BOOLEAN, matches query as a boolean expression (see Section 5.2, “Boolean query syntax”);
SPH_MATCH_EXTENDED, matches query as an expression in Sphinx internal query language (see Section 5.3, “Extended query syntax”);
SPH_MATCH_EXTENDED2, an alias for SPH_MATCH_EXTENDED;
SPH_MATCH_FULLSCAN, matches query, forcibly using the "full scan" mode as below. NB, any query terms will be ignored, such that filters, filter-ranges and grouping will still be applied, but no text-matching.
  

SPH_MATCH_EXTENDED2 использовался во время цикла разработки 0.9.8 и 0.9.9, когда переписывался внутренний механизм сопоставления (ради дополнительной функциональности и лучшей производительности). В версии 0.9.9 более старая версия была удалена, и SPH_MATCH_EXTENDED и SPH_MATCH_EXTENDED2 теперь просто псевдонимы.

enable_star

Включает звездообразный синтаксис (или синтаксис подстановочных знаков) при поиске по префиксным / инфиксным индексам. >Необязательно, значение по умолчанию равно 0 (не используйте синтаксис подстановочных знаков), для совместимости с 0.9.7. > Известные значения — 0 и 1.

Например, предположим, что индекс был построен с использованием инфиксов и что значение enable_star равно 1. Поиск должен работать следующим образом:

 "abcdef" query will match only those documents that contain the exact "abcdef" word in them.
"abc*" query will match those documents that contain any words starting with "abc" (including the documents which contain the exact "abc" word only);
"*cde*" query will match those documents that contain any words which have "cde" characters in any part of the word (including the documents which contain the exact "cde" word only).
"*def" query will match those documents that contain any words ending with "def" (including the documents that contain the exact "def" word only).
  

Пример:

enable_star = 1