2010-11-13 2 views
1

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

Ниже вы можете увидеть структуру таблицы сверху, с особым вниманием к содержимому тегов для этого тестового продукта.

alt text

Код в тексте упаковывают скриншот слишком мал:

SELECT 
     id, 
     name, 
     description, 
     price, 
     image 
    FROM 
     products 
    WHERE   
     MATCH(tags,name,description) 
     AGAINST ('hot*' IN BOOLEAN MODE) 

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

Однако, если я нахожу поиск «напитка», который является еще одним тегом, он находит продукт!

Я не могу понять, почему!

ответ

4

Если я ищу поиск «горячего», который является одним из тегов, он возвращает 0 результатов.

По умолчанию MySQL не индексирует (и ищет) слова длиной менее 4 символов.

Уменьшите @@ft_min_word_len, если вы хотите проиндексировать их и перестроить индекс.

+2

Как насчет других dbmses? –

+0

И как в сторону, для @AlexCrooks, чтобы проверить это в вашей среде, добавьте «укусить» к поисковым словам и попробуйте еще раз («укусить», представляя собой четырехбуквенное слово, также «розовый», «синий» и т. Д .;]. но таким образом вы можете доказать себе, что это проблема.) – jcolebrand

+0

@meder, читая мой разум, мой второй комментарий должен был быть @Quassnoi ~ Это относится к MSSQL или ORA или Postgresql? – jcolebrand

0

Убедитесь, что «горячий» не stop word (его не стоп-слово по умолчанию, но, возможно, ваша реализация MySQL имеет это по какой-то причине?) И что «горячий» не слишком коротки слова (default ft_min_word_len является 4, поэтому слова, содержащие менее 4 букв, будут игнорироваться, ЕСЛИ они не совпадают с оператором усечения *, поэтому в то время как горячий будет проигнорирован, hott не будет, см.: here)

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