如何从 ElasticSearch 记录中聚合匹配的 prefix/phrase?

How to aggregate on a matched prefix/phrase from ElasticSearch records?

我有一个字段 "Departments",它是一个列表: { "Departments": ["Food Service","Software Development","Manufacturing","Deployment"] }'

我想聚合 "Department" 中以 "d" 开头的元素。即,从所有记录进行部署。

我能够找到一个元素的前缀为 "d" 但无法对其进行聚合的记录。相反,我在查询前缀 "d".

后返回的记录中汇总了 "Departments" 的所有元素
{
 "query": {
        "bool": {
            "filter": {
                "match_phrase_prefix": {
                    "Departments": {"query": "a"}
                }
            }
        }
    },
    "aggs" : {
        "all_locations" : {
            "terms" : { "field" : "Departments" }
        }
    }
}

例如,如果我总共有4条记录,其中"Deployment"存在于1条中,那么我想要:

部署:1

但我实际得到的是该记录中存在 "Deployment" 的所有元素的频率。

部署:1, Food:1, Services:1, Software:1, Development:1, Manufacturing:1

这很简单。只需使用include keyword and add the required regex value to it, in the Terms Query,你就会得到你想要的。

我在下面提到了解决方案:


POST <your_index_name>/_search
{  
   "query":{  
      "bool":{  
         "filter":{  
            "match_phrase_prefix":{  
               "Departments":{  
                  "query":"a"
               }
            }
         }
      }
   },
   "aggs":{  
      "all_locations":{  
         "terms":{  
            "field":"Departments",
            "include":"D.*"
         }
      }
   }
}

以上查询只会 return 个以 D 开头的聚合桶。您可以将其更改为 Dep.* 以测试 Deployment

如果您认为它解决了您的要求,请随时 accept/upvote 回答。欢迎查询。