1

我正在使用 elasticsearch 7.5 和 NEST 客户端。

我想对查询进行排序,如您所知,默认情况下是 A..Za..z。我希望它不区分大小写。

我正在尝试使用归一化器,如此处所述

PUT /testindex
{
  "settings": {
     "analysis": {
       "normalizer": {
         "case_insensitive": {
            "filter": "lowercase"
         }
        }
       }
     }
}

然后我可以在映射中使用它:

PUT /testindex/_mapping/testmapping
{
  "properties": {
    "Id": {
    "type": "keyword"
    },
    "Name": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "normalizer": "case_insensitive"
        }
      }
     }
   }
}

当我尝试在 C# NEST 客户端上执行此操作时出现的问题:

client.Indices.Create("testindex", e => e
                .Settings(s => s
                    .Analysis(a => a
                        .Normalizers(n => n.Custom("case_insensitive",c => c.Filters("lowercase")))))
                .Map(m => m
                    .Properties(p => p
                       .Text(st => st.Name("Name")
                       **.NORMALIZER**)))
            );

无法在 Name 属性字段中添加规范器。

有任何想法吗?另一种有效的方法?

太感谢了。

4

1 回答 1

4

正如文档所说,此属性是关键字类型属性的一部分。

关键字字段的规范化属性类似于分析器,只是它保证分析链产生单个标记。

简单地改变你的道具。to 关键字字段将允许您放置规范器

await client.Indices.CreateAsync("testindex", e => e
    .Settings(s => s
        .Analysis(a => a
            .Normalizers(n => n.Custom("case_insensitive", c => c.Filters("lowercase")))))
    .Map(m => m
        .Properties(p => p
            .Keyword(st => st.Normalizer("case_insensitive").Name("Name"))))
);

希望有帮助。

于 2020-01-13T10:49:51.673 回答