2017-06-03 102 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() 
     ) 
    ) 
);