Elasticsearch 7.x Kibana自由文本查询需求(替代废弃_all字段)
替代Elasticsearch 7.x中废弃的_all字段实现自由文本查询
在Elasticsearch 7.x及后续版本,_all字段已被移除,以下是几种可行的替代方案,可满足你搜索"JOHN"(包含JOHN@gmail.com这类场景)、"008"的需求:
方案1:自定义全文字段(推荐,性能最优)
通过copy_to参数将需要搜索的字段统一复制到一个自定义全文字段,后续查询仅针对该字段,可控性和性能都更优。
步骤1:更新索引映射
给需要参与搜索的字段添加copy_to属性,指定目标全文字段(比如full_text):
PUT /your_index/_mapping { "properties": { "email": { "type": "text", "copy_to": "full_text" }, "username": { "type": "text", "copy_to": "full_text" }, // 按需添加其他需要搜索的字段 "full_text": { "type": "text" } } }
步骤2:执行查询
用match_phrase_prefix查询自定义字段,和你之前基于_all的查询逻辑一致:
{ "bool": { "must": [ { "match_phrase_prefix": { "full_text": "JOHN" } } ] } }
搜索"008"时,只需替换query的值为"008"即可,无匹配时自动返回空结果。
方案2:使用multi_match查询(无需修改映射,适合临时场景)
直接指定要搜索的多个字段,或用通配符匹配所有text类型字段,无需修改现有映射:
{ "bool": { "must": [ { "multi_match": { "query": "JOHN", "type": "phrase_prefix", "fields": ["*"] // 匹配所有text字段,也可指定具体字段如["email", "username"] } } ] } }
注意:用*匹配所有字段时,若索引字段较多,性能会略逊于自定义全文字段方案。
方案3:使用query_string查询(支持灵活搜索语法)
如果需要更灵活的搜索规则(比如通配符、逻辑运算),可以用query_string:
{ "bool": { "must": [ { "query_string": { "query": "JOHN*", "fields": ["*"] } } ] } }
该方案支持JOHN*这类前缀匹配,但通配符开头的查询(如*OHN)性能较差,建议避免使用。
内容的提问来源于stack exchange,提问作者Code Noob
相关产品推荐
相关产品推荐

