Хорошо, поэтому я пытаюсь выполнить полнотекстовый поиск в нескольких столбцах, примерно так:
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 в локальном тестировании)
источник
Ответы:
Это может повысить актуальность той части головы, которую вы хотите. Это не удвоит его, но, возможно, этого будет достаточно для вас:
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 . Это позволяет установить вес операторов и поэкспериментировать с рейтингом.
источник
MATCH
операторов не требует дополнительных затрат из-за того, как MySQL работает внутренне.ALTER TABLE talk_webpages ADD FULLTEXT(head)
иALTER TABLE talk_webpages ADD FULLTEXT(head, body)
Просто добавление для тех, кому может понадобиться ... Не забудьте изменить таблицу!
ALTER TABLE table_name ADD FULLTEXT(column_name);
источник
TABLE_CATALOG
= 'def' ANDTABLE_SCHEMA
= DATABASE () ANDTABLE_NAME
= 'tablename' ANDINDEX_NAME
= 'indexname';Я никогда этого не делал, но похоже
Должны придавать двойной вес спичкам, найденным в голове.
Просто прочтите этот комментарий на странице документации , подумав, что это может быть полезно для вас:
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
Таким образом, может показаться, что вам не нужно беспокоиться о двойном вызове полнотекстового поиска, хотя вам все равно следует «использовать EXPLAIN, чтобы доказать это»
источник
Я тоже просто играл с этим. Один из способов добавить лишний вес - в области кода 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;
источник
SELECT search.*, (MATCH (name) AGAINST ('black' IN BOOLEAN MODE) * 3) + (MATCH (keywords) AGAINST ('black' IN BOOLEAN MODE)*2 + MATCH (description) AGAINST ('black' IN BOOLEAN MODE)) AS totalScore , FROM search WHERE MATCH (name, keywords, description) AGAINST ('black' IN BOOLEAN MODE) ORDER BY totalScore DESC LIMIT 0,100;