Elasticsearch -是否可以根据特定术语进行过滤?

w7t8yxp5  于 2023-08-03  发布在  ElasticSearch
关注(0)|答案(1)|浏览(106)

是否可以过滤特定术语?例如,我有一个包含项目(项目1,项目2,项目3等)的索引,每个项目都有一个值(值1,值2,值3等)。
我想做的是为每一个项目,检索一个特定的值,并对这些值进行聚合。
例如,用户想要知 prop 有值1和值2的项目1的平均值、具有值2和值4的项目2的平均值、具有值1和值6的项目3的平均值等。
一个项目可以有多个值,一个值可以有多个项目。一个用户可以有一万多个项目,每个项目可以有一百多个值。

"size": 0,
        "aggs": {
            "per_term": {
                "terms": {
                    "field": "item",
                    "size": 10000
                },
                "aggs": {
                            "avg_value": {
                                "avg": {
                                    "field": "value"
                                }
                            }
                    }
                }
            }
        }
    }

字符串
我知道可以计算每个项目的平均值,但我可以过滤每个特定项目的值吗?

kcrjzv8t

kcrjzv8t1#

当然,您可以在Elasticsearch的聚合中利用筛选器为某些项挑选特定的值。要实现这一点,必须为查询的aggs部分中的每个项插入一个筛选器。
下面是一个经过修改的Elasticsearch查询变体,它可以完全实现这一点:

{
  "size": 0,
  "aggs": {
    "item1_aggs": {
      "filter": {
        "bool": {
          "must": [
            { "term": { "item": "item1" }},
            { "terms": { "value": ["value1", "value2"] }}
          ]
        }
      },
      "aggs": {
        "avg_value": {
          "avg": { "field": "value" }
        }
      }
    },
    "item2_aggs": {
      "filter": {
        "bool": {
          "must": [
            { "term": { "item": "item2" }},
            { "terms": { "value": ["value2", "value4"] }}
          ]
        }
      },
      "aggs": {
        "avg_value": {
          "avg": { "field": "value" }
        }
      }
    },
    "item3_aggs": {
      "filter": {
        "bool": {
          "must": [
            { "term": { "item": "item3" }},
            { "terms": { "value": ["value1", "value6"] }}
          ]
        }
      },
      "aggs": {
        "avg_value": {
          "avg": { "field": "value" }
        }
      }
    }
  }
}

字符串
在这个查询中,每个项目都有自己的筛选器和汇总。在每个筛选器中,都有一个指定项目的术语筛选器和一个确定该项目允许的值的术语筛选器。然后,有一个平均聚合,它只对匹配过滤器的文档进行操作。

相关问题