#mysql #search #indexin& #full-text-search #full-text-indexin&
#mysql #Поиск #индексирование #полнотекстовый поиск #полнотекстовое индексирование
Вопрос:
У меня есть таблица с именем столбца с полнотекстовым индексом —
В этой таблице много строк, но некоторые из них содержат фразу «aberlour 18» точно в начале, как здесь —
Но когда я ищу, используя полнотекстовый поиск с точным именем из таблицы —
SELECT * FROM `whiskybase_bottles` WHERE MATCH(`name`) AGAINST('Aberlour 18 year old')
Он находит ее только на 6-м месте —
Как я могу улучшить его, чтобы найти его первым?
Я не хочу использовать поиск «НРАВИТСЯ», потому что полнотекстовый поиск лучше подходит для моих нужд в других случаях.
Я уже уменьшил параметр «innodb ft min token size» до 2 вместо 3, чтобы включить оператор a&e и воссоздал индекс после него —
Комментарии:
1. Вы перестроили соответствующий индекс FT после изменения ft_min_token_size?
2. Да, как я и писал, я воссоздал ее после изменения
3. Можете ли вы предоставить нам простой тестовый пример для работы? Всего несколько десятков строк со столбцом
id
иname
. Пожалуйста, убедитесь, что тест завершен с ошибкой.
Ответ №1:
Если вы пытаетесь найти строки, в названии которых есть «Aberlour 18 year old», но не обязательно полное имя, вы можете использовать оператор , который используется для логического полнотекстового поиска. Без оператора ваш запрос выполняет поиск фраз, которые точно соответствуют запросу, и не выбирает фразы, содержащие другие слова и символы, как вы хотите. Ваш код будет выглядеть примерно так:
SELECT *
FROM `whiskybase_bottles`
WHERE MATCH(`name`) AGAINST(' "Aberlour 18 year old"' IN BOOLEAN MODE)
Вы можете узнать больше о ЛОГИЧЕСКОМ РЕЖИМЕ и связанных с ним операторах здесь:
https://www.w3resource.com/mysql/mysql-full-text-search-functions.php
Для общего поиска с переменной вы можете сделать что-то вроде этого:
SELECT *
FROM `whiskybase_bottles`
WHERE MATCH(`name`) AGAINST(concat(' "', search_phrase, '"') IN BOOLEAN MODE)
Комментарии:
1. Да, я знаю эту функцию, но в чем причина того, что без нее он не находит ее в первую очередь? В этом решении это будет плохо работать, когда поисковая фраза не является точной… Мне нужно общее решение
2. Он не находит ее, потому что ищет записи, которые точно соответствуют строке, а не записи, которые содержат строку, но содержат больше символов. Знак плюс необходим для поиска строк, которые не являются точными, но содержатся во фразе. Вы также можете поставить знак плюс перед каждым словом, если вы ищете слова во фразе, которые расположены не в точном порядке.
Ответ №2:
Если вы хотите ранжировать точную фразу сверху.
Вместо этого используйте этот код:
SELECT *,MATCH (name) AGAINST( 'Aberlour 18 year old' IN BOOLEAN MODE) as score
FROM `whiskybase_bottles`
WHERE MATCH(`name`) AGAINST('Aberlour 18 year old')
ORDER BY name = 'Aberlour 18 year old' DESC, score DESC