簡體   English   中英

如何按相關性對MYSQL全文搜索結果進行排序

[英]How to sort MYSQL fulltext search results by relevancy

我對 MYSQL 比較陌生,並且遇到了一個困擾我一段時間的問題。 我試過在谷歌上到處搜索答案,但到目前為止還沒有找到可接受的解決方案。

這是我目前正在運行的查詢,用於查找給定搜索詞的最佳匹配項:

$query="SELECT * from `vocabulary` WHERE translation = 'word' OR translation LIKE '%word%'";

它返回的結果是全面的,因為它們包括所有相關的行。 但是,它們沒有按任何特定順序排序,當我在 PHP 中打印結果時,我希望首先顯示完全匹配的那些。 像這樣:


1 | word <-完全匹配
2 | 填字游戲 <- 部分匹配按字母順序排序 /
3 |
4 | 文字匠


非常感謝您的幫助。

-macspacejunkie

LIKE 不是全文搜索 在全文搜索中, MATCH(...) AGAINST(...)返回一個匹配分數,可以粗略地近似為相關性。

您可以通過創建全文索引然后匹配您的搜索詞來獲得良好的相關性搜索。

所以這樣的事情應該有效。

ALTER TABLE `vocabulary` ADD FULLTEXT INDEX `SEARCH`(`translation`);

SELECT *, MATCH(translation) AGAINST ('+word' IN BOOLEAN MODE) AS relevance 
FROM `vocabulary`
WHERE MATCH(translation) AGAINST ('+word' IN BOOLEAN MODE)
ORDER BY relevance DESC

更多信息可以在MySQL 參考手冊中找到

SELECT * from vocabulary 
WHERE translation like 'word'  
union all
SELECT * from vocabulary 
WHERE translation LIKE '%word%' and translation not like 'word'  

將首先列出完全匹配

我一直在研究同樣的問題,但還沒有找到適合我情況的完美答案,但這可能對您有用。 我對全文搜索也很陌生,所以任何專家也可以幫助我。

我在 select 中做了兩個 MATCH() AGAINST() 語句,並將每個語句的分數組合起來形成總相關性。 分配不同的乘數允許我配置每組結果的重要性。

我的第一個 MATCH() 將使用雙引號檢查字面(或精確)搜索詞。 我的第二場比賽會正常檢查。 我將更高的乘數應用於第一個匹配項,因此如果找到它應該具有更高的相關性值。

像這樣的東西。

SELECT *, ((MATCH(indexes) AGAINST ('"search_terms"' IN BOOLEAN MODE) * 10)  
           + (MATCH(indexes) AGAINST ('search_terms' IN BOOLEAN MODE) * 1.5)) AS relevance  
FROM ...
WHERE ...  
      AND (MATCH (indexes) AGAINST ('"search_terms"' IN BOOLEAN MODE) > 0  
           OR MATCH (indexes) AGAINST ('search_terms' IN BOOLEAN MODE) > 0)  
      ...
ORDER BY relevance DESC

如果您使用 EXPLAIN 來檢查查詢的工作方式,您應該會發現由於 MySQL 的工作方式,額外的 MATCH() AGAINST() 子句實際上並沒有給查詢增加任何開銷。

您的查詢只需稍加修改即可獲得您要查找的訂單。

SELECT * 
FROM vocabulary
WHERE translation LIKE '%word%'
ORDER BY translation <> 'word', translation;

如果translation正好是'word' ,它將位於結果的頂部。 這是因為當存在精確匹配時, translation <> 'word'將為0 ,該匹配出現在所有其他結果將返回的1之前。 由於, translation ,其余結果將在此之后按字母順序排序。

此查詢避免進行兩個查詢,就像所選答案對其UNION所做的那樣。 此外,您的查詢不需要translation = 'word' OR translation LIKE '%word%'因為后半部分將始終執行並且是第一部分的超集。

對於那些尋找使用實際全文搜索的答案的人,請參閱其他更受好評的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM