【问题标题】:Elasticsearch add range filter to aggregationElasticsearch 将范围过滤器添加到聚合中
【发布时间】:2022-08-04 18:49:51
【问题描述】:

我没有在弹性搜索中进行过试验,我必须为字段“data.elements.id_element”添加一个范围过滤器到下一个查询:

{
    \"aggs\": {
      \"2\": {
        \"date_histogram\": {
          \"field\": \"@timestamp\",
          \"calendar_interval\": \"1d\",
          \"min_doc_count\": 1
        },
        \"aggs\": {
          \"elementId\": {
            \"terms\": {
              \"field\": \"data.elements.id_element\",
              \"order\": {
                \"_count\": \"desc\"
              },
              \"size\": 1000
            },
            \"aggs\": {
              \"Device\": {
                \"filters\": {
                },
                \"aggs\": {
                }
              }
            }
          }
        }
      }
    },
    \"size\": 0,
    \"docvalue_fields\": [
      {
        \"field\": \"@timestamp\",
        \"format\": \"date_time\"
      }
    ],
    \"query\": {
      \"bool\": {
        \"filter\": [
          {
            \"range\": {
              \"@timestamp\": {
                \"gte\": \"startDate\",
                \"lte\": \"endDate\",
                \"format\": \"strict_date_optional_time\"
              }
            }
          }
        ]
      }
    }
  } 

我试图像这样添加到范围部分,但它被忽略了:

{
    \"aggs\": {
      \"2\": {
        \"date_histogram\": {
          \"field\": \"@timestamp\",
          \"calendar_interval\": \"1d\",
          \"min_doc_count\": 1
        },
        \"aggs\": {
          \"elementId\": {
            \"terms\": {
              \"field\": \"data.elements.id_element\",
              \"order\": {
                \"_count\": \"desc\"
              },
              \"size\": 1000
            },
            \"aggs\": {
              \"Device\": {
                \"filters\": {
                },
                \"aggs\": {
                }
              }
            }
          }
        }
      }
    },
    \"size\": 0,
    \"docvalue_fields\": [
      {
        \"field\": \"@timestamp\",
        \"format\": \"date_time\"
      }
    ],
    \"query\": {
    \"bool\": {
      \"filter\": [
        {
          \"range\": {
            \"@timestamp\": {
              \"gte\": \"startDate\",
              \"lte\": \"endDate\",
              \"format\": \"strict_date_optional_time\"
            }
          }
        },
        {
          \"range\": {
            \"data.elements.id_element\": {
              \"gte\": 1,
              \"lte\": 1001
            }
          }
        }
      ]
    }
  }
}

我也试过这个:

{
    \"aggs\": {
      \"2\": {
        \"date_histogram\": {
          \"field\": \"@timestamp\",
          \"calendar_interval\": \"1d\",
          \"min_doc_count\": 1
        },
        \"aggs\": {
          \"elementId\": {
            \"terms\": {
              \"field\": \"data.elements.id_element\",
              \"order\": {
                \"_count\": \"desc\"
              },
              \"size\": 1000
            },
            \"aggs\": {
              \"Device\": {
                \"filters\": {
                },
                \"aggs\": {
                }
              }
            }
          }
        }
      }
    },
    \"size\": 0,
    \"docvalue_fields\": [
      {
        \"field\": \"@timestamp\",
        \"format\": \"date_time\"
      }
    ],
     \"query\": {
      \"bool\": {
      \"must\": [
        {
          \"query_string\": {
            \"query\": \"data.elements.id_element:[1 TO 1001]\",
            \"analyze_wildcard\": true,
          }
        }
      ],
        \"filter\": [
        {
          \"range\": {
            \"@timestamp\": {
              \"gte\": \"startDate\",
              \"lte\": \"endDate\",
              \"format\": \"strict_date_optional_time\"
            }
          }
        }
      ]
      }
    }
  }

同样的结果,aleatoire 元素 id 并且不尊重范围过滤器/条件。 请有任何想法。

谢谢。

    标签: elasticsearch


    【解决方案1】:

    考虑到您想对特定聚合应用过滤器,可以按如下方式完成:

    {
       "aggs": {
        "elementId": {
          "aggs": {
            "elementId": {
              "terms": {
                  "field": "data.elements.id_element",
                  "order": {
                    "_count": "desc"
                  },
                  "size": 1000
                }
            }
          },
          "filter": {
            "bool": {
              "filter": [
                {
                  "range": {
                  "@timestamp": {
                  "gte": "startDate",
                  "lte": "endDate",
                  "format": "strict_date_optional_time"
                }
              }
                }
              ]
            }
          }
        }
      }
     }
    

    【讨论】:

    • 它给出了相同的结果......一些ID在其他范围内
    【解决方案2】:

    对于可能面临同样问题的其他人,我使用了分区,因此我已将查询发送到此文档之后的许多查询中:

    https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#_filtering_values_with_partitions

    也许有更好的解决方案,但这在我的上下文中对我有用。

    【讨论】:

      猜你喜欢
      • 2014-10-09
      • 2018-11-28
      • 2015-09-17
      • 2014-02-02
      • 2021-11-06
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      相关资源
      最近更新 更多