如何检查列表中是否包含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是一个整数列表。我想检查项是否在列表中,但看起来不行。

是否知道如何检查术语是否与列表中的任何元素匹配?

如何检查列表中是否包含NEST中的术语

可以这样做

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查询的简写,包含两个必须查询子句。然而,在这个例子中,查询都应用了+一元运算符,boolfilter查询也是如此,所以将&&一起作为过滤器查询。
  • 当使用滚动时传递给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
            ]
          }
        }
      ]
    }
  }
}