忽略分数计算Elasticsearch上的文本长度

时间:2017-06-03 16:38:26

标签: c# elasticsearch nest

我正在使用ES 5.在C#上使用Nest 5。 我的ES解决方案中有一个Person的索引。此人在其他人之间有一个名字,姓氏字段。

对于这些字段,我正在使用" Whitespace"标记器" trim"和"小写"令牌过滤器。 我通过这两个字段实现了搜索。我遇到的问题是分数计算。这只是说明问题的一个例子:

如果我搜索" Lucas Gonzales" 我有2个文件

文件1: FirstName =" Lucas" LastName =" Perez"

文件2: FirstName =" Lucas Juan Jose" LastName =" Gonzales de Perez Almeida",

即使文件2有2个术语(Lucas和Gonzales),第一个也是第一个。 当我看到带有kibana解释的查询时,我注意到对于文档2,分数较低,因为文本长度较大。

我想要做的是首先获得更多术语匹配的文档,不管文本长度(或任何其他标准)。因此,对于此示例,第二个文档将有2个匹配的术语," Lucas"和" Gonzales",所以它应该先返回。

这样做有好办法吗?考虑到我的人模型有大约20个属性,查询需要快速运行。

1 个答案:

答案 0 :(得分: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()
        )
    )
);