以下是用 C# 编写的查询。它利用 Elastic.Clients.Elasticsearch 版本 8.13.7。这不是 NEST 客户端。这是 ASP.NET 客户端。它没有很多文档。
submissions = await localClient.SearchAsync<SubmissionDto>(SUBMISSION_INDEX, s => s
.Query(q => q
.Bool(b => b
.Must(
m => m.Term(tt => tt.Field(f => f.Ori).Value(myTenants.ElementAt(0).Item1.ToLower())),
m => m.Term(tt => tt.Field(f => f.Cri).Value(myTenants.ElementAt(0).Item2.ToLower())))
.Filter(f => f
.Range(rr => rr
.DateRange(dr => dr
.Field(f => f.SubmissionCreation)
.Gte(startDate.ToString("yyyy/MM/dd"))
.Lte(endDate.ToString("yyyy/MM/dd"))
.TimeZone("America/New_York"))))))
.Size(MAX_DOCUMENTS)
.Sort(sort => sort
.Field(f => f.SubmissionCreation, d => d
.Order(SortOrder.Desc))));
查询使用
myTenants
,它作为参数传递给方法。 myTenants
的类型是 IEnumerable<Tuple<string, string>>
。列表中的每一项代表 ORI/CRI 对。我需要更新查询以遍历整个 myTenants
列表。查询应返回所有 SubmissionDto
,其中 ORI/CRI 组合等于 myTenants
中的值
我尝试了很多不同的查询
我对你的问题的理解是你想检索具有相同键值对的所有文档。那么查询是这样的吗?
(Ori = A && Cri = B) || (Ori = C && Cri = D) || ...
可以这样写:
await client.SearchAsync<SubmissionDto>("indexname", s => s
.Query(q => q
.Bool(b => b
.Should(sh => // An outer 'should' (OR).
tenants.Select<Tenant, Action<QueryDescriptor<SubmissionDto>>>(tenant => sh => // Foreach tenant:
sh.Bool(b => b
.Must( // A 'must' (AND) containing the query for both Ori and Cri fields.
m => m.Term(t => t.Field(dto => dto.Ori).Value(tenant.Ori)),
m => m.Term(t => t.Field(dto => dto.Cri).Value(tenant.Cri))
)
)
).ToArray()
)
)
)
);