2010-10-26 3 views
3

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

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. восточное побережье игрушки

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

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

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

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. Среда обитания для Человечества Orange County - Резервы
  2. ReStore 15 Fourth Street Dover NH
  3. Моррис Хабитат для человечества ReStore
  4. Habitat ReStore Лима Огайо
  5. Среда обитания для Человечества Шарлотта ReStore
  6. ReStore Montgomery County
  7. Дейтон Огайо Среда обитания для Человечества ReStore
  8. ReStore
  9. Lancaster Область обитания для Восстановление слуха
+1

Я действительно не имеют хороший ответ на свой вопрос, просто хочу указать на то, что вы могли бы хотеть рассмотреть разгружая процесс поискового сервера, как Solr или Сфинкса. Они обрабатывают введенные пользователем запросы намного лучше (и быстрее), чем полный текст mysql. Конечно, есть накладные расходы на настройку сервера поиска - но все же что-то, что нужно учитывать. –

+0

ben, плохо проверить это ... спасибо за предложение – johnnietheblack

ответ

0

Я не знаю, что техника портер парадигматический есть, но с использованием данных выборки и запрос с помощью стандартного индекса полнотекстового MySQL, единственный результат, который должен быть возвращен в # 4:

4. toy store of lancaster 

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

Можете ли вы предоставить свой точный запрос?

+0

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

+0

oh, а porter-stemmer - это алгоритм, который отделяет «ненужные» части от слов ... так что, если вы ищете «игрушки», это не исключает результатов для «игрушек» «... избавьтесь от своих обрезков с« s ». другой пример .... он отключает «johnnie» до «john», так что я не буду забывать;) вы увидите это в обновлении выше: – johnnietheblack

+0

Спасибо за полный запрос. Я вижу, что вы используете логический режим, как я ожидал, поэтому имеет смысл, что ваш поиск возвращает результаты с 1 или более поисковыми словами. Но вы заказываете по релевантности, поэтому результаты с двумя совпадающими словами * должны * быть выше тех, у которых есть только одно подходящее слово. Разве это не происходит? –

0

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

2

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

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

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

0

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

alt text

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

2

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

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

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

С наилучшими пожеланиями, Дэвид

Смежные вопросы