Elasticsearch术语聚合中拆分多艺人字段请求协助
解决Elasticsearch逗号分隔字段的Term聚合问题
核心问题分析
你的Artist Name(s)字段当前是按整体字符串索引的,未将逗号分隔的艺人名称拆分为独立term,导致terms聚合无法按单个艺人统计歌曲数量。
具体解决方案
1. 创建自定义分词器
先在索引设置中定义一个按逗号拆分文本的分词器:
{ "settings": { "analysis": { "analyzer": { "comma_split_analyzer": { "tokenizer": "comma_split_tokenizer" } }, "tokenizer": { "comma_split_tokenizer": { "type": "pattern", "pattern": "," } } } } }
该分词器会以逗号为分隔符,将字段内容拆分为独立的艺人名称。
2. 修改字段Mapping
给Artist Name(s)字段添加多字段(multi-field),使用上述自定义分词器,同时保留原字段的完整值:
{ "mappings": { "properties": { "Artist Name(s)": { "type": "text", "fields": { "split": { "type": "text", "analyzer": "comma_split_analyzer", "fielddata": true } } } } } }
注意:若索引已有数据,修改mapping后需重新索引所有数据,新分词规则才会生效。
3. 基于拆分字段执行聚合
调整聚合查询,使用Artist Name(s).split字段进行terms聚合:
{ "size": 0, "aggs": { "artist_count": { "terms": { "field": "Artist Name(s).split", "size": 100 } } } }
额外优化建议
如果艺人名称前后带空格(例如"周杰伦, 陈奕迅"),可在分词器中添加trim过滤器去除空格:
{ "settings": { "analysis": { "analyzer": { "comma_split_analyzer": { "tokenizer": "comma_split_tokenizer", "filter": ["trim"] } }, "tokenizer": { "comma_split_tokenizer": { "type": "pattern", "pattern": "," } } } } }
这样拆分后的艺人名称无多余空格,聚合结果更精准。
内容的提问来源于stack exchange,提问作者Ant_brun
相关产品推荐
相关产品推荐

