Создание трех полнотекстовых индексов
- а) один в столбце ключевых слов
- б) один в столбце содержимого
- в) по одному на ключевое слово и на столбец содержания
Тогда ваш запрос:
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, но это довольно просто и "из коробки", и это почти наверняка намного лучше, чем использование "лайка" в запросах.
Я считаю, что это работает очень хорошо.