“匹配查询”中字段的唯一值的弹性搜索列表

时间:2018-02-09 06:43:40

标签: elasticsearch

我使用弹性搜索来获取所有产品的列表(比如相机),但我想从匹配查询中得到的结果中动态填充制造商列表。

{
  "query": {
    "match": {
      "product_type" : "CAMERA"
    }
  }
}

给我一​​个这样的项目列表(删除不相关的数据后)

{
    "_score": 11.234668,
    "_source": {
        "product_type": "CAMERA",
        "mfg_name": "SONY"
    }
}

我无法汇总文档中的所有mfg_name,因为它也会包含其他产品的制造商。我想做什么,得到我查询的产品类型的所有mfg_name

弹性搜索本身是否支持?我可以链接我的查询,以便match查询对aggs查询的输出进行操作吗?或者我是否必须编写服务以逐个浏览项目并获取列表?

编辑:我使用它来获取聚合,因为默认情况下在文本字段上禁用了Fielddata

{
"size": 0,
"aggs" : {
    "manufacturer" : {
        "terms" : { "field" : "mfg_name.keyword",  "size" : 500 }
    }
}}

1 个答案:

答案 0 :(得分:1)

您可以汇总查询结果。只需要在同一个查询中写下所有内容。

Aggregation over the query results

Terms aggregation

您应该将mfg_name字段编入索引为非分析字符串,以便能够对该字段进行聚合。否则你会得到奇怪的结果,比如SON的聚合,例如ONY的另一个聚合。

在此处回复以便能够粘贴代码。

更新索引

PUT my_index {  "mappings": {
    "doc": { 
      "properties": { 
        "mfg_name":    { "type": "text"  }, 
        "mfg_name_na":     { "type": "text" , index: "not_analyzed" }
      }
    }
  }
}

我将mfg_name复制到非分析字段,以便您可以对原始字段进行全文搜索,然后对未经分析的字段进行聚合。

然后重新索引,你可以像这样查询:

{
  "query": {
    "match": {
      "product_type": "CAMERA"
    }
  },
  "aggs": {
    "producers": {
      "terms": {
        "field": "mfg_name_na"
      }
    }
  }
}

您应该收到一个包含带有所需数据的存储桶聚合的响应。