Mysql Матч против рейтинга
В настоящее время я использую запрос для автозаполнения поле с как. Однако я хочу использовать совпадение, против которого должно быть быстрее, но я сталкиваюсь с некоторыми проблемами с сортировкой.
Я хочу оценить запрос как этот:
- [запрос] %
- [Запрос] %
- % [запрос] %
- % [Запрос] %
Сейчас я использую
SELECT * FROM table
WHERE name LIKE '%query%'
ORDER BY (case
WHEN name LIKE 'query %' THEN 1
WHEN name LIKE 'query%' THEN 2
WHEN name LIKE '% query%' THEN 3
ELSE 4 END) ASC
Когда я использую...
SELECT * FROM table
WHERE MATCH(name) AGAINST('query*' IN BOOLEAN MODE)
... все результаты получают одинаковую "рейтинговую оценку".
Например, поиск Natio
возвращается Pilanesberg National Park
а также National Park Kruger
с тем же счетом, в то время как я хочу второй результат, как первый, потому что он начинается с запроса.
Как мне этого добиться?
1 ответ
У меня была твоя та же проблема, и я должен был подойти к ней по-другому.
Документация MySQL гласит:
Значение частоты (TF) - это количество раз, когда слово встречается в документе. Значение обратной частоты слова (IDF) для слова рассчитывается по следующей формуле: где total_records - это количество записей в собрании, а match_records - количество записей, в которых появляется поисковый запрос.
$ {IDF} = log10 ($ {total_records} / $ {match_records})
Когда документ содержит слово несколько раз, значение IDF умножается на значение TF:
$ {TF} * $ {IDF}
Используя значения TF и IDF, рейтинг релевантности для документа рассчитывается по следующей формуле:
$ {rank} = $ {TF} * $ {IDF} * $ {IDF}
За этим следует пример, в котором объясняется приведенная выше декларация: он ищет слово "база данных" в разных полях и возвращает рейтинг на основе результатов.
В вашем примере слова "Национальный парк Пиланесберг", "Национальный парк Крюгера" будут возвращать тот же ранг против ("Natio " В БУЛЕВОМ РЕЖИМЕ)*, потому что ранг основан не на сходстве здравого смысла слова (или в этом случае вы ожидаете сообщить базе данных, что означает " для вас - " похоже "), но основано на приведенной выше формуле, связанной с частотой.
Также обратите внимание, что на значение частоты влияет тип индекса (InnoDB или MyISAM) и версия MySQL (в более старой версии нельзя использовать полнотекстовые индексы с таблицами InnoDB).
Что касается вашей проблемы, вы можете использовать определяемые пользователем переменные MySQL или функции или процедуры, чтобы оценить ранг на основе вашего представления о ранге. Примеры здесь, здесь или здесь. И здесь тоже.
Смотрите также:
MySQL match () против () - порядок по релевантности и столбцу?
Запрос MYsql FULLTEXT приводит к неожиданному ранжированию; Зачем?