#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