MySQL-эффективный поиск с частичным совпадением слов и оценкой релевантности (FULLTEXT)

как я могу выполнить поиск MySQL, который будет соответствовать частичным словам, но также обеспечит точную сортировку релевантности?

SELECT name, MATCH(name) AGAINST ('math*' IN BOOLEAN MODE) AS relevance
FROM subjects
WHERE MATCH(name) AGAINST ('math*' IN BOOLEAN MODE)

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

Если я ищу в режиме естественного языка, я понимаю, что оценка релевантности полезна, но я не могу совпадение частичных слов.

есть ли способ выполнить запрос, который удовлетворяет всем этим критериям:

  • может соответствовать частичным словам
  • результаты возвращаются с точной релевантности
  • эффективно

лучшее, что у меня есть до сих пор:

SELECT name
FROM subjects
WHERE name LIKE 'mat%'
UNION ALL
SELECT name
FROM subjects
WHERE name LIKE '%mat%' AND name NOT LIKE 'mat%'

но я бы предпочел не использовать LIKE.

2 ответов


новая функция полнотекстового поиска InnoDB в MySQL 5.6 помогает в этом случае. Я использую следующий запрос:

SELECT MATCH(column) AGAINST('(word1* word2*) ("word1 word1")' IN BOOLEAN MODE) score, id, column 
FROM table
having score>0
ORDER BY score 
DESC limit 10;

здесь ( ) группирует слова в подвыражение. Первая группа имеет like word% значение; второй ищет точную фразу. Оценка возвращается как float.


Я получил хорошее решение в этом (несколько) вопрос dupliate год спустя:

MySQL-как получить результаты поиска с точной релевантностью