You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:04:04