如何禁用NEST中Elasticsearch文档_id与_source.id值一致的行为?
当然可以让Elasticsearch自动生成文档_id!
你遇到的情况是NEST的默认行为——它会自动把实体类里的Id属性映射为Elasticsearch文档的_id字段。要禁用这个行为,有几种简单的方式,都能保证_source.id正常保留,同时让ES自动生成独立的_id:
方法1:通过实体类属性配置
直接在你的Obj类的Id字段上添加[IgnoreId]特性,告诉NEST不要把这个字段用作文档的_id:
public class Obj { [IgnoreId] // 关键:阻止NEST将此属性映射为文档_id public string Id { get; set; } // 其他属性... }
这样索引文档时,NEST就不会把obj.Id的值传给ES的_id字段,ES会自动生成随机的_id,同时_source.id依然会保留你设置的some_value。
方法2:通过Fluent Mapping配置
如果你更喜欢用代码方式配置索引映射,可以在创建索引时显式设置忽略Id属性的_id映射:
var client = new ElasticClient(settings); client.Indices.Create("your-index-name", c => c .Map<Obj>(m => m .IgnoreId() // 忽略实体Id属性作为文档_id的映射 .Properties(p => p .Text(t => t.Name(o => o.Id)) // 确保Id字段被正常索引到_source中 // 配置其他属性... ) ) );
方法3:索引时显式指定不使用Id
如果只是针对个别文档需要这个行为,也可以在索引请求时显式把Id设为null:
var obj = new Obj { Id = "some_value", /* 其他属性 */ }; client.Index(obj, i => i .Index("your-index-name") .Id(null) // 让ES自动生成_id );
在NEST 7.x及以上版本,还有更简洁的IndexWithoutId方法:
client.IndexWithoutId(obj, i => i.Index("your-index-name"));
原理补充
NEST默认遵循"约定优于配置"的原则,会自动识别实体类中名为Id/ID的属性,或者带有[Id]特性的属性,将其值作为Elasticsearch文档的_id。上面的几种方法都是通过覆盖这个约定,让ES回到自动生成_id的默认行为。
内容的提问来源于stack exchange,提问作者Jose Ramirez
相关产品推荐
相关产品推荐

