在使用 MySQL 的 MATCH() AGAINST() 的全文搜索中,按相关性对结果进行排序很简单。但是,如果您想要优先考虑特定列(例如 head)的相关性,同时仍考虑其他列(例如 body)的相关性,该怎么办?
考虑这个初始查询:
SELECT * FROM pages WHERE MATCH(head, body) AGAINST('some words' IN BOOLEAN MODE)
它对 head 和 body 列执行全文搜索,返回匹配的行。
要按相关性排序,我们可以添加一个计算的column:
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
这引入了一个相关性列,指示每行的整体相关性。但是,它同等对待标题列和正文列。
要优先考虑标题列,一种方法是为其添加一个单独的相关列:
SELECT *, 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
这将创建一个 title_relevance 列这仅代表标题列的相关性。通过首先按 title_relevance 排序,然后按相关性排序,我们对具有高度相关的标题内容的行进行优先级排序。
作为奖励,我们可以修改 ORDER BY 子句以考虑标题中指定单词的出现次数column:
ORDER BY title_relevance + (total_head_words * weight_per_word) DESC
这里,total_head_words 表示单词出现在 head 列中的次数,weight_per_word 是一个乘数,调整它们的重要性。
或者,如果您可以灵活地使用 PostgreSQL,它可以为全文搜索提供更高级的排名和加权功能。
以上是如何确定 MySQL 全文搜索中列相关性的优先级?的详细内容。更多信息请关注PHP中文网其他相关文章!