MySQL match() против() - порядок по релевантности и столбцу?
Хорошо, поэтому я пытаюсь выполнить полный текстовый поиск в нескольких столбцах, что-то простое:
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 в локальном тестировании)
Ответы
Ответ 1
Это может привести к большей значимости для требуемой части головы. Он не будет удваивать его, но он может быть достаточно хорошим для вас:
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. Он позволяет установить вес операторов и поиграть с ранжированием.
Ответ 2
Я никогда не делал этого, но кажется, что
MATCH (head, head, body) AGAINST ('some words' IN BOOLEAN MODE)
Должен дать двойной вес совпадениям, найденным в голове.
Просто прочитайте этот комментарий на странице docs, подумал, что это может быть полезно для вас:
Отправленный Патриком О'Лелоном 9 декабря 2002 6:51 утра
Следует отметить, что документация, что в BOOLEAN MODE почти всегда будут возвращать релевантность 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 считаются неактуальными). Это также позволяет вам заказывать актуальность.
Это может или может не будет ошибкой в том, что IN BOOLEAN MODE работает, хотя комментарии, которые я прочитал в списке рассылки предположим, что в BOOLEAN MODE рейтинг релевантности не очень сложный, таким образом, кредитование плохо для фактического предоставления соответствующих документы. BTW - я не заметил потери производительности для этого, поскольку похоже, MySQL выполняет только FULLTEXT один раз, хотя два предложения MATCH отличаются. использование EXPLAIN, чтобы доказать это.
Таким образом, вам может не понадобиться беспокоиться о вызове полнотекстового поиска дважды, хотя вы все равно должны "использовать EXPLAIN, чтобы доказать это"
Ответ 3
Просто добавьте, кто может понадобиться. Не забудьте изменить таблицу!
ALTER TABLE table_name ADD FULLTEXT(column_name);
Ответ 4
Я тоже играл с этим. Один из способов добавить лишний вес - в поле 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;