2009-06-19 122 views
22

我對MYSQL相對較新,並且遇到了一段時間以來一直困擾我的問題。我已經試過Google的搜索結果,但仍然無法找到可接受的解決方案。如何根據相關性對MYSQL全文搜索結果進行排序

這裏是我當前正在運行的找到最佳匹配對於給定的搜索詞的查詢:

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

它所返回的結果是全面的,因爲它們包含所有相關行。但是,它們沒有按照任何特定的順序排序,並且我想在PHP中打印結果時首先顯示完全匹配的結果。像這樣:


1 | word < -exact match
2 |字謎< - 部分比賽按字母/順序排列/
3 |字
4 |語言大師


預先感謝您對我付出的援助。

-macspacejunkie

+0

更新:謝謝大家的幫助!正是我在找的東西。 Regards, -macspacejunkie – user125591 2009-06-19 11:38:00

+0

如果有人幫助過您,請檢查他們的答案 – Jason 2009-06-19 16:45:53

回答

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

會列出確切的匹配第一

+1

這是在大型表格中執行操作的非常糟糕的方式。考慮使用`FULLTEXT`搜索更快的查詢 – OverCoder 2016-09-02 21:26:55

28

LIKE不fulltext search。在全文搜索中,MATCH(...) AGAINST(...)返回可以大致近似爲相關性的匹配分數。

21

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

所以像這樣的東西應該工作。

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 Reference Manual找到。

5

我一直在尋找同樣的問題,並沒有完全找到我的情況的完美答案,但這可能對你有用。我對全文搜索還很陌生,所以任何專家都會幫助我。

我在select中做了兩次MATCH()AGAINST()語句,並將每個分數合併以形成總體相關性。分配不同的乘數允許我配置每組結果的導入。

我的第一次MATCH()將檢查使用雙引號的文字(或確切)搜索詞 我的第二次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功能顯示查詢是如何工作的,你應該發現,額外的MATCH()反對()子句不實際的查詢由於MySQL的工作方式增加任何額外開銷。

2

您的查詢只需要一點點修改讓你要找的順序。

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

如果translation正是'word',它會在結果頂部。這是因爲translation <> 'word'將會是當有完全匹配它會在之前被返回所有其他結果。剩下的結果將按照字母順序後,由於, translation的排序。

此查詢避免做兩個查詢,如選擇的答案確實與它的UNION。此外,您的查詢不需要translation = 'word' OR translation LIKE '%word%'下半年以來就一定會執行,並且是第一部分的超集。

對於那些正在尋找使用實際全文搜索的答案,請參閱其他更高回答的答案。

相關問題