Как повысить точность полнотекстового MySQL? - PullRequest
3 голосов
/ 26 октября 2010

Я выполняю простой полнотекстовый запрос mysql, который ищет пользователей на моем сайте на основе их «отображаемого имени». Пример запроса приведен ниже - в этом примере мы ищем «магазин игрушек lancaster»:

SELECT MATCH(`display_name`) AGAINST ('lancaster toy store') as `rel`
WHERE MATCH(`display_name`) AGAINST ('lancaster toy store')
ORDER BY `rel` DESC

Это хорошо работает в том смысле, что оно приводит к хорошему количеству результатов, но пример результатов будет:

  1. магазин игрушек Шарлотта
  2. магазин игрушек на Бродвее
  3. Аризона магазины игрушек
  4. магазин игрушек Ланкастер
  5. игрушки восточного побережья

Как вы видите, моя проблема в том, что люди ищут «магазин игрушек Lancaster», и очевидный лучший результат приближается к середине или дну.

Я также использую технику портера-стеммера.

Есть идеи, как получить более точные результаты?

UPDATE

Вот реальный запрос (фактический термин поиска - «восстановление lancaster»):

SELECT `id`,
       MATCH (`display_name`) AGAINST ('lancast* restor*' IN BOOLEAN MODE)
           AS `RELEVANCY`
FROM `users`
WHERE `status` = 'active'
&& MATCH (`display_name`) AGAINST ('lancast* restor*' IN BOOLEAN MODE)
ORDER BY `RELEVANCY` DESC
LIMIT 25

и вот результаты:

  1. Место обитания человечества округа Ориндж - магазины
  2. Восстановить 15 Четвертая улица Дувр NH
  3. Моррис Хабитат для восстановления человечества
  4. Хабитат ReStore Лима Огайо
  5. Место обитания Человечества Шарлотта ReStore
  6. Восстановить округ Монтгомери
  7. Место обитания Дейтон Огайо для человечества
  8. Восстановить
  9. Место обитания Ланкастерского района для восстановления человечества

Ответы [ 6 ]

2 голосов
/ 08 ноября 2010

MySQL имеет мощный текстовый движок, но если вы ищете высокий приоритет поиска, ваша ставка должна быть где-то еще.Если вы используете Lucene, используя API для любого из доступных языков (.NET, PHP с использованием Zend_Search_Lucene и т. Д.), То вы получите всю мощь инфраструктуры, предназначенной для индексации.

Это будет стоить вам времени на разработку, но вы можете сделать смешное количество поисков, используя его.Например, если вы решите хранить описания ваших данных, то выполнение поисковых запросов с помощью mysql приведет к катастрофе, потому что не для этого, а не из-за эффективности Lucene.

Я просто даюмаленький совет здесь!Помните, что интеграция в зрелое приложение функции индексирования должна занять некоторое время, но массив опций, которые вы можете разместить, будет огромным и стоит того.

С уважением, Дэвид

2 голосов
/ 05 ноября 2010

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

MATCH (display_name) 
AGAINST ('lancast* restor* >lancaster >restore' IN BOOLEAN MODE)

или, по крайней мере,

ORDER BY MATCH (display_name) 
AGAINST ('lancast* restor* >lancaster >restore' IN BOOLEAN MODE) DESC
0 голосов
/ 08 ноября 2010

Если получен правильный результат, и все, что вам действительно нужно - это лучший порядок, вы можете пересортировать результаты. В качестве первого варианта, получите распределение частоты слов для вашего корпуса и оцените результаты с редкими совпадениями слов выше.

alt text

Должен также помочь порядок слов. Общий поиск OTOH - это столько же искусство, сколько наука.

0 голосов
/ 06 ноября 2010

Я добавлю альтернативное предложение. Если вы находитесь на ранней стадии, вы можете выбрать Solr - специальную поисковую систему, чтобы не полагаться на возможности полнотекстового поиска в базе данных.

0 голосов
/ 05 ноября 2010

Поскольку вы спрашивали об этом в общих чертах - «Есть идеи, как получить более точные результаты?» - ответ также может быть немного более общим: использовать какой-либо другой механизм полнотекстового поиска вместо встроенного в MySQL. Хорошим примером является поиск Sphinx (http://sphinxsearch.com/),, его легко настроить, легко изучить, он хорошо сочетается с MySQL и предлагает гораздо лучшую скорость и точность.

0 голосов
/ 26 октября 2010

Я не знаю, что такое метод Портера-Стеммера, но, используя ваши примеры данных и запросы со стандартным полнотекстовым индексом MySQL, должен быть возвращен единственный результат:Я заметил, что в вашем примере запроса отсутствует предложение FROM, поэтому я предполагаю, что это не тот запрос, который вы выполняете.Есть что-то еще?Возможно, вы используете BOOLEAN MODE в своем запросе?Если вы используете BOOLEAN MODE, это объяснило бы дополнительные результаты, но результат # 4 должен быть в верхней части списка, так как в нем есть все 3 слова.*

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