springBoot集成ElasticSearch,并实现简单的查询

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注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词。
类型属性名默认值说明
StringindexName索引库的名称,建议以项目的名称命名
Stringtype“”类型,建议以实体的名称命名
shortshards5默认分区数
shortreplica1每个分区默认的备份数
StringrefreshInterval“1s”刷新间隔
StringindexStoreType“fs”索引文件存储类型
a-2.主键注解:@Id (相当于Hibernate实体的主键@Id注解)(必写)

只是一个标识,并没有属性。

a-3.属性注解 @Field (相当于Hibernate实体的@Column注解)

@Field默认是可以不加的,默认所有属性都会添加到ES中。加上@Field之后,@document默认把所有字段加上索引失效,只有家@Field 才会被索引(同时也看设置索引的属性是否为no)

类型属性名默认值说明
FieldTypetypeFieldType.Auto自动检测属性的类型
FieldIndexindexFieldIndex.analyzed默认情况下分词
booleanstorefalse默认情况下不存储原文
StringsearchAnalyzer“”指定字段搜索时使用的分词器
StringindexAnalyzer“”指定字段建立索引时指定的分词器
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());
}

727b7029b3f86597b1c4ef76410889642ba.jpg

你会发现其中只带“猫”的也查询出来了。

 

写到这已经结束了,后续可能还会更新,因为这块也还有很多没有弄清楚的地方。有不足之处,请多多指教!

 

 

转载于:https://my.oschina.net/u/3714644/blog/1837862

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值