AND 查询在嵌套 C# 中未按预期工作

AND query not working as expected in nest C#

通过嵌套进行的单个查询检索我所期望的,但是当我尝试使用这两个查询来创建逻辑 AND 查询时,它似乎只有 return MatchPhrase 的值并且它忽略了 DateRange。

个别查询是..

resultsList = Client.SearchAsync<AuditLog>(s => s
   .From(0)
   .Take(10)
   .Query(q => q
      .MatchPhrase(mp => mp
         .Field("audit_Action")
         .Query("Successful logout")
      )
   )
).Result.Documents.ToList();

还有...

resultsList = Client.SearchAsync<AuditLog>(s => s
   .From(0)
   .Take(10)
   .Query(q => q
      .DateRange(r => r
         .Field("audit_TimeStamp")
         .GreaterThanOrEquals("2017-03-07T13:00:00")
         .LessThanOrEquals("2017-03-07T14:00:00")
      )
   )
).Result.Documents.ToList();

这两个查询 return 正确的行数,分别为 10 和 5,但是当我组合这两个查询时它仍然是 return 10 行,而不是预期的 1 行。我修改后的查询是...

resultsList = Client.SearchAsync<AuditLog>(s => s
   .From(0)
   .Take(10)
   .Query(q => q
      .Bool(b => b
         .Must(m1 => m1
            .DateRange(r => r
               .Field("audit_TimeStamp")
               .GreaterThanOrEquals("2017-03-07T13:00:00")
               .LessThanOrEquals("2017-03-07T14:00:00")
            )
         )
         .Must(m1 => m1
            .MatchPhrase(m => m
               .Field("audit_Action")
               .Query("Successful logout")
            )
         )
      )
   )
).Result.Documents.ToList();

不确定哪里出了问题,但我想这可能是因为我正在使用 MUST 并且它们正在被 OR'd

你的第二个必须覆盖第一个必须子句。您需要将所有查询传递给相同的 must

您需要像下面这样定义查询。

Client.Search<AuditLog>(s => s
                                    .From(0)
                                    .Take(10)
                                    .Query(q => q
                                       .Bool(b => b
                                          .Must(m1 => m1
                                             .DateRange(r => r
                                                .Field("audit_TimeStamp")
                                                .GreaterThanOrEquals("2017-03-07T13:00:00")
                                                .LessThanOrEquals("2017-03-07T14:00:00")
                                             ),
                                             m1=>m1.MatchPhrase(m => m
                                                .Field("audit_Action")
                                                .Query("Successful logout")
                                             )
                                          )

                                       )
                                    )
                                );