Elasticsearch NEST客户端始终使用PUT请求而非POST,如何配置改为POST以自动生成文档ID?
解决NEST客户端使用POST请求让Elasticsearch自动生成文档ID的问题
你的判断完全正确——PUT请求要求指定文档ID,这就是为什么你看到ES里始终存储ID为0(因为你的模型Id字段默认值是0,NEST把它当作ID传到了ES)。要让ES自动生成唯一ID,我们需要让NEST发送POST请求(不需要指定ID),这里有几种可行的方案:
1. 索引时显式不指定ID
最直接的方式是在索引请求中明确告诉NEST不要使用模型里的Id作为文档ID,比如设置Id = null:
方式一:使用IndexRequest对象
// 假设你的文档模型是MyDocument var myDoc = new MyDocument { /* 填充字段,Id可能是0或者其他值 */ }; var indexRequest = new IndexRequest<MyDocument>(myDoc) { Id = null, // 显式设置为null,触发POST请求 Pipeline = "你的管道处理器名称" // 记得带上你的管道 }; var response = await client.IndexAsync(indexRequest); // 生成的ID可以从response.Id获取 var generatedId = response.Id;
方式二:使用Fluent API
var response = await client.IndexAsync<MyDocument>(myDoc, i => i .Id(null) // 不指定ID,ES会自动生成 .Pipeline("你的管道处理器名称") );
2. 全局配置模型映射,忽略Id字段作为文档ID
如果你的所有这类文档都不需要用模型里的Id作为ES的文档ID,可以在NEST的连接配置里全局设置:
var settings = new ConnectionSettings(new Uri("http://你的ES地址:9200")) .DefaultMappingFor<MyDocument>(m => m .IgnoreProperty(d => d.Id) // 让NEST忽略模型的Id字段,不作为文档ID .IndexName("你的索引名称") ); var client = new ElasticClient(settings);
之后再调用client.IndexDocumentAsync(myDoc)时,NEST会自动发送POST请求,让ES生成唯一ID。
关键原理说明
当你不指定文档ID时,NEST会把请求发送到POST /{index}/_doc这个端点,而不是PUT /{index}/_doc/{id}。ES在收到POST请求时会自动生成一个唯一的字符串ID,不会再使用你模型里的0作为ID。
另外要注意:即使你用管道处理器移除了文档里的Id字段,但只要NEST在请求URL里带上了ID(比如0),ES还是会用这个URL里的ID作为文档ID,所以核心是让NEST不要在URL中包含ID参数。
内容的提问来源于stack exchange,提问作者user2055886
相关产品推荐
相关产品推荐

