如何检查列表中是否包含NEST中的术语
本文关键字:是否 包含 术语 NEST 列表 何检查 检查 | 更新日期: 2023-09-27 18:02:02
我的查询如下所示:
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
时,它是bool
must
查询的简写,包含两个必须查询子句。然而,在这个例子中,查询都应用了+
一元运算符,bool
和filter
查询也是如此,所以将&&
一起作为过滤器查询。 - 当使用滚动时传递给
Size()
的值(即指定Scroll()
时间)是每次滚动从每个shard获取的文档数量,而不是每次滚动的文档总数。所以总文档数是Size() * number of shards
。这可能是每次滚动很多文档。 - 使用
terms
查询查找与术语列表(未分析)中的任何一个字段匹配的文档。
结束查询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
]
}
}
]
}
}
}