ElasticSearch - 按空格分割的术语聚合

时间:2017-10-10 14:14:02

标签: elasticsearch aggregate aggregation

我有一堆弹性搜索文档,其中包含有关招聘广告的信息。我正在尝试聚合attributes.Title字段以从作业发布中提取“体验”实例的数量。例如初级,高级,领导等。相反,我得到的是与整个标题匹配的桶,而不是标题字段的每个单词。例如“初级Java开发人员”,“高级.NET分析师”等。

如何告诉弹性搜索根据标题中的每个单词拆分聚合,而不是匹配整个字段的值。

我后来想扩展查询以提取“技能级别”和“角色”,但是如果存储桶包含字段中的所有单词,只要它们被拆分为单独的存储桶,它也应该没问题。

当前查询:

GET /jobs/_search
{
  "query": {
    "simple_query_string" : {
        "query": "Java",
        "fields": ["attributes.Title"]
    }
  },
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "attributes.Title.keyword"
      }
    }
  }
}

不需要的输出:

{
  ...
  "hits": {
    "total": 63,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "group_by_state": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 14,
      "buckets": [{
          "key": "Junior Java Tester",
          "doc_count": 6
        },{
          "key": "Senior Java Lead",
          "doc_count": 6
        },{
          "key": "Intern Java Tester",
          "doc_count": 5
        },
        ...
      ]
    }
  }
}

期望输出:

{
  ...
  "hits": {
    "total": 63,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "group_by_state": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 14,
      "buckets": [{
          "key": "Junior",
          "doc_count": 12
        },{
          "key": "Senior",
          "doc_count": 8
        },{
          "key": "Tester",
          "doc_count": 5
        },{
          "key": "Intern",
          "doc_count": 5
        },{
          "key": "Analyst",
          "doc_count": 5
        },
        ...
      ]
    }
  }
}

1 个答案:

答案 0 :(得分:2)

我推断您的地图类型为keyword,因为您在名为"attributes.Title.keyword"的字段上进行了汇总。 keyword映射不会对您的字符串进行标记,因此在聚合时,它会将整个字符串视为唯一键。

您希望将标题字段的映射更新为type: "text"。我不会将其称为title.keyword但是title.analyzed之类的内容 - 如果您没有指定分析器,Elasticsearch将应用standard analyzer这应该足以让您开始。如果你只希望你的标题按空格分解(而不是词干和其他东西),你也可以使用whitespace analyzer。你在你的聚合中获得很多其他的词,但我假设你正在寻找这些共享的经验修饰符令牌并且基于频率,它们将升至顶部。

如果您使用的是5.x,请务必设置' fielddata:true'自text fields aren't available for aggregation by default

映射:

"properties" : {
    "attributes" : {
        "properties" : {
            "title" : {
                "properties" : {
                    "keyword" : { "type" : "keyword" },
                    "analyzed" : { "type" : "text", "analyzer" : "whitespace", "fielddata" : true }
                }
            }
        }
    }
 }