MySQL match () против () - порядок по релевантности и столбцу? - PullRequest
71 голосов
/ 07 июня 2011

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

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

Теперь наступает момент, когда я теряюсь, я хочу расставить приоритеты в столбце head.

Полагаю, я мог бы сделать два столбца релевантности, один для head и один для body, но в этот момент я бы несколько раз выполнил один и тот же поиск в таблице, и для того, что я делаю Для этой функции важна производительность, поскольку запрос будет объединен и сопоставлен с другими таблицами.

Итак, мой главный вопрос , есть ли более быстрый способ поиска релевантности и расстановки приоритетов для определенных столбцов? (И в качестве бонуса возможно даже сделать подсчет релевантности числом раз, когда слова встречаются в столбцах?)

Любые предложения или советы будут великолепны.

Примечание: Я буду запускать это на LAMP-сервере. (WAMP в локальном тестировании)

Ответы [ 4 ]

145 голосов
/ 10 июня 2011

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

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

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

11 голосов
/ 18 января 2013

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

ALTER TABLE table_name ADD FULLTEXT(column_name);
9 голосов
/ 07 июня 2011

Я никогда не делал этого, но, похоже,

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

Если придать двойной вес совпадениям, найденным в голове.


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

Автор: Патрик О'Лон, 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, которое использует BOOLEAN MODE. BOOLEAN MODE дает вам подмножество который отвечает требованиям BOOLEAN поиск, запрос актуальности выполняет фактор релевантности, а Предложение HAVING (в данном случае) обеспечивает что документ имеет отношение к поиск (то есть документы, которые набрали меньше чем 0,2 считаются неактуальными). Это также позволяет вам заказать актуальность.

Это может или может не быть ошибкой в ​​том, что в BOOLEAN MODE работает, хотя комментарии, которые я прочитал в списке рассылки предположить, что в булевом режиме релевантность рейтинга не очень сложный, таким образом, предоставляя себя плохо для фактического предоставления соответствующих документы. Кстати - я не заметил потеря производительности для этого, так как похоже, MySQL выполняет только ПОЛНЫЙ ТЕКСТ искать один раз, хотя два предложения MATCH разные. использование Объясните, чтобы доказать это.

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

3 голосов
/ 19 февраля 2013

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

Например, если вы сопоставляете 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...