springBoot集成ElasticSearch,并实现简单的查询
因项目中涉及到的数据量比较大,导致在查询的时候比较缓慢,所以需要集成ElasticSearch(一下简称“ES”)。在这里我将我调研集成的过程发出来,有不足之处,希望大家能够不吝指教。
一.下载ElasticSearch,并进行配置。
(1.)前往官网(https://www.elastic.co/downloads/elasticsearch)下载ES,我是下载ZIP格式的,解压直接用就行。这里需要注意的是下载的版本与JDK之间的关系,5.0之后的版本都需要JDK1.8;也要注意与SpringBoot版本之间的关系,我SpringBoot用的是1.4的,那么我的ES下载的版本是2.4的。
(2.)下载完毕后,进行启动。打开文件夹"bin",双击“elasticsearch.bat”,即可启动。
(3.)若启动有问题,出现一闪而过的情况,建议直接用命令启动: 鼠标选中“bin”文件夹,“shift”+右击,然后点击“在此处打开命令窗口”,输入“elasticsearch.bat”,回车,然后就会出现启动过程的整个日志,若报错,则根据报错信息,查找问题。
(4.)启动成功后,在浏览器输入“http://localhost:9200/”,即可访问ES,如下图所示:
二.SpringBoot集成ES
(1.)jar包配置,需要导入的jar包如下所示:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>com.sun.jna</groupId> <artifactId>jna</artifactId> <version>3.0.9</version> </dependency>
(2.)Application配置,其中主要需要加入@EnableElasticsearchRepositories注解:
@EnableAutoConfiguration @SpringBootApplication @EnableElasticsearchRepositories public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure( SpringApplicationBuilder builder) { return builder.sources(Application.class); } }
(3.)配置文件(application.properties)的配置,将以下配置复制到该文件里面:
# ES #开启 Elasticsearch 仓库(默认值:true) spring.data.elasticsearch.repositories.enabled=true #默认 9300 是 Java 客户端的端口。9200 是支持 Restful HTTP 的接口 spring.data.elasticsearch.cluster-nodes = 127.0.0.1:9300 #spring.data.elasticsearch.cluster-name Elasticsearch 集群名(默认值: elasticsearch) #spring.data.elasticsearch.cluster-nodes 集群节点地址列表,用逗号分隔。如果没有指定,就启动一个客户端节点 #spring.data.elasticsearch.propertie 用来配置客户端的额外属性 #存储索引的位置 spring.data.elasticsearch.properties.path.home=/data/project/target/elastic #连接超时的时间 spring.data.elasticsearch.properties.transport.tcp.connect_timeout=120s
三.具体使用,即代码逻辑。
(1.)整体描述:ES也需要搭建实体类,但不会映射到数据库,因为ES也有增删改查,也都是根据对象来进行操作的,那么怎么从数据库检索数据呢?这边的思路是:a.每天定时任务,从数据库拉取数据存取到ES里面,然后查询用ES内置方法查询;b.每个对数据库的增删改查同时对ES进行对应的增删改查。
(2.)代码实现,我现在只是简单实现了往ES里面进行数据的新增,以及模糊查询。废话不多说,整个代码开发流程如下:
a.这里需要描述一下ES实体类的相关注解描述;
a-1.类上注解:@Document (相当于Hibernate实体的@Entity/@Table)(必写),加上了@Document
注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词。
类型 | 属性名 | 默认值 | 说明 |
---|---|---|---|
String | indexName | 无 | 索引库的名称,建议以项目的名称命名 |
String | type | “” | 类型,建议以实体的名称命名 |
short | shards | 5 | 默认分区数 |
short | replica | 1 | 每个分区默认的备份数 |
String | refreshInterval | “1s” | 刷新间隔 |
String | indexStoreType | “fs” | 索引文件存储类型 |
a-2.主键注解:@Id (相当于Hibernate实体的主键@Id注解)(必写)
只是一个标识,并没有属性。
a-3.属性注解 @Field (相当于Hibernate实体的@Column注解)
@Field默认是可以不加的,默认所有属性都会添加到ES中。加上@Field之后,@document默认把所有字段加上索引失效,只有家@Field 才会被索引(同时也看设置索引的属性是否为no)
类型 | 属性名 | 默认值 | 说明 |
---|---|---|---|
FieldType | type | FieldType.Auto | 自动检测属性的类型 |
FieldIndex | index | FieldIndex.analyzed | 默认情况下分词 |
boolean | store | false | 默认情况下不存储原文 |
String | searchAnalyzer | “” | 指定字段搜索时使用的分词器 |
String | indexAnalyzer | “” | 指定字段建立索引时指定的分词器 |
String[] | ignoreFields | {} | 如果某个字段需要被忽略 |
b.新建ES实体类:具体见下图
c. dao层搭建,具体见下图:
需要注意的是他继承的是ElasticsearchRepository,你会发现其具体的一些方法和SpringDataJpa很像。
d.service以及serviceImpl搭建和平常的没什么区别,现在主要说一下,保存以及查询,其中保存也和SpringDataJpa一样,也是可以保存对象或者对象集合,保存的方法思路也差不多,只不过一个是存放至数据库,一个是存放到文档里面:
for(int i=0;i<10;i++){ Cat cat = new Cat(); cat.setName("猫"+i); catService.save(cat); }
保存到ES之后,可以进行查询,我现在写的是按照“name”进行模糊查询,查询如下:
Iterable<Cat> catIterable = catRepository.search(new MatchQueryBuilder("name", "1")); Iterator<Cat> itr = catIterable.iterator(); while (itr.hasNext()) { Cat item = itr.next(); System.out.println(item.getName()); }
然后调用方法,可以如下的结果:
e.关于分词查询,其实上面的查询就是分词查询,我们可以做如下测试:
Iterable<Cat> catIterable = catRepository.search(new MatchQueryBuilder("name", "猫1")); Iterator<Cat> itr = catIterable.iterator(); while (itr.hasNext()) { Cat item = itr.next(); System.out.println(item.getName()); }
你会发现其中只带“猫”的也查询出来了。
写到这已经结束了,后续可能还会更新,因为这块也还有很多没有弄清楚的地方。有不足之处,请多多指教!