ElasticSearch - 术语聚合按空白分割
问题描述:
我有一堆包含招聘广告信息的弹性搜索文档。我试图汇总attributes.Title
字段以从作业发布中提取“体验”实例的数量。例如初级,高级,领导等。相反,我得到的是与整个标题相匹配的桶,而不是每个单词都是标题栏。例如“初级Java开发人员”,“高级.NET分析师”等。ElasticSearch - 术语聚合按空白分割
如何判断弹性搜索是否根据标题中的每个单词分割聚合,而不是匹配整个字段的值。
我稍后想要扩展查询以提取“技能级别”和“角色”,但如果桶中包含字段中的所有单词,只要它们被拆分为单独的桶即可。
目前查询:
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
},
...
]
}
}
}
答
我推断您的地图类型为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 }
}
}
}
}
}