Автозаполнение с полнотекстовым поиском MySQL, который предлагает слова вместо результатов - PullRequest
0 голосов
/ 08 февраля 2019

Существует много вопросов относительно полнотекстового поиска с помощью MySQL, и я прочитал множество из них, не найдя того, что ищу (в google или stackoverflow).

Я не ищу совпадения строк (илидокументы), но я ищу совпадения слов, содержащихся в строках.

Например, представьте, что у вас есть таблица компаний с идентификатором, именем и столбцом small_description.Вы можете найти строки вроде:

1 | MyBaker | fine bakery since 1920
2 | Bakery factory | all the materials for a bakery
etc...

сейчас, когда пользователь вводит «bak», я хотел бы предложить ему слово «пекарня» (и я не хочу прямо предлагать ему MyBaker и Bakery factory.поскольку есть сотни компаний, которые будут соответствовать, но только несколько разных слов)

Я думаю, что базовый полнотекстовый движок mySQL уже имеет своего рода «поиск слов», поэтому я бы хотелиспользуйте это вместо самого анализа имени и small_description для воссоздания другой таблицы со словом |nb_occurences

(не говоря уже о том, что может быть трудно поддерживать синхронизацию, если в другой таблице выполняется много обновлений для уменьшения счетчиков :()

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

Например, amazon (.fr) выполняет довольно ужасную работу. Если вы наберете "tel", он предложитдюжина «телефонных» совпадений и 0 «телевидения», «телескопа» или «телеметрии» ...!

, хотя на настольном компьютере, где ввод полного слова происходит быстро, это не проблема, для мобильных устройств это действительнопроблема

, которая усугубляется тем фактом, что некоторые слова, предложенные клавиатурой смартфона, отсутствуют в моей базе данных И что некоторые слова моей базы данных никогда не предлагаются клавиатурой смартфона.

для примераВ моей базе данных 0 телефонов и телевидения, но много телеметрии и телеконференций

наконец, я также хотел бы простить плохое написание, если это возможно (например:телме должна соответствовать телеметрии)

Я надеюсь, что кто-то может помочь мне использовать существующий полнотекстовый индекс для достижения моей цели

1 Ответ

0 голосов
/ 08 февраля 2019

Поиск FULLTEXT находит строки данных, соответствующие слову или словам, которые вы ему представляете.Как вы знаете, это не просто поиск по словам.

Вы можете в своей серверной программе взять результаты своего поиска FULLTEXT, разбить его на слова и рассмотреть наиболее часто встречающиеся из этих слов.для автозаполнения.Это может хорошо работать, если вы изменили результаты поиска, используя WITH QUERY EXPANSION.

(Имейте в виду, что поиск FULLTEXT на естественном языке работает странно с небольшими наборами данных для поиска, поэтому тестируйте с таблицей, состоящей из нескольких строк, а не только нескольких.)

Но FULLTEXT делаетнеправильно обрабатывает основание (chateau + chateaux - chat) и не предлагает исправления орфографических ошибок.

Вы можете использовать Apache Lucene для своих целей, но это большая и сложная система.

Я думаю, что вам нужна таблица word / nb_appearances, которая неприхотлива в обслуживании.Это даст вам возможность сделать

    SELECT word 
      FROM words
      WHERE word LIKE CONCAT(:input,'%')
     ORDER BY nb_appearances DESC;

, чтобы получить частичные совпадения слов.FULLTEXT не может этого сделать.Вы также можете добавить вторую таблицу поиска для исправления типичных ошибок в вашей области приложения, например, telmetry -> telemetry.Конечно, это боль в шее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...