在 Elasticsearch 分数计算中忽略文本长度

问题描述 投票:0回答:1

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

对于这些字段,我使用带有“trim”和“lowercase”标记过滤器的“Whitespace”标记生成器。 我实现了一个搜索,通过这两个字段进行查找。我遇到的问题是分数计算。这只是一个例子来说明问题:

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

文件1:
名字 =“卢卡斯”
姓氏=“佩雷斯”

文件2:
名字 =“卢卡斯·胡安·何塞”
姓氏 =“冈萨雷斯·德·佩雷斯·阿尔梅达”,

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

我想要做的是首先获取具有更多术语匹配的文档,无论文本长度(或任何其他标准)如何。因此,对于这个例子,第二个文档将有 2 个匹配的术语,“Lucas”和“Gonzales”,所以它应该首先返回。

有什么好的方法吗?考虑到我的 person 模型有大约 20 个属性,并且查询需要快速运行。

c# elasticsearch nest
1个回答
4
投票

您应该对字段禁用

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()
        )
    )
);
© www.soinside.com 2019 - 2024. All rights reserved.