2017-06-03 63 views
0

我正在使用ES 5.在C#上使用嵌套5。 我有一個人在我的ES解決方案的索引。此人在其他人之間具有名字,姓氏字段。在分數計算中忽略文本長度Elasticsearch

對於這些字段,我使用帶有「修剪」和「小寫」標記過濾器的「空白」標記器。 我實現了一個搜索,我看這兩個領域。我遇到的問題是分數計算。這只是一個例子來ilustrate問題:如果我通過「盧卡斯岡薩雷斯」 搜索

而且我有2個文件,其中

文獻1: 名字=「盧卡斯」 姓氏=「佩雷斯」

文獻2: 姓=「盧卡斯胡安何」 名字=「岡薩雷斯德佩雷斯Almeida的」,

即使當文件2具有2個術語(盧卡斯和岡薩雷斯)第一個是返回第一個。 當我看到有關kibana的解釋的查詢時,我注意到對於文檔2,分數較低,因爲文本長度較大。

我想要做的是首先得到更多條款匹配的文檔,無論文本長度(或任何其他標準)。因此,對於這個例子,第二個文檔將有兩個匹配的術語「Lucas」和「Gonzales」,因此應該先返回。

有沒有很好的方法來做到這一點?考慮到我的人模型有大約20個屬性,並且查詢需要快速運行。

回答

1

您應該爲您的字段禁用norms以消除字段長度的影響。這裏是映射的一個示例:

PUT my_index/_mapping/my_type 
{ 
    "properties": { 
     "firstName": { 
      "type": "text", 
      "norms": { 
       "enabled": false 
      } 
     }, 
     "lastName": { 
      "type": "text", 
      "norms": { 
       "enabled": false 
      } 
     } 
    } 
} 

,或者在客戶端NEST的情況下,這裏是一個屬性的映射

class Sample 
{ 
    [Text(Norms = false)] 
    public string FirstName { get; set; } 

    [Text(Norms = false)] 
    public string LastName { get; set; } 
} 

client.CreateIndex(indexName, 
    create => create.Mappings(
     mappings => mappings.Map<Sample>(
      map => map.AutoMap() 
     ) 
    ) 
);