如何在ElasticSearch索引中获取匹配通配符的词条列表
获取Elasticsearch中匹配通配符的词条列表
要从Elasticsearch索引中获取匹配指定通配符模式(比如Cont*ct)且实际存在于文档中的词条列表,主要有以下两种实用方法:
方法一:使用terms聚合配合通配符查询
这种方法通过先过滤匹配文档,再聚合去重得到唯一词条,是最常用的方式。
请求示例:
GET /你的索引名/_search { "size": 0, // 无需返回原始文档,只保留聚合结果 "query": { "wildcard": { "目标字段名": { "value": "Cont*ct", "case_insensitive": true // 可选参数,开启忽略大小写匹配 } } }, "aggs": { "匹配词条集合": { "terms": { "field": "目标字段名.keyword", // 必须用keyword子字段,确保聚合原始完整词条 "size": 10000 // 调整为你需要的最大返回数量,默认仅返回10个 } } } }
关键注意点:
- 必须使用
目标字段名.keyword:text类型字段会被分词,直接聚合text字段会得到分词后的碎片,而非原始完整词条;如果你的字段没有keyword子字段,需要先修改索引映射添加该子字段。 size参数:如果匹配的词条数量较多,要设置足够大的数值,避免截断结果。- 性能优化:如果你的通配符是前缀匹配(比如
Cont*),可以用prefix查询替代wildcard,效率会更高。
方法二:使用折叠查询(collapse)获取去重词条
如果需要同时查看词条关联的其他文档字段,或者不想用聚合,可通过折叠查询实现去重:
请求示例:
GET /你的索引名/_search { "query": { "wildcard": { "目标字段名": { "value": "Cont*ct", "case_insensitive": true } } }, "collapse": { "field": "目标字段名.keyword" }, "_source": false, // 关闭原始文档内容返回 "fields": ["目标字段名.keyword"], // 仅返回目标字段的词条值 "size": 10000 }
这种方法会返回每个唯一词条对应的一条文档,你可以从fields字段中提取匹配的词条。
内容的提问来源于stack exchange,提问作者Oleksii Zuiev
相关产品推荐
相关产品推荐

