ElasticSearch5.4 基本增删查改、搜索模板类

前面几篇我们学习了那么多ES知识,那么怎样运用到实际项目中去呢?本篇讲一讲ES与spring的集成,让ES能投入实际生产中去。

1、Maven依赖

<!-- elasticsearch的spring-data包 -->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
    <version>x.y.z.RELEASE</version>
</dependency>

<!-- elasticsearch客户端,version填入本地安装好的ES版本号 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>x.y.z</version>
</dependency>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

spring-data-elasticsearch与elasticsearch的版本对应关系:

spring data elasticsearchelasticsearch
3.2.x6.5.0
3.1.x6.2.2
3.0.x5.5.0
2.1.x2.4.0
2.0.x2.2.0
1.3.x1.5.2

maven仓库中的spring-data-elasticsearch版本:https://mvnrepository.com/artifact/org.springframework.data/spring-data-elasticsearch
注意:截止到 2018-12-17,一直还没有出3.2.x,如果你使用的elasticsearch是6.5.0以上的版本,建议elasticsearch降低到6.2.2,否则会出现很多未知的错误,这是个坑!

2、添加xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/data/elasticsearch
http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd">
	<!-- 扫描包路径 -->
	<elasticsearch:repositories base-package="com.demo.elasticsearch.*" />
<span class="token comment">&lt;!-- 声明elasticsearch客户端 --&gt;</span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">elasticsearch:</span>transport-client</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>client<span class="token punctuation">"</span></span> <span class="token attr-name">cluster-nodes</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>localhost:9300<span class="token punctuation">"</span></span> <span class="token attr-name">cluster-name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>home<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>

<span class="token comment">&lt;!-- 声明elasticsearchTemplate --&gt;</span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>bean</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>elasticsearchTemplate<span class="token punctuation">"</span></span>
    <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>org.springframework.data.elasticsearch.core.ElasticsearchTemplate<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>constructor-arg</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>client<span class="token punctuation">"</span></span> <span class="token attr-name">ref</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>client<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>bean</span><span class="token punctuation">&gt;</span></span>

</beans>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

3、使用elasticsearchTemplate

创建BookEntity实体:
public class BookEntity {
	private String author;
	private String name;
	private String id;
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
引用elasticsearchTemplate
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;

 
 
  • 1
  • 2
创建索引
// 1、直接用名称创建
elasticsearchTemplate.createIndex("book");

// 2、填入class对象
elasticsearchTemplate.createIndex(BookEntity.class);

  • 1
  • 2
  • 3
  • 4
  • 5
创建数据

单条数据:

BookEntity bookEntity = new BookEntity();
bookEntity.setId("2");
bookEntity.setAuthor("老李");
bookEntity.setName("一起学习es");

IndexQuery indexQuery = new IndexQueryBuilder()
.withId(bookEntity.getId())
.withObject(bookEntity)
.build();
elasticsearchTemplate.index(indexQuery);

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

多条数据:

BookEntity bookEntity = new BookEntity();
bookEntity.setId("2");
bookEntity.setAuthor("老李");
bookEntity.setName("一起学习netty");

IndexQuery indexQuery1 = new IndexQueryBuilder()
.withId(bookEntity.getId())
.withObject(bookEntity)
.build();
// elasticsearchTemplate.index(indexQuery);
indexQueries.add(indexQuery1);

BookEntity bookEntity2 = new BookEntity();
bookEntity.setId(“3”);
bookEntity.setAuthor(“老刘”);
bookEntity.setName(“netty菜鸟入门”);

IndexQuery indexQuery2 = new IndexQueryBuilder()
.withId(bookEntity2.getId())
.withObject(bookEntity)
.build();
indexQueries.add(indexQuery2);

elasticsearchTemplate.bulkIndex(indexQueries);

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
单字符串查询
SearchQuery searchQuery = new NativeSearchQueryBuilder()
		.withQuery(QueryBuilders.queryStringQuery("菜鸟"))
		.withPageable(new PageRequest(0, 20))
		.build();
List<BookEntity> list = elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
排序
Pageable pageable= new PageRequest(0, 20,new Sort(Sort.Direction.DESC, "name"));
SearchQuery searchQuery = new NativeSearchQueryBuilder()
		.withQuery(QueryBuilders.queryStringQuery("菜鸟"))
		.withPageable(pageable)
		.build();
Page<BookEntity> list = elasticsearchTemplate.queryForPage(searchQuery, BookEntity.class);

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

注意:如果出现此异常

java.lang.IllegalArgumentException: Fielddata is disabled on text fields by default

官方解释5.x后对排序,聚合这些操作用单独的数据结构(fielddata)缓存到内存里了,需要单独开启(主要是占用资源太多,所以是否开启,需要仔细斟酌)
关于fielddata更多内容:https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html

模糊查询

此模糊查询与mysql中的模糊查询不太一样,此模糊查询类似分词匹配。
比如有两条数据:1、我今天非常高兴 2、他摔倒很高兴
输入:今天高兴
这两条数据都能匹配上。

Pageable pageable = new PageRequest(0, 10);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
		.withQuery(QueryBuilders.matchQuery("name", "菜鸟"))
		.withPageable(pageable)
		.build();
List<BookEntity> list = elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
其余匹配

其余匹配类似mysql中like "%word%"的模糊匹配

Pageable pageable = new PageRequest(0, 10);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
		.withQuery(QueryBuilders.matchPhraseQuery("name", "菜鸟"))
		.withPageable(pageable)
		.build();
List<BookEntity> list = elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
Term全等查询
Pageable pageable = new PageRequest(0, 10);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
		.withQuery(QueryBuilders.termQuery("name", "菜鸟"))
		.withPageable(pageable)
		.build();
List<BookEntity> list = elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
组合查询

即boolQuery,可以设置多个条件的查询方式。它的作用是用来组合多个Query,有四种方式来组合,must,mustnot,filter,should。
must代表返回的文档必须满足must子句的条件,会参与计算分值;
filter代表返回的文档必须满足filter子句的条件,但不会参与计算分值;
should代表返回的文档可能满足should子句的条件,也可能不满足,有多个should时满足任何一个就可以,通过minimum_should_match设置至少满足几个。
mustnot代表必须不满足子句的条件。

QueryBuilder filterQuery = QueryBuilders
				.boolQuery()
				.filter(QueryBuilders.termQuery("name", "菜鸟"))
				.filter(QueryBuilders.termQuery("author", "小菜"));
List<BookEntity> list = elasticsearchTemplate.queryForList(filterQuery, BookEntity.class);

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
结束

更多关于QueryBuilders的用法,可以看看elasticsearch的QueryBuilders类,或者查看文档:http://xbib.org/elasticsearch/2.1.1/apidocs/org/elasticsearch/index/query/QueryBuilders.html

更多关于ElasticsearchTemplate的用法,可以查看源码,或者查看文档:https://docs.spring.io/spring-data/elasticsearch/docs/current/api/org/springframework/data/elasticsearch/core/ElasticsearchTemplate.html

        </div>
					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-258a4616f7.css" rel="stylesheet">
                  </div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值