在使用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中文網其他相關文章!