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 65

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)

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


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

Posted by Patrick O'Lone on December 9 2002 6: 51am

следует отметить, что документация, которая в логическом режиме почти всегда будет возвращать актуальность из 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, которое использует логический режим. Логический режим дает вам подмножество что соответствует требованиям Логический поиск, запрос релевантности выполняет фактор уместности, и Наличие оговорки (в данном случае) обеспечивает что данный документ имеет отношение к поиск (т. е. документы, которые забивают меньше чем 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;