通过流畅的Api在弹性搜索/ NEST 2.0中设置Id字段

Ser*_*kiy 5 elasticsearch nest

在NEST 2.0/ElasticSearch.NET中删除了IdField方法.我现在在2.0中找不到如何在流利的Api中做到这一点的文档.有什么建议?谢谢.

Rus*_*Cam 9

NEST 2.x中的Id推断与NEST 1.x非常相似.基本上有三种方式:

  • IdPOCO上命名的属性推断Id .

例如,假设您具有索引到Elasticsearch的以下类型

class MyDTO
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string OtherName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

NEST将寻找Id在POCO上找到的属性,并使用此属性的值作为文档的id

  • 使用该ElasticsearchType属性

您可以ElasticsearchType使用POCO属性并使用该IdProperty属性向NEST发送信号,以便为文档ID使用不同的属性.例如,

[ElasticsearchType(IdProperty = nameof(Name))]
class MyOtherDTO
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string OtherName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这将使用该Name属性作为文档ID

  • 使用ConnectionSettings' InferMappingFor<T>方法

您可以配置ConnectionSettings为推断给定类型的id属性

var connectionSettings = new ConnectionSettings(new Uri("http://localhost:9200"))
    .InferMappingFor<MyOtherDTO>(m => m
        .IdProperty(p => p.OtherName)
    );
Run Code Online (Sandbox Code Playgroud)

这将使用该OtherName属性作为文档ID.

这是每个ConnectionSettings实例缓存的,所以如果它不变,我建议在启动时配置设置并在应用程序的生命周期中使用它们(你也可以使用ElasticClient单例;它是线程安全的).

InferMappingFor<T>,还可以设置为CLR类型,索引名称和类型名以及重命名任何特性(即映射POCO属性在ES映射不同的属性名),并忽略POCO性质.

id推理的优先顺序是:

  1. InferMappingFor<T>() IdProperty()ConnectionSettings
  2. ElasticsearchTypeAttribute 关于POCO
  3. IdPOCO上命名的属性中推断Id