Elasticsearch NEST:如何查询含指定ItemId的InvoiceItems列表字段
可行,具体实现分两种场景
完全可以实现,根据你的InvoiceItems字段在Elasticsearch中的映射类型,有两种实现方式:
场景1:InvoiceItems为嵌套(Nested)类型
如果你的InvoiceItems字段被映射为Nested类型(推荐用于需要保持子文档独立性的场景),需要使用Nested查询来精准匹配子文档:
var searchResponse = client.Search<Invoice>(s => s .Query(q => q .Nested(n => n .Path(p => p.InvoiceItems) .Query(nq => nq .Term(t => t.InvoiceItems.First().ItemId, itemId) ) ) ) );
这段代码的逻辑是:指定嵌套字段的路径InvoiceItems,然后在嵌套上下文内查询ItemId等于目标值的子文档,只要存在符合条件的子文档,对应的Invoice文档就会被命中。
场景2:InvoiceItems为普通对象数组
如果InvoiceItems只是普通的对象数组(未设置Nested映射),可以直接使用Term查询,Elasticsearch会自动扁平化数组进行匹配:
var searchResponse = client.Search<Invoice>(s => s .Query(q => q .Term(t => t.InvoiceItems.First().ItemId, itemId) ) );
或者直接使用字段名称字符串的写法:
var searchResponse = client.Search<Invoice>(s => s .Query(q => q .Term("invoiceItems.itemId", itemId) ) );
额外建议
如果后续需要对InvoiceItems的多个字段进行联合查询(比如同时匹配ItemId和Quantity),强烈建议将InvoiceItems映射为Nested类型,避免普通数组扁平化后出现的跨子文档匹配问题。
内容的提问来源于stack exchange,提问作者JkAlombro
相关产品推荐
相关产品推荐

