問題

所以我試圖透過Elasticsearch安裝獲得好的搜尋結果.
2001年12月31日終了的兩年期收入和支出及準備金和基金結餘變動報表 但是當我試圖對一些非常簡單的資料進行模糊搜尋時,我遇到了問題.
2001年12月31日終了的兩年期收入和支出及準備金和基金結餘變動報表 不知何故,多個(其中一些是部分的)單詞得分太低,只有在搜尋查詢中存在更多的單詞字母時才得到更高的得分。

讓我解釋一下:
2001年12月31日終了的兩年期收入和支出及準備金和基金結餘變動報表 我有一個簡單的索引,內建兩個簡單的文件.

 {
    "name": "Product with good qualities and awesome sound system"
},
{
    "name": "Another Product that has better acustics than the other one"
}
 

現在我使用以下引數查詢索引:

 {
    "query": {
        "multi_match": {
            "fields": ["name"],
            "query": "product acust",
            "fuzziness": "auto"
        }
    }
}
 

結果如下所示:

 "hits": [
        {
            "_index": "test_products",
            "_type": "_doc",
            "_id": "1",
            "_score": 0.19100355,
            "_source": {
                "name": "Product with good qualities and awesome sound system"
            }
        },
        {
            "_index": "test_products",
            "_type": "_doc",
            "_id": "2",
            "_score": 0.17439455,
            "_source": {
                "name": "Another Product that has better acustics than the other one"
            }
        }
    ]
 

正如您所看到的,使用 ID 2 的產品得分小於其他產品,即使它與給定的查詢字串可能比其他產品更相似,因為它有一個完整的字匹配和一個部分詞匹配。
2001年12月31日終了的兩年期收入和支出及準備金和基金結餘變動報表 當查詢像“product acusti”時,結果將開始正確執行.
2001年12月31日終了的兩年期收入和支出及準備金和基金結餘變動報表 我已經用bool搜尋解決了問題,但結果是相同的.

任何想法如何能夠比必須輸入幾乎整個第二個單詞更快地獲得想要的結果?

  最佳答案

據我所知,Elasticsearch預設情況下不會進行部分單詞匹配,所以acust這個術語在您的文件中都沒有匹配.

在第一個文件中得到更高分的原因是匹配的術語product出現在較短的句子中:

具有良好品質和良好聲音系統的產品

但是關於第二個文件,product出現在一個更長的句子中:

另一種產品具有比另一種更好的聲學

因此,您的第二個文件得到的分數較低,因為您的匹配項(產品)與句子中的詞數之比較低。

換句話說,欄位長度正則化:

 norm = 1/sqrt(numFieldTerms)
 

現在,如果您希望能夠進行部分字首匹配,您需要將您的術語標記為 ng ,例如,您可以為“聲學”這個術語建立以下ngg:

"ac","aco","acou","acous","acoust","acoust","acousti","聲學","聲學"

您有兩個選項來實現這一點,請參閱 Russ Cam 在 這個問題 上的答案

  1. 使用 Analyze API 使用將欄位標記為令牌/術語的分析器 您希望部分字首匹配,並將其索引 集合作為完成欄位的輸入。標準分析器 可能是一個好的開始...

  2. 不要在這裡使用Complement Suggester,而是將欄位(名稱)設定為文字資料型別 multi-fields 這包括分析名稱的不同方式(或不) 分析,例如使用一個關鍵字子欄位).用Analyze API來構建一個分析器, 允許在名稱中的任何地方部分字首.作為一個開始, 像 Standard tokenizer,Lowercase 令牌過濾器, Edgengram令牌過濾器和可能停止令牌過濾器會讓你 執行...

您也可以找到這個指南有用.

  相同標籤的其他問題

elasticsearch