在 C# 中使用 OR 子句构建动态 ElasticSearch 查询

问题描述 投票:0回答:1

以下是用 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

中的值

我尝试了很多不同的查询

c# asp.net elasticsearch dsl elasticsearch-dsl
1个回答
0
投票

我对你的问题的理解是你想检索具有相同键值对的所有文档。那么查询是这样的吗?

(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()
            )
        )
    )
);
© www.soinside.com 2019 - 2024. All rights reserved.