Сфинкс и "ты имел ввиду ...?" идея предложения. Это будет работать? - PullRequest
5 голосов
/ 14 февраля 2011

Я пытаюсь найти самый быстрый способ поиска предложений.Сначала я думал, что функция UDF Левенштейна в сочетании с таблицей mysql сделает эту работу.Но используя levenshtein, mysql должен был бы пройтись по каждой строке таблицы (тонны слов), что сделало бы запрос очень медленным.

Теперь я недавно установил и начал использовать Sphinx (http://sphinxsearch.com/) для полнотекстового поискаглавным образом из-за его производительности и тесной интеграции mysql со SphinxSE.

Поэтому я спросил себя, могу ли я реализовать алгоритм «Вы имели в виду», использующий sphinx для повышения производительности, и я думаю, что нашел простой.Я беру все ключевые слова, которые хочу исправить, вставляю пробел между каждой буквой, затем помещаю его в индекс сфинкса. Если слово «ключевое слово», оно становится «keywor d». Теперь, когда пользователь вводит слово, я разделяю его нана буквы и поиск в индексе сфинкса для записи (мне просто нужна), которая соответствует любой из предоставленных букв. Лучшая часть заключается в том, что сфинкс очень хорош при расчете релевантности (веса) совпадающих строк, поэтому лучшее совпадение будетвсегда имеют наибольший вес (я думаю). Это также учитывает слова (буквы в моем случае) позициипоэтому наилучшее совпадение будет в таком порядке.

С помощью запроса сфинкса я получаю самое похожее слово в списке ключевых слов.Затем я проверяю это с помощью php, используя увеличенное расстояние Левенштейна, которое учитывает переставленные буквы http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance.Если расстояние до строки меньше 2 (и! = 0), предложите слово.В противном случае ничего не предлагайте.

Есть ли проблема с моей идеей?Что-то, о чем я не думал?Есть ли какие-либо ожидаемые сбои в запросе сфинкса и измышления при расчете релевантности сфинкса, которые не дают наилучшего совпадения?Пожалуйста, поправьте меня, если я где-то ошибаюсь.

Ответы [ 3 ]

3 голосов
/ 23 февраля 2011

Я не вижу проблемы с твоей идеей.Действуй.Просто отметим, что ваш метод уместен только в том случае, если вы хотите переопределить встроенное поведение, очень похожее на LD.

Например, для sphinx 1.10-beta вы можете указать min_infix_len и expand_keywords и использовать встроенный sphinxметоды взвешивания (BM25 и некоторый проприетарный код) для хороших результатов.http://sphinxsearch.com/blog/2010/08/17/how-sphinx-relevance-ranking-works/

Не забудьте запоминать эти запросы и создавать сценарий разминки.

0 голосов
/ 08 июня 2012

Вы можете просто регистрировать каждый введенный поисковый запрос вместе со следующим поисковым запросом, который вводит пользователь.

Предположим, что многие пользователи ищут носорогов, но на самом деле имеют в виду носорогов. Поскольку пользователи будут корректировать свой запрос, это будет означать, что в качестве следующего запроса будет много запросов на носорогов с носорогом.

Вы можете выбрать такие предложения:

SELECT id, query, next_query, COUNT(id) AS count FROM queries GROUP BY query ORDER BY COUNT(id) DESC

Если верхний результат имеет значение count, что составляет высокий процент всех запросов по этому ключевому слову, отобразить сообщение.

Я не проверял это, это просто идея.

0 голосов
/ 15 февраля 2011

Думаю, вам будет интересно прочитать, что Эндрю Аксёнов (автор Sphinx) думает о реализации этой задачи через Sphinx - http://habrahabr.ru/blogs/sphinx/61807/ (используйте переводчик для перевода с русского)

...