elasticsearch搜索引擎查询java工具类

本文介绍了一套针对Elasticsearch 5.4版本的Java工具类,支持多种查询模式,包括必须匹配、不应匹配、应该匹配及过滤等,通过简单工厂设计模式和反射实现了灵活的查询语句构建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Elasticsearch查询java工具类

项目组使用Elasticsearch搜索引擎也有一段时间了,刚开始是2.4版本,现在又要在新的工程中使用,准备升级为5.4版本,以前的工具类也不好用了,没办法,只能简单的写一个构建查询语句的工具类。小弟自知功底不够,有问题的地方还请大佬多多批评指正。

注:由于所在公司特殊性,所以贴出的不是正在使用工程中的源码,而是我新建了一个工程去存放这些源码。

接下来贴上代码结构:

最重要的是esbuilder中的文件,其中包括es四大查询模式构建工具类,一个查询模式定义文件,一个构建工厂类,一个最终拼装类。使用了简单工厂设计模式加反射。

下面是各个文件的具体代码:

IESQueryBuilders:

 

public interface IESQueryBuilders {
    IESQueryBuilders termQuery(String name, String... valve) throws  Exception;
    IESQueryBuilders wildcardQuery(String name, String... values) throws Exception;
    IESQueryBuilders rangeQuery(String name, String from, String to) throws Exception;
    BoolQueryBuilder getBoolQueryBuilder();
}

 

ESMust:

 

 

public class ESMust implements IESQueryBuilders {

    private BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();

    @Override
    public BoolQueryBuilder getBoolQueryBuilder() {
        return boolQueryBuilder;
    }
    @Override
    public ESMust termQuery(String name, String... values)  throws Exception {
        boolQueryBuilder.must(QueryBuilders.termsQuery(name, values));
        return this;
    }

    @Override
    public ESMust wildcardQuery(String name, String... values)  throws Exception{
        for (String value : values){
            boolQueryBuilder.must(QueryBuilders.wildcardQuery(name, "*" + value + "*"));
        }
        return this;
    }

    @Override
    public ESMust rangeQuery(String name, String from, String to) throws Exception {
        boolQueryBuilder.must(QueryBuilders.rangeQuery(name).from(from, true).to(to, true));
        return this;
    }
}

ESMustNot:

 

public class ESMustNot implements IESQueryBuilders {

    private BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
    @Override
    public BoolQueryBuilder getBoolQueryBuilder() {
        return boolQueryBuilder;
    }

    @Override
    public ESMustNot termQuery(String name, String... values)  throws Exception {
        boolQueryBuilder.mustNot(QueryBuilders.termQuery(name, values));
        return this;
    }

    @Override
    public ESMustNot wildcardQuery(String name, String... values) throws Exception {
        for (String value : values){
            boolQueryBuilder.mustNot(QueryBuilders.wildcardQuery(name, "*" + value + "*"));
        }
        return this;
    }

    @Deprecated
    public ESMustNot rangeQuery(String name, String from, String to) throws Exception {
        return null;
    }
}

ESShould:

 

public class ESShould implements IESQueryBuilders {
    private BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
    @Override
    public BoolQueryBuilder getBoolQueryBuilder() {
        return boolQueryBuilder;
    }

    @Override
    public ESShould termQuery(String name, String... values) throws Exception {
        boolQueryBuilder.should(QueryBuilders.termsQuery(name, values));
        return this;
    }

    @Override
    public ESShould wildcardQuery(String name, String... values) throws Exception {
        for (String value : values){
            boolQueryBuilder.should(QueryBuilders.wildcardQuery(name, "*" + value + "*"));
        }
        return this;
    }

    @Deprecated
    public ESShould rangeQuery(String name, String from, String to) throws Exception {
        return null;
    }
}

ESFilter:

 

public class ESFilter implements IESQueryBuilders {
    private BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
    @Override
    public BoolQueryBuilder getBoolQueryBuilder() {
        return boolQueryBuilder;
    }

    @Override
    public ESFilter termQuery(String name, String... values) throws Exception {
        boolQueryBuilder.filter(QueryBuilders.termsQuery(name, values));
        return this;
    }

    @Override
    public ESFilter wildcardQuery(String name, String... values) throws Exception {
        for (String value : values){
            boolQueryBuilder.filter(QueryBuilders.wildcardQuery(name, "*" + value + "*"));
        }
        return this;
    }

    @Deprecated
    public ESFilter rangeQuery(String name, String from, String to) throws Exception {

        return null;
    }
}

ESQueryMode:

 

public enum ESQueryMode implements Serializable{
      MUST("com.example.esbuilder.ESMust"),
        MUST_NOT("com.example.esbuilder.ESMustNot"),
        SHOULD("com.example.esbuilder.ESShould"),
        FILTER("com.example.esbuilder.ESFilter");

    private String mode;

    ESQueryMode(String mode) {
        this.mode = mode;
    }

    public String mode() {
        return mode;
    }
}

ESQueryBuilderFactory:

 

public class ESQueryBuilderFactory {

    public static IESQueryBuilders creatESQueryBuilder(ESQueryMode mode) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Class<?> clazz = Class.forName(mode.mode());
        return (IESQueryBuilders) clazz.newInstance();
    }
}

ESQueryProduce:

 

public class ESQueryProduce implements IESQueryProduce {

    private BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();

    @Override
    public BoolQueryBuilder getBoolQueryBuilder() {
        return boolQueryBuilder;
    }
    @Override
    public IESQueryProduce getProduct(IESQueryBuilders esQueryBuilders) {
        boolQueryBuilder.must(esQueryBuilders.getBoolQueryBuilder());
        return this;
    }
}

然后就能自由的拼接复杂的es查询语句了。

比如:

 

IESQueryBuilders must = ESQueryBuilderFactory.creatESQueryBuilder(ESQuaryMode.MUST);
must.termQuery("termName", "value1","value1");
must.wildcardQuery("wildName","value1");

IESQueryBuilders should = ESQueryBuilderFactory.creatESQueryBuilder(ESQuaryMode.SHOULD);
should.wildcardQuery("wildName", "value1","value2");

BoolQueryBuilder boolQueryBuilder = esQueryProduce.getProduct(must).getProduct(should).getBoolQueryBuilder();

然后把最终生成的boolQueryBuilder放在SearchRequestBuilder中查询就可以了。

代码地址:https://github.com/wanglclx/EsSearchDemo

转载请注明出处:https://blog.youkuaiyun.com/wanglc7/article/details/80351551,谢谢。

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值