为所有关键字字段 NEST 添加规范化器

Adding normalizer for all keyword fields NEST

我可以使用以下方法在 NEST 中的关键字映射上设置规范化器:

   client.Indices.Create(indexName, c => c
        .Map<Item>(m => m.Properties(ps => ps
          .Text(s => s
            .Name(new PropertyName("someProp"))
            .Fields(f => f
              .Keyword(kw => kw
                .Name("keyword")
                .Normalizer("my_normalizer")
              )
            )
          )
        )
      )

有没有办法在不声明所有字段的情况下为指定映射的所有关键字字段添加规范化器?我已经研究了 属性 访问者模式并使用了 AutoMap 但是我运气不佳,因为其中设置的任何内容似乎都被覆盖了,也许这不是执行此操作的正确位置?

其中一个选项是使用 dynamic template,这将为所有字符串创建具有指定规范化器的关键字映射

var createIndexResponse = await client.Indices.CreateAsync("my_index", c => c
    .Settings(s => s.Analysis(a => a
        .Normalizers(n => n.Custom("lowercase", cn => cn.Filters("lowercase")))))
    .Map(m => m.DynamicTemplates(dt => dt.DynamicTemplate("string_to_keyword", t => t
        .MatchMappingType("string")
        .Mapping(map => map.Keyword(k => k.Normalizer("lowercase")))))));

索引此文档

var indexDocumentAsync = await client.IndexDocumentAsync(new Document {Id = 1, Name = "name"});

会产生如下索引映射

{
  "my_index": {
    "mappings": {
      "dynamic_templates": [
        {
          "string_to_keyword": {
            "match_mapping_type": "string",
            "mapping": {
              "normalizer": "lowercase",
              "type": "keyword"
            }
          }
        }
      ],
      "properties": {
        "id": {
          "type": "long"
        },
        "name": {
          "type": "keyword",
          "normalizer": "lowercase"
        }
      }
    }
  }
}

希望对您有所帮助。