我是靠谱客的博主 清新翅膀,这篇文章主要介绍SpringBoot Elasticsearch组合查询封装,现在分享给大家,希望可以做个参考。

最近项目组需要用到Elasticsearch,封装了ESQueryBuilder方便条件组合,结合ES工具类使用效果更佳,下面是ES工具类传送门:

SpringBoot Elasticsearch工具类封装

本文包括ES四大查询模式构建工具类,一个查询模式定义类,一个构建工厂类,一个最终拼装类。使用了简单工厂设计模式加反射,特此记录便于日后查阅。

1、代码结构

  

2、maven依赖

复制代码
1
2
3
4
5
<dependency> <groupId>org.elasticsearch.plugin</groupId> <artifactId>transport-netty4-client</artifactId> <version>6.7.2</version> </dependency>

3、IESQueryBuilders

复制代码
1
2
3
4
5
6
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(); }

4、ESMust

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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; } }

5、ESMustNot

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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; } }

6、ESShould

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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; } }

7、ESFilter

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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; } }

8、ESQueryMode

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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; } }

9、ESQueryBuilderFactory

复制代码
1
2
3
4
5
6
7
public class ESQueryBuilderFactory { public static IESQueryBuilders creatESQueryBuilder(ESQueryMode mode) throws ClassNotFoundException, IllegalAccessException, InstantiationException { Class<?> clazz = Class.forName(mode.mode()); return (IESQueryBuilders) clazz.newInstance(); } }

10、IESQueryProduce

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/** * @Classname: com.openailab.oascloud.datacenter.common.build.IESQueryProduce * @Description: ES组装器 * @Author: zxzhang * @Date: 2019/7/9 */ public interface IESQueryProduce { /** * 获取构造器 * * @param * @return org.elasticsearch.index.query.BoolQueryBuilder * @author zxzhang * @date 2019/7/9 */ BoolQueryBuilder getBoolQueryBuilder(); /** * 获取组装器 * * @param esQueryBuilders * @return com.openailab.oascloud.datacenter.common.build.IESQueryProduce * @author zxzhang * @date 2019/7/9 */ IESQueryProduce getProduct(IESQueryBuilders esQueryBuilders); }

11、ESQueryProduce

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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查询语句了。

比如:

复制代码
1
2
3
4
5
6
7
8
IESQueryBuilders must = ESQueryBuilderFactory.creatESQueryBuilder(ESQueryMode.MUST); must.termQuery("termName", "value1","value1"); must.wildcardQuery("wildName","value1"); IESQueryBuilders should = ESQueryBuilderFactory.creatESQueryBuilder(ESQueryMode.SHOULD); should.wildcardQuery("wildName", "value1","value2"); BoolQueryBuilder boolQueryBuilder = esQueryProduce.getProduct(must).getProduct(should).getBoolQueryBuilder();

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

最后

以上就是清新翅膀最近收集整理的关于SpringBoot Elasticsearch组合查询封装的全部内容,更多相关SpringBoot内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(99)

评论列表共有 0 条评论

立即
投稿
返回
顶部