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-как получить результаты поиска с точной релевантностью