MySQL match () against () - порядок по релевантности и столбцу?

Итак, я пытаюсь сделать полнотекстовый поиск в нескольких столбцах, что-то простое, вроде этого:

SELECT * FROM pages WHERE MATCH(head, body) AGAINST('some words' IN BOOLEAN MODE)

теперь я хочу заказать по релевантности, (сколько слов нашли?) который я смог сделать с чем-то вроде этого:

SELECT * , MATCH (head, body) AGAINST ('some words' IN BOOLEAN MODE) AS relevance 
FROM pages
WHERE MATCH (head, body) AGAINST ('some words' IN BOOLEAN MODE)
ORDER BY relevance

теперь вот часть, где я теряюсь, я хочу определить приоритет релевантности в

4 ответов


этой может дайте повышенную актуальность головной части, которую вы хотите. Это не удвоит его, но это, возможно, достаточно хорошо для вас:

SELECT pages.*,
       MATCH (head, body) AGAINST ('some words') AS relevance,
       MATCH (head) AGAINST ('some words') AS title_relevance
FROM pages
WHERE MATCH (head, body) AGAINST ('some words')
ORDER BY title_relevance DESC, relevance DESC

-- alternatively:
ORDER BY title_relevance + relevance DESC

альтернативой, которую вы также хотите исследовать, если у вас есть гибкость для переключения DB engine, является Postgres. Это позволяет устанавливать вес операторов и играть с ранжированием.


Я никогда этого не делал, но кажется, что

MATCH (head, head, body) AGAINST ('some words' IN BOOLEAN MODE)

должны дайте двойной вес спичкам, найденным в голове.


просто прочитайте этот комментарий на документы-страницы, подумал, что это может быть полезным для вас:

опубликовано Patrick O'Lone декабрь 9 2002 6:51 прибыли пожарные караулы

это следует отметить в документация, которая в логическом режиме почти всегда возвращают значение из 1.0. В чтобы получить значение это имеет смысл, вам нужно:

SELECT MATCH('Content') AGAINST ('keyword1 keyword2') as Relevance 
FROM table 
WHERE MATCH ('Content') AGAINST('+keyword1+keyword2' IN BOOLEAN MODE) 
HAVING Relevance > 0.2 
ORDER BY Relevance DESC 

обратите внимание, что вы выполнение регулярного запроса релевантности к получить факторы релевантности в сочетании с предложение WHERE, использующее логический режим. Логический режим дает подмножество что соответствует требованиям Логический поиск, запрос релевантности выполняет фактор релевантности, и Предложение HAVING (в этом случае) гарантирует что документ имеет отношение к поиск (т. е. документы, которые забивают меньше чем 0,2 считаются неуместными). Это также позволяет вам получить заказ актуальность.

это может или может не быть жуком в пути, что в Логический режим работает, хотя комментарии я читал в списке рассылки предположим, что в логическом режиме релевантности не очень сложно, что само кредитование плохо за предоставление соответствующих документы. Кстати-я не заметил потеря производительности для этого, так как похоже MySQL выполняет только Полнотекстовый поиск один раз, хотя два предложения совпадения различны. Использовать Объясните, чтобы доказать это.

поэтому, похоже, вам не нужно беспокоиться о вызове полнотекстового поиска дважды, хотя вы все равно должны "использовать EXPLAIN чтобы доказать это"


просто добавление для тех, кто может понадобиться.. Не забудьте поменять стол!

ALTER TABLE table_name ADD FULLTEXT(column_name);

Я просто играл с этим тоже. Один из способов добавить дополнительный вес находится в порядке по области кода.

например, если вы сопоставляли 3 разных столбца и хотели более сильно весить определенные столбцы:

SELECT search.*,
MATCH (name) AGAINST ('black' IN BOOLEAN MODE) AS name_match,
MATCH (keywords) AGAINST ('black' IN BOOLEAN MODE) AS keyword_match,
MATCH (description) AGAINST ('black' IN BOOLEAN MODE) AS description_match
FROM search
WHERE MATCH (name, keywords, description) AGAINST ('black' IN BOOLEAN MODE)
ORDER BY (name_match * 3  + keyword_match * 2  + description_match) DESC LIMIT 0,100;