SpringBoot(九):整合elasticsearch并使⽤logstash同步数据
⼀到周末,就想在家⾥躺⼫,逛逛B站,看看直播,打打游戏,美哉美哉。当然,作为⼀名有⾃我修养的程序员,学习也是必不可少的。前段时间,我司的另⼀个项⽬组接⼿的项⽬中⽤到了elasticsearch,我就查了⼀下,原来是⼀个分布式的搜索框架;所以,决定⼊门学习⼀下。
ps:本⽂⼲货满满
elasticsearch的背景
ElasticSearch是⼀个基于Lucene的搜索服务器。它提供了⼀个分布式多⽤户能⼒的全⽂搜索引擎,基于RESTful web接⼝。
Elasticsearch是⽤Java语⾔开发的,并作为Apache许可条款下的开放源码发布,是⼀种流⾏的企业级搜索引擎。ElasticSearch⽤于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使⽤⽅便。官⽅客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语⾔中都是可⽤的。根据DB-Engines的排名显⽰,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
上⾯就是百度百科的介绍,基本上就是和Solr同源,都是基于Lucene来进⾏的封装。想了解更多资料的
读者,请⾃⾏百度。本篇着重讲解elasticsearch的使⽤。
elasticsearch的安装
⼆:在windows上安装:
因为⽤于本地测试,开发,就直接在windows上就好了。
下载安装
ps:这⾥的版本需要根据⾃⼰的实际情况选择,因为博主会使⽤SpringBoot封装的⽅法操作elasticsearch,⽽maven提供的最新版的 spring-data-elasticsearch 是 3.2,与之对应的elasticsearch版本是6.4.3 ,但是elasticsearch的最新版是7.4.0,所以,为了⽅便,博主直接选择历史版本。
各位读者根据需求下载所需版本即可。
elasticsearch压缩包下载完成,解压就⾏了,然后在bin⽬录下双击elasticsearch或者在doc命令中敲命令也⾏。
启动成功如下图所⽰:
将elasticsearch加⼊系统服务
如果每个服务都使⽤doc命令来启动,那么电脑底下的任务栏会很乱,如果不⼩⼼关错了,⼜要重新启动⼀次,甚⾄需要杀掉进程,再次启动。所以,直接将其添加为系统服务,通过后台服务的⽅式来启动。
在bin⽬录下的doc命令⾏中执⾏下⾯的命令执⾏上⾯的命令,当前服务就添加进了系统。然后可以通过任务管理器启动了。
ps:通过任务管理器启动elasticsearch 服务,若是每次都显⽰已停⽌,就证明此刻服务时有问题的。
需要对服务进⾏配置,在bin⽬录下的doc命令⾏中输⼊以下命令
修改配置⽂件
博主就修改了上⾯的配置,其实还有很多配置,只是现在没有接触到。然后重启服务,就可以看到⾃定义的集名称和节点名称了。上⾯这些内容都是在说elasticsearch的安装与启动,下⾯就进⾏SpringBoot操作elasticsearch的环节。
SpringBoot 整合elasticsearch
①、导⼊相应的约束。
这⾥使⽤的是maven仓库提供的最新版,依赖下载完,读者可以点开依赖,查看elasticsearch的版本。因为使⽤SpringBoot,所以其他包就不贴出来了,读者根据项⽬需求导⼊。
②、修改配置⽂件
③、编码实战
这⾥就以检索⽂章为例,建⽴⼀个实体类。elasticsearch-service.bat install elasticsearch-6.4.3  # 最后是服务的名字,这⾥可以⾃定义
1elasticsearch-service.bat manager elasticsearch-6.4.3  # 后⾯跟的就是刚才设置的服务名称
1# 集名称cluster.name : qfcwx # 节点名称node.name : node -9006# 配置是否跨域,⽅便head 插件操作abled : s.allow-origin : "*"
1
2
3
4
5
6
7
8
9        <dependency >            <groupId >org.springframework.data </groupId >            <artifactId >spring-data-elasticsearch </artifactId >            <version >3.2.0.RELEASE </version >        </dependency >
1
2
3
4
5spring :  data :    elasticsearch :      cluster-nodes : 127.0.0.1:9300      cluster-name : qfcwx
1
2
3
4
5
@Data是lombook的注解,⾃动⽣成setter、getter等⽅法。
@Document这是elasticsearch的注解,indexName是索引的名字;type是类型。
@Field这个注解上⾯,类中也有相应的注解,表明当前属性需要索引、分词,存储。
先说⼀下elasticsearch和MySQL的对应关系:
elasticsearch
MySQL 索引
数据库类型
表⽂档⾏
mysql下载完如何使用上⾯说的分词,⽂章后⾯部分会做相应的说明。
实体类创建完毕,接着创建dao层。因为使⽤spring-data的缘故,它将所有的关系型数据库与⾮关系型数据库的操作都封装起来,提供⼀个统⼀的增删改查⽅法,如果不通过配置和代码,⽆法区分当前操作的是什么数据库。⽤的时间长了,感觉整个⼈都有点废了的感觉,但是对于敏捷开发,真的是⾮常⽅便的。package  com .qfcwx .micro .search .pojo ;import  io .swagger .annotations .ApiModel ;import  io .swagger .annotations .ApiModelProperty ;import  lombok .Data ;import  org .springframework .data .annotation .Id ;import  org .springframework .data .elasticsearch .annotations .Document ;import  org .springframework .data .elasticsearch .annotations .Field ;import  java .io .Serializable ;/** * @ClassName: Article  * @Author: 清风⼀阵吹我⼼ * @Description: TODO  Elasticsearch 需要的对象 * @Date: 2019/10/19 16:11 * @Version 1.0 **/@Data @Document(indexName = "qfcwx_article", type = "article")public  class  Article implements  Serializable {    @Id    private  String id ;    /**    * 是否索引,看该域是否能被搜索    * 是否分词,表⽰搜索的时候是整体匹配还是单词匹配    * 是否存储,是否在页⾯上显⽰    */    @Field(index = true , analyzer = "chinese", searchAnalyzer = "chinese")    private  String title ;    @Field(index = true , analyzer = "chinese", searchAnalyzer = "chinese")    private  String content ;    /**    * 审批状态    */    private  String state ;}
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
这⾥写了⼀个⾃定义⽅法,就像写JPA⼀样,根据⽅法名就能⾃动⽣成相应的查询条件,不需要⾃⼰去写sql。
然后写service层。
这⾥提供了两个⽅法,⼀个是新增,⼀个是分页查询。
最后就是控制层了。
使⽤SpringBoot操作elasticsearch就是这么简单。public  interface  SearchRepository extends  ElasticsearchRepository <Article , String > {    /**    * ⾃定义分页查询⽅法    */    Page <Article > findByTitleOrContentLike (String title , String content , Pageable pageable );}
1
2
3
4
5
6
7@Service @Transactional(rollbackFor = Exception .class )public  class  SearchService {    @Autowi
red    private  SearchRepository searchRepository ;    public  void  save (Article article ) {        article .setId (NumberUtil .getBitRandomNumber (6));        searchRepository .save (article );    }    public  PageResult <Article > findByKey (String key , Integer page , Integer size ) {        Pageable pageable = PageRequest .of (page - 1, size );        Page <Article > pageList = searchRepository .findByTitleOrContentLike (key , key , pageable );        return  new  PageResult <Article >(pageList .getTotalElements (), pageList .getContent ());    }}
1
2
3
4
5
6
78
9
10
11
12
13
14
15
16
17
18@RestController @RequestMapping("/api/v1.0/article")public  class  SearchController {    @Autowired    private  SearchService searchService ;    @PostMapping    public  ResultBean <Boolean > save (@RequestBody  Article article ) {        searchService .save (article );        return  ne
w  ResultBean <>(Boolean .TRUE );    }    @GetMapping(value = "/{key}/{page}/{size}")    public  ResultBean <PageResult <Article >> findByKey (@PathVariable  String key , @PathVariable  Integer page , @PathVariable  Integer size ) {        return  new  ResultBean <>(searchService .findByKey (key , page , size ));    }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
启动项⽬,使⽤Postman⼯具进⾏测试。
可以看到返回结果,成功的插⼊了数据,接着多插⼊⼏条数据。如何查看是否将数据存⼊了索引库呢?此时,就可以使⽤第⼆个查询接⼝了。
第⼀个参数是key,也就是通过什么词来搜索,后⾯两个对应页数和每页的个数。
elasticsearch分词器
通过上⽂知道了,操作elasticsearch是这么简单。SpringBoot⼤⼤简化了操作关系型数据库和⾮关系型数据库的难度。但是,在开发中,还是有很多坑需要⾃⼰慢慢去踩,去解决的。
上⾯的Article实体类中说到了@Field这个注解,其中提到了分词。那么什么是分词呢?
其实理解起来很简单。就是⼀句话分成⼏个词。下⾯就进⾏分词的操作。
使⽤了elasticsearch原⽣的分词器。
在Postman中输⼊以下命令:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。