Ответ 1
Год спустя я нашел хорошее решение в этом (несколько) повторяющемся вопросе:
MySQL - Как получить результаты поиска с точной релевантностью
Как я могу выполнить поиск 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
.
Год спустя я нашел хорошее решение в этом (несколько) повторяющемся вопросе:
MySQL - Как получить результаты поиска с точной релевантностью
Новая функция полнотекстового поиска 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.