【问题标题】:Elastic Search list of unique values of a field from Match query匹配查询中字段唯一值的弹性搜索列表
【发布时间】:2018-02-09 06:43:39
【问题描述】:

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

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

给我一​​个此类项目的列表(在删除不相关的数据之后)

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

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

弹性搜索是否本机支持这一点?我可以链接我的查询,以便match 查询的输出由aggs 查询操作吗?还是我必须写一个服务一个一个地遍历item并获取列表?

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

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

【问题讨论】:

    标签: elasticsearch


    【解决方案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"
          }
        }
      }
    }
    

    您应该会收到一个响应,其中包含包含所需数据的存储桶聚合。

    【讨论】:

    • 你能给我举个例子说明它在我的情况下如何使用吗?
    • 它有效,你能告诉我为什么它没有再次从文档中获取mfg_name 并对其执行聚合吗?为什么它直接在查询而不是文档上执行聚合?另外,您能告诉我使用"field": "mfg_name.keyword" 是否可以?
    • 我没抓到你。您想要获取相机生产商的列表,因此您必须汇总过滤后的结果。如果您对索引进行聚合,您将获得任何产品的整个生产者列表。关于第二个问题,我没有使用过。当我必须对字符串字段进行聚合时,我总是使用这种方法。此外,根据您使用的版本,您可以将字段定义为关键字而不是未分析的文本。
    猜你喜欢
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    相关资源
    最近更新 更多