Подтвердить что ты не робот

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 в локальном тестировании)

4b9b3361

Ответ 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;