【问题标题】:AND query not working as expected in nest C#AND 查询在嵌套 C# 中未按预期工作
【发布时间】:2020-05-05 11:59:09
【问题描述】:

通过嵌套的单个查询检索我所期望的,但是当我尝试使用这两个查询来创建逻辑 AND 查询时,它似乎只返回 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();

这两个查询分别返回正确数量的行,10 和 5,但是当我结合这两个查询时,它仍然返回 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

【问题讨论】:

    标签: nest


    【解决方案1】:

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

    您需要定义如下查询。

    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")
                                                 )
                                              )
    
                                           )
                                        )
                                    );
    

    【讨论】:

      猜你喜欢
      • 2012-11-18
      • 1970-01-01
      • 2018-10-13
      • 2021-12-03
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多