elasticsearch - 如何减少Elasticsearch查询子句的数量?

标签 elasticsearch nest

我们编写了Elasticsearch查询,用于从特定日期范围的索引中获取分组数据。但是,如果我们增加日期范围,则查询大小会随着动态添加的日期范围子句而增加。
动态增加查询样本

 "query": {
"bool": {
  "filter": [
    {
      "bool": {
        "minimum_should_match": 1,
        "must": [
          {
            "range": {
              "startDate": {
                "gte": "2018-05-28T21:00:00Z",
                "lte": "2021-04-04T20:59:59Z"
              }
            }
          }
        ],
        "should": [
          {
            "bool": {
              "must": [
                {
                  "range": {
                    "startDate": {
                      "gte": "2019-12-24T04:30:00Z",
                      "lte": "2019-12-24T14:00:00Z"
                    }
                  }
                }
              ]
            }
          },
          {
            "bool": {
              "must": [
                {
                  "range": {
                    "startDate": {
                      "gte": "2020-11-09T04:30:00Z",
                      "lte": "2020-11-09T14:00:00Z"
                    }
                  }
                }
              ]
            }
          },
          {
            "bool": {
              "must": [
                {
                  "range": {
                    "startDate": {
                      "gte": "2020-07-28T14:00:00Z",
                      "lte": "2020-07-28T20:59:00Z"
                    }
                  }
                }
              ]
            }
          }
        ]
      }
    },
    {
      "term": {
        "tenantId": {
          "value": "b29aadd8-b1bb-4754-ab26-b59eebe6d86a"
        }
      }
    },
    {
      "term": {
        "status.keyword": {
          "value": "ProductionEnd"
        }
      }
    },
    {
      "range": {
        "startDate": {
          "gte": "2018-05-28T21:00:00Z",
          "lte": "2021-04-04T20:59:59Z"
        }
      }
    }
  ]
}},

我们有基于时间的数据,但我们希望按上述日期时间进行过滤,但我们希望过滤3个月的数据范围,并且范围过滤器过多,并且由于查询大小而导致错误(“too_many_clauses” )。因此,我们要减少查询子句。我们如何重写查询?

谢谢

最佳答案

我认为,您的选择之一是将如此大的应当查询拆分为应查询的较小块。这样, bool(boolean) 查询不会扩展1024个子句的限制。

bool
|___should
|   |___should query with 1024 range queries 
|   |___should query with 1024 range queries 
|   |___...  range queries 

这是我正在谈论的一个简单示例
var ranges = Enumerable.Range(0, 3000).Select((x, i) =>
    new QueryContainer(new DateRangeQuery {Name = $"query_{i}", Field = $"date", GreaterThan = "now"}));

var part1 = ranges.Take(1024)
    .Aggregate((agg, q) => agg || q);
var part2 = ranges.Skip(1024).Take(1024)
    .Aggregate((agg, q) => agg || q);

var searchResponse = await client.SearchAsync<object>(s => s
    .Query(q => q.Bool(b => b.Should(part1, part2))));

希望能有所帮助。

关于elasticsearch - 如何减少Elasticsearch查询子句的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59753333/

相关文章:

java - Spark框架: Listen for server stop

elasticsearch - ElasticSearch:是否可以在说明API中使用dfs_query_then_fetch?

c# - 检索映射时,嵌套忽略复杂属性

ElasticSearch Nest 2.x 索引和搜索嵌套对象

elasticsearch - Kibana:全新安装后无法创建仪表板

elasticsearch - 如何在Google Kubernetes引擎中部署单节点elasticsearch集群?

c# - 巢 : Issue in getting data from search response (ISearchResponse) in ElasticSearch

elasticsearch 对唯一术语与 ngram 术语进行评分

elasticsearch - Standard tokenfilter 在 Elasticsearch 中究竟做了什么?

amazon-web-services - AWS Elasticsearch EC2 Discovery,无法找到其他节点