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.