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")
)
)
)
)
);
通过嵌套进行的单个查询检索我所期望的,但是当我尝试使用这两个查询来创建逻辑 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")
)
)
)
)
);