Создайте три полнотекстовых индекса
- а) один в столбце ключевых слов
- б) один в столбце контента
- c) по одному столбцу ключевого слова и содержания
Затем ваш запрос:
SELECT id, keyword, content,
MATCH (keyword) AGAINST ('watermelon') AS rel1,
MATCH (content) AGAINST ('watermelon') AS rel2
FROM table
WHERE MATCH (keyword,content) AGAINST ('watermelon')
ORDER BY (rel1*1.5)+(rel2) DESC
Дело в том, что rel1
дает вам релевантность вашего запроса только в столбце keyword
(поскольку вы создали индекс только для этого столбца). rel2
делает то же самое, но для столбца content
. Теперь вы можете сложить эти две оценки релевантности вместе, применив любой вес, который вам нравится.
Однако вы не используете ни один из этих двух индексов для фактического поиска. Для этого вы используете свой третий индекс, который находится в обоих столбцах.
Индекс на (ключевое слово, содержание) контролирует ваш отзыв. Ака, что возвращается.
Два отдельных индекса (один только по ключевым словам, один только по содержанию) контролируют вашу релевантность. И вы можете применить свои собственные критерии взвешивания здесь.
Обратите внимание, что вы можете использовать любое количество различных индексов (или изменять индексы и веса, которые вы используете во время запроса, возможно, на основе других факторов ... только поиск по ключевому слову, если запрос содержит стоп-слово ... уменьшите смещение веса для ключевые слова, если запрос содержит более 3 слов... и т.д.).
Каждый индекс занимает место на диске, поэтому чем больше индексов, тем больше диск. И, в свою очередь, больший объем памяти для mysql. Кроме того, вставки будут занимать больше времени, так как вам нужно обновить больше индексов.
Вы должны оценить производительность (стараясь отключить кеш запросов mysql для сравнения, иначе ваши результаты будут искажены) для вашей ситуации. Это неэффективно для Google, но это довольно просто и «нестандартно», и это почти наверняка намного лучше, чем использование вами «нравится» в запросах.
Я считаю, что это работает очень хорошо.
person
mintywalker
schedule
02.03.2009