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

时间:2016-08-11 12:48:28

标签: c# .net elasticsearch nest

我的查询如下:

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是整数列表。我想检查该术语是否在列表中,但看起来这不起作用。

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

1 个答案:

答案 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
            ]
          }
        }
      ]
    }
  }
}