我的查询如下:
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
是整数列表。我想检查该术语是否在列表中,但看起来这不起作用。
我如何检查该术语是否与列表中的任何元素匹配?
答案 0 :(得分:1)
以下内容将会这样做
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
时,它是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
]
}
}
]
}
}
}