Mysql Матч против рейтинга

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

Я хочу оценить запрос как этот:

  1. [запрос] %
  2. [Запрос] %
  3. % [запрос] %
  4. % [Запрос] %

Сейчас я использую

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 приводит к неожиданному ранжированию; Зачем?

Другие вопросы по тегам