Elasticsearch 6.2.3:如何基于_source字段实现通配符查询?
Elasticsearch 6.2.3 基于_source字段的通配符查询实现
Hey there! 你已经能通过_id成功查询Elasticsearch记录了,要实现基于_source里的字段(比如code)的通配符查询其实很简单,我结合你使用的ES 6.2.3版本,给你一步步说明具体实现方式。
核心思路:使用Wildcard查询
Elasticsearch提供了WildcardQueryBuilder来实现通配符查询,支持两种通配符:
*:匹配任意长度的字符序列(包括空字符)?:匹配单个字符
比如你想匹配code字段以abc开头的记录,就可以用abc*;想匹配包含123的记录,就用*123*。
修改你的Java代码实现
我基于你现有的查询代码,改写一个通过code字段通配符查询的方法:
import org.elasticsearch.index.query.WildcardQueryBuilder; import java.util.ArrayList; import java.util.List; import java.util.Map; public List<Product> getProductsByCodeWildcard(String wildcardPattern) { List<Product> productList = new ArrayList<>(); // 1. 构建搜索请求 SearchRequest searchRequest = new SearchRequest(INDEX); searchRequest.types(TYPE); // 2. 构建通配符查询条件 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); // 指定查询的字段为code,传入通配符表达式 WildcardQueryBuilder wildcardQuery = new WildcardQueryBuilder("code", wildcardPattern); searchSourceBuilder.query(wildcardQuery); // 可选:设置返回结果数量,默认ES只返回10条,按需调整 searchSourceBuilder.size(100); searchRequest.source(searchSourceBuilder); // 3. 发送请求并解析结果 try { SearchResponse searchResponse = restHighLevelClient.search(searchRequest); SearchHit[] searchHits = searchResponse.getHits().getHits(); for (SearchHit hit : searchHits) { Map<String, Object> sourceAsMap = hit.getSourceAsMap(); Product product = new Product(); product.setName(sourceAsMap.get("name").toString()); product.setCode(sourceAsMap.get("code").toString()); // 其他字段如vendor_id、catalog_id等按需赋值 productList.add(product); } } catch (IOException e) { e.printStackTrace(); } return productList; }
额外的灵活查询方式:Query String查询
如果你需要更灵活的查询(比如同时对多个字段使用通配符),可以用QueryStringQueryBuilder,示例:
import org.elasticsearch.index.query.QueryStringQueryBuilder; // 匹配code包含123,或者name包含prod的记录 QueryStringQueryBuilder queryStringQuery = new QueryStringQueryBuilder("code:*123* OR name:*prod*"); searchSourceBuilder.query(queryStringQuery);
注意事项
- 避免以
*开头的通配符(比如*abc):这种写法会导致ES遍历大量倒排索引项,查询性能大幅下降,尽量从明确的前缀开始匹配。 - 字段类型适配:如果你的
code字段是text类型(默认分词),而你需要精确匹配通配符,建议使用其keyword子字段(比如code.keyword),此时查询语句要改为:WildcardQueryBuilder wildcardQuery = new WildcardQueryBuilder("code.keyword", wildcardPattern);
ES 6.2.3 相关语法说明
在ES 6.2.3中,Wildcard查询属于term-level查询,专门用于匹配符合通配符模式的文档。使用时需要注意转义特殊字符(如\、+、-等),如果你的通配符表达式包含这些字符,需要用\转义。
内容的提问来源于stack exchange,提问作者Karthikeyan
相关产品推荐
相关产品推荐

