【问题标题】:Elasticsearch NEST LibraryElasticsearch NEST 库
【发布时间】:2017-07-10 09:54:02
【问题描述】:

我们需要在一个 int [1,2,3,4,5,6] 数组的字段中创建构面。 如果我们将此字段映射为文本,Elasticsearch 会抛出异常。如果我们将其标记为关键字,我们不会得到构面中的所有单个项目。

如何使用 NEST 库(第 5 版)实现这一目标

非常感谢

【问题讨论】:

    标签: elasticsearch nest


    【解决方案1】:

    将其映射为整数。 NEST's automapping 默认会为其推断一个整数映射

    给定以下类型

    public class Message
    {
        public int[] Integers { get; set; }
    }
    

    自动映射看起来像

    var client = new ElasticClient();
    
    client.CreateIndex("messages", c => c
        .Mappings(m => m
            .Map<Message>(mm => mm
                .AutoMap()
            )
        )
    );
    

    产生以下映射

    {
      "mappings": {
        "message": {
          "properties": {
            "integers": {
              "type": "integer"
            }
          }
        }
      }
    }
    

    如果要显式控制映射,可以使用attribute mapping

    public class Message
    {
        [Number(NumberType.Integer)]
        public int[] Integers { get; set; }
    }
    var client = new ElasticClient();
    
    client.CreateIndex("messages", c => c
        .Mappings(m => m
            .Map<Message>(mm => mm
                .AutoMap()
            )
        )
    );
    

    fluent mapping,如果您希望将映射与您的 POCO 分开

    client.CreateIndex(messagesIndex, c => c
        .Mappings(m => m
            .Map<Message>(mm => mm
                .AutoMap()
                .Properties(p => p
                    .Number(n => n
                        .Name(nn => nn.Integers)
                        .Type(NumberType.Integer)
                    )           
                )
            )
        )
    );
    

    或使用scalar method

    client.CreateIndex(messagesIndex, c => c
        .Mappings(m => m
            .Map<Message>(mm => mm
                .AutoMap()
                .Properties(p => p
                    .Scalar(n => n.Integers)            
                )
            )
        )
    );
    

    映射到位后,整数值的分面看起来像

    client.IndexMany(new[] {
        new Message { Integers = new [] { 1, 2, 3 } },
        new Message { Integers = new [] { 3, 4, 5 } },
        new Message { Integers = new [] { 1, 4, 5 } },
    });
    
    client.Refresh(messagesIndex);
    
    var searchResponse = client.Search<Message>(s => s
        .Size(0)
        .Aggregations(a => a
            .Terms("ints", t => t
                .Field(f => f.Integers)
            )
        )
    );
    
    foreach (var bucket in searchResponse.Aggs.Terms<int>("ints").Buckets)
    {
        Console.WriteLine($"{bucket.Key}:{bucket.DocCount}");
    }
    

    产生

    1:2
    3:2
    4:2
    5:2
    2:1
    

    【讨论】:

      猜你喜欢
      • 2017-12-22
      • 2015-04-03
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      • 2015-05-14
      • 2015-11-11
      • 2015-06-16
      • 2013-07-19
      相关资源
      最近更新 更多