MySQL Полнотекстовый поиск Mystery - PullRequest
4 голосов
/ 30 января 2011

У нас есть простой поиск на нашем сайте, который использует полнотекстовый поиск MySQL, и по некоторым причинам он, похоже, не возвращает правильные результаты.Я не знаю, является ли это какой-то проблемой с Amazon RDS (где находится наш сервер баз данных) или с запросом, который мы запрашиваем.

Вот структура таблицы базы данных:

CREATE TABLE `items` (
  `object_id` int(9) unsigned NOT NULL DEFAULT '0',
  `slug` varchar(100) DEFAULT NULL,
  `name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`object_id`),
  FULLTEXT KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

А вот простой запрос полнотекстового поиска по этой таблице и возвращенные результаты:

select object_id ,slug,name from items where MATCH (name) AGAINST ('+ski*' IN BOOLEAN MODE) order by name;

+-----------+-----------------------------------+------------------+
| object_id | slug                              | name             |
+-----------+-----------------------------------+------------------+
|  10146041 | us/new-hampshire/dartmouth-skiway | Dartmouth Skiway |
+-----------+-----------------------------------+------------------+

ЕслиВместо этого я использую LIKE и получаю другой набор результатов:

select object_id,slug,name from items where name LIKE "%ski%" order by name;

+-----------+------------------------------------------+----------------------------------+
| object_id | slug                                     | name                             |
+-----------+------------------------------------------+----------------------------------+
|  10146546 | us/new-york/brantling-ski                | Brantling Ski                    |
|  10146548 | us/new-york/buffalo-ski-club             | Buffalo Ski Club                 |
|  10146041 | us/new-hampshire/dartmouth-skiway        | Dartmouth Skiway                 |
|  10146352 | us/montana/discover-ski                  | Discover Ski                     |
|  10144882 | us/california/donner-ski-ranch           | Donner Ski Ranch                 |
|  10146970 | us/new-york/hickory-ski-center           | Hickory Ski Center               |
|  10146973 | us/new-york/holimont-ski-area            | Holimont Ski Area                |
|  10146283 | us/minnesota/hyland-ski                  | Hyland Ski                       |
|  10145911 | us/nevada/las-vegas-ski-snowboard-resort | Las Vegas Ski & Snowboard Resort |
|  10146977 | us/new-york/maple-ski-ridge              | Maple Ski Ridge                  |
|  10146774 | us/oregon/mount-hood-ski-bowl            | Mt. Hood Ski Bowl                |
|  10145949 | us/new-mexico/sipapu-ski                 | Sipapu Ski                       |
|  10145952 | us/new-mexico/ski-apache                 | Ski Apache                       |
|  10146584 | us/north-carolina/ski-beech              | Ski Beech                        |
|  10147973 | canada/quebec/ski-bromont                | Ski Bromont                      |
|  10146106 | us/michigan/ski-brule                    | Ski Brule                        |
|  10145597 | us/massachusetts/ski-butternut           | Ski Butternut                    |
|  10145117 | us/colorado/ski-cooper                   | Ski Cooper                       |
|  10146917 | us/pennsylvania/ski-denton               | Ski Denton                       |
|  10145954 | us/new-mexico/ski-santa-fe               | Ski Santa Fe                     |
|  10146918 | us/pennsylvania/ski-sawmill              | Ski Sawmill                      |
|  10145299 | us/illinois/ski-snowstar                 | Ski Snowstar                     |
|  10145138 | us/connecticut/ski-sundown               | Ski Sundown                      |
|  10145598 | us/massachusetts/ski-ward                | Ski Ward                         |
+-----------+------------------------------------------+----------------------------------+

Я совершенно не понимаю, почему запрос с использованием полнотекстового поиска не работает.Я надеюсь, что некоторые эксперты MySQL там могут указать на ошибку в нашем запросе.

Заранее спасибо за вашу помощь!

Ответы [ 2 ]

5 голосов
/ 30 января 2011

С Документы MySQL

  • + Знак "плюс" означает, что это слово должно присутствовать в каждой возвращаемой строке.

  • * Звездочка служит оператором усечения (или подстановочного знака).В отличие от других операторов, он должен быть добавлен к слову, которое будет затронуто.Слова совпадают, если они начинаются со слова, предшествующего оператору *.

    Если слово указано с помощью оператора усечения, оно не удаляется из логического запроса, даже если оно слишком короткое (как определено из ft_min_word_lenнастройка) или стоп-слово.Это происходит потому, что слово не рассматривается как слишком короткое или стоп-слово , а как префикс, который должен присутствовать в документе в форме слова, начинающегося с префикса .

В контексте:

MATCH (...) ПРОТИВ (...)

MATCH (name) AGAINST ('+ski*' IN BOOLEAN MODE) означает, чтоВы ищете строки, в которых слово в столбце name должно содержать ski, а должно начинаться со слова ski.

FromDartmouth Skiway - это единственный name, соответствующий этим требованиям: он содержит слово ski и начинается с префикса ski.

Другие столбцы name, хотя они соответствуют первому правилу: должны содержать ski, они не имеют префикса с ski, как указано вваше правило.Строка, возвращаемая вашим логическим поиском, является единственной строкой со столбцом name, который содержит слово, которое содержит ski и является словом с префиксом на ski.

Как подсказывает ajreal, попробуйте уменьшить ft_min_len_word_setting на my.cnf.Ваш поиск может не дать ожидаемых результатов из-за настройки по умолчанию.Попробуйте уменьшить его до 3.

WHERE LIKE LIKE% text%

WHERE name LIKE "%ski%" ищет строки с name столбцами, содержащими ski, независимо от того, гдеслово встречается.

1 голос
/ 30 января 2011

Минимальная и максимальная длина индексируемых слов определяется системными переменными ft_min_word_len и ft_max_word_len. (См. Раздел 5.1.4, «Системные переменные сервера».) Минимальное значение по умолчанию составляет четыре символа; максимум по умолчанию зависит от версии. Если вы измените какое-либо значение, вы должны перестроить свои индексы FULLTEXT. Например, если вы хотите, чтобы трехсимвольные слова были доступны для поиска, вы можете установить переменную ft_min_word_len, поместив в файл опций следующие строки:

ресурс - http://dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html

конфигурация:

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