2017-03-31 179 views
0

多次嘗試和許多搜索我來到了下面的查詢後不正確:MySQL全文索引搜索短話

SELECT id, 
     title, 
     description, 
     MATCH(title,description,tags) AGAINST ('$search' IN NATURAL LANGUAGE MODE) AS score 
FROM pages 

我用這個查詢裏面大量的包含音樂課的網頁搜索。它工作得很好。根據頁面與查詢的匹配程度,頁面獲得分數。

除用戶搜索「C Chord」或「Am Chord」之類的內容時,第一部分被忽略。如果我搜索「和絃」或「E和絃」,名爲「C和絃」的頁面始終位於最前面。

所以..我的問題的第一部分是:我該如何解決這個問題?

然後是第2部分。是否有可能讓列「標題」對評分更重要,然後是「說明」?

+0

只是想一想,大多數全文索引都有一個用於索引的最小字長。我相信Mysql的默認值是4。 – mlewis54

回答

0
  1. 問題

這一問題已經在SO好幾次討論:MySQL的內置全文分析器是專爲searching for words,而不是單個字符,並配有3個默認的最小單詞長度設置( innodb)或4(myisam)這些設置表示沒有短於3或4個單詞的單詞被索引,因此不會通過全文搜索找到。您可以將最小字符長度限制降低到1並重建索引,但它會減慢搜索速度,因爲索引會變大。

  • 問題
  • 這是可能的,但需要對title字段分別搜索和凹凸向上的相關性得分從所述title域結果。

    您可以使用union得到一個組合列表與sum()總結成績彌補任何記錄:

    SELECT p.id, any_value(title), any_value(description), any_value(tags), sum(t.score) as sum_score 
    FROM 
        (SELECT id, (MATCH(title) AGAINST ('$search' IN NATURAL LANGUAGE MODE)) *2 AS score 
        FROM pages 
        UNION ALL 
        SELECT id, MATCH(description,tags) AGAINST ('$search' IN NATURAL LANGUAGE MODE) AS score 
        FROM pages) t 
    INNER JOIN pages p on t.id=p.id 
    GROUP BY p.id 
    ORDER BY sum(t.score) DESC 
    

    您需要調整的全文索引,以便能夠做獨立搜索。

    1

    MySQL對全文搜索,停用詞和最小字長有兩個重要參數。第一個是最小字大小(記載here):

    詞不被索引,所以你不能搜索它們。切記在更改參數後重建索引。方便(哈!)他們有不同的默認值。

    此外,還有停用詞表來刪除常見停用詞。這是否是一個問題取決於你正在搜索什麼詞。您可以自定義停用詞。