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

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

有什么想法可以检查该术语是否与列表中的任何元素匹配吗?

最佳答案

像下面这样的事情就可以了

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/

相关文章:

c# - ExecuteScalar 是否在 SELECT 后立即返回?

c# - Xamarin.Android与依赖项绑定(bind)到第三方SDK

elasticsearch - minimum_should_match + 短语查询

c# - Visual Studio (xamarin) 在执行此操作时卡在后台运行的 AAPT.exe 的每个构建、清理或重建上

c# - 打开文档时阻止Word打开

.net - 用 "A"为抽象类加前缀,类似接口(interface)的前缀为 "I"?

c# - 在大对象堆内存中预分配一些内存

elasticsearch - Elasticsearch Aggregation无法正常工作

elasticsearch - 如何扩展 Elasticsearch 日期范围直方图聚合查询?

javascript - 在网格的所有复选框中设置复选框值