我有如下所示的查询:
var queryResult =
await
elastic.SearchAsync<CounterData>(s => s
.Query(q => q
.Bool(b => b
.Must(
m => m.ConstantScore(c => c
.Filter(f => f
.Term(x => x.CounterId, maxList))
),
m => m.ConstantScore(c => c.
Filter(f => f
.Term(x => x.Type, counterType))),
m => m.ConstantScore(c => c.
Filter(f => f.
DateRange(d => d.
GreaterThanOrEquals(lowerBound).Field(r => r.Date)))))))
.AllTypes()
.Scroll("1m")
.Size(10000));
其中 maxList
是整数列表。我想检查该术语是否在列表中,但看起来这不起作用。
有什么想法可以检查该术语是否与列表中的任何元素匹配吗?
最佳答案
像下面这样的事情就可以了
var maxList = new[] { 1, 2, 3, 4, 5};
var counterType = "counter-type";
var lowerBound = DateTime.UtcNow.Date.AddDays(-7);
var queryResult = client.Search<CounterData>(s => s
.Query(q => +q
.DateRange(d => d
.Field(r => r.Date)
.GreaterThanOrEquals(lowerBound)
) && +q
.Term(x => x.Type, counterType) && +q
.Terms(t => t
.Field(x => x.CounterId)
.Terms(maxList)
)
)
.AllTypes()
.Scroll("1m")
.Size(10000)
);
一些需要强调的事情
-
+
一元运算符应用于QueryContainerDescriptor<T>
是将查询包装在bool
中的简写filter
询问。我认为这就是您在案例中想要的,因为您不需要计算分数,您只想找到谓词的匹配项。 -
&&
QueryContainer
已重载这样当应用于两个QueryContainer
时s,它是bool
的简写must
带有两个必须查询子句的查询。但在此示例中,查询全部具有+
应用一元运算符是bool
filter
查询,因此将是&&
'一起作为过滤器查询。 - 传递给
Size()
的值使用滚动时(即指定Scroll()
时间)是每个滚动从每个分片获取的文档数,而不是每个滚动的总文档数。因此文档总数将为Size() * number of shards
。每个卷轴可能有很多文档。 - 使用
terms
query查找某个字段与术语列表中的任何一个相匹配的文档(未分析)。
最终查询 json 看起来像
POST http://localhost:9200/examples/_search?scroll=1m
{
"size": 10000,
"query": {
"bool": {
"filter": [
{
"range": {
"date": {
"gte": "2016-08-04T00:00:00Z"
}
}
},
{
"term": {
"type": {
"value": "counter-type"
}
}
},
{
"terms": {
"counterId": [
1,
2,
3,
4,
5
]
}
}
]
}
}
}
关于c# - 如何检查列表中是否包含 NEST 中的术语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38896849/