2016-01-06 160 views
0

在我們的elasticsearch中,我們爲一些人員編制了索引,其中每個人可以有多個標籤。不同單詞上的匹配應該高於彈性搜索中的一個單詞上的多個匹配

就拿2人(全名 - (引用的Tagging)):

  1. 巴特紐曼 - (巴特,工程師,CEO)
  2. 巴特荷蘭 - (開發商,僱主)

我們SEARCHQUERY

{ 
    "multi_match": { 
    "type": "most_fields", 
    "query": "bart developer", 
    "operator": "or", 
    "boost": 5, 
    "fields": [ 
     "fullname^5", 
     "taggings.tag.name^5" 
    ], 
    "fuzziness": 0 
    } 
} 

比方說,我們是在「巴特搜索下發展r「。那麼我們應該期待巴特荷蘭人應該來到巴特紐曼之前,但是因爲巴特紐曼有他的全名和巴特爾作爲標記,他得分高於巴特霍蘭德。

有沒有一種方法,我可以配置不同的詞相匹配(BART開發商)能得分高於上一個字(巴特)多個匹配。

我已經嘗試過-operator沒有成功。

謝謝!

回答

2

這是一種預期與most fields查詢,這是場爲中心而非期限爲中心,從文檔

most_fields是場爲中心,而不是長期爲中心的:它看起來對於 最匹配的字段,當我們真正感興趣的是 最匹配的字詞。

另一個問題是Inverse Document Frequency這也可能在你的情況。我想只有幾個文件的標籤名稱爲bart,這就是爲什麼它的IDF非常高,因此獲得更高的分數。

如上述鏈接所示,您應該看到如何使用validateexplain來評分文檔。

有兩種方法來解決這個問題

1)您可以使用custom _all領域,即同時複製full nametag信息,以新的領域與copy_to參數,然後就可以查詢,但你必須reindex數據對於

2)我認爲更好的解決方案將使用cross fields,它需要term-centric的方法。從文檔

的cross_fields鍵入首先分析查詢字符串來產生術語的 列表,然後它搜索在任何領域每學期。

它還通過將所有字段混合來解決IDF問題。

這應該可以解決您的問題。

{ 
    "query": { 
    "multi_match": { 
     "type": "cross_fields", 
     "query": "bart developer", 
     "operator": "or", 
     "fields": [ 
     "fullname", 
     "tagging.tag.name" 
     ], 
     "fuzziness": 0 
    } 
    } 
} 

希望這會有所幫助!