Elasticsearch NEST库

时间:2017-07-01 18:36:58

标签: elasticsearch nest

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

如何通过NEST库(版本5)实现这一目标

非常感谢

1 个答案:

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