2013-05-19 38 views
3

我有2個文件,並且正在搜索關鍵字「Twitter」。假設這兩個文檔都是帶有「tags」字段的博客文章。Elasticsearch - 更高的得分如果更高的術語頻率

文檔A在「tags」字段中只有1個詞,它是「Twitter」。 文檔B在「標籤」字段中有100個字詞,但其中3個字詞是「Twitter」。

即使文檔B的頻率更高,彈性搜索也會給文檔A提供更高的分數。但是這個分數是「稀釋的」,因爲它有更多的條款。我如何給文件B一個更高的分數,因爲它具有更高的檢索詞頻率?

我知道ElasticSearch/Lucene基於文檔中的術語數執行一些標準化。我如何禁用這種規範化,以便文檔B得到更高的分數?

回答

3

正如另一個答案說,看看你是否在一個碎片上有相同的結果會很有趣。我認爲你會這樣做,這取決於標籤字段的規範,在使用tf/idf相似度計算分數時(默認值),將考慮到這一點。

事實上,lucene確實考慮了術語頻率,換句話說,術語出現在字段內的次數(在您的案例中爲1或3)以及反向文檔頻率,換句話說術語在索引中頻繁出現,以便將其與查詢中的其他詞語進行比較(在您的情況下,如果您正在搜索單個詞語,則沒有任何區別)。

但還有另一個稱爲規範的因素,即獎勵較短的字段並考慮最終的索引時間提升,這可能是每個字段(映射中)或甚至每個文檔。您可以驗證規範是您的結果在搜索請求中啓用explain選項並查看說明輸出的原因。

我猜想第一個文檔只包含該標籤的事實使得包含該標籤多次的其他標籤更重要,但也包含很多標籤。如果你不喜歡這種行爲,你可以在標籤字段的映射中禁用標準。如果該字段爲"index":"analyzed"(默認值),則應該默認啓用它。如果您不希望分析標籤字段(通常有意義,但取決於您的數據和域),則可以切換到"index":"not_analyzed",或者在標籤映射字段中添加"omit_norms": true選項。

0

在不同的碎片上找到文件嗎?從彈性搜索文檔:

「當查詢在特定分片上執行時,它不會考慮其他分片的詞頻和其他搜索引擎信息。如果我們想要支持準確的排名,我們需要首先對所有分片執行查詢並收集相關的詞頻,然後根據它執行查詢。「

解決方案是指定搜索類型。使用dfs_query_and_fetch搜索類型來執行初始分散階段,並計算分佈式術語頻率以獲得更準確的評分。

您可以閱讀更多here