SpringBoot与检索 - elasticsearch

SpringBoot 检索 - elasticsearch

1、概述

​ 我们的应用经常需要添加检索功能,开源的ElasticSearch是目前全文搜索引擎的首选。他可以快速的存储、搜索和分析海量数据。SpringBoot通过整合SpringData ElasticSearch为我们提供了非常便捷的检索功能支持;Elasticsearch是一个分布式搜索服务,提供Restful API,底层基于Lucene,采用多shard (分片)的方式保证数据安全,并且提供自动resharding的功能, github等大型的站点也是采用了ElasticSearch作为其搜索服务,

2、安装测试

linux环境下,docker安装:
  • 下拉镜像
docker pull elasticsearch:7.7.0
  • 查看镜像
docker images
  • 命令启动
docker run --name elasticsearch -p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
-d elasticsearch:7.7.0 
  • 参数说明
--name elasticsearch:将容器命名为 elasticsearch
-p 9200:9200:将容器的9200端口映射到宿主机9200端口
-p 9300:9300:将容器的9300端口映射到宿主机9300端口,目的是集群互相通信
-e "discovery.type=single-node":单例模式
-e ES_JAVA_OPTS="-Xms64m -Xmx128m":配置内存大小
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:将配置文件挂载到宿主机
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data:将数据文件夹挂载到宿主机
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins:将插件目录挂载到宿主机(需重启)
-d elasticsearch:7.7.0:后台运行容器,并返回容器ID

3、SpringBoot整合elasticsearch

首先说明下版本对应的重要性和关联,在进行SpringBoot和ES整合的时候,版本的对应关系尤其重要,一般情况下,建议在SpringBoot官网上找到springboot中对应的spring-boot-starter-data-elasticsearch 版本,根据版本号判断支持的ES的版本;其次根据spring-data-es 的版本找到对应的springboot版本,需要在marven仓库中确认该springboot版本是否支持对应的ES版本,很有可能出现marven仓库中的版本对应关系和文档中有一定的出入。

1、配置文件
  • 在Springboot-es 7.9.x 的版本整合中,已经放弃了原本5.6.1至今的节点名称配置,也逐步放弃适用TransportClient的API方式,改为Rest方式API进行调用。
spring.elasticsearch.rest.uris=http://127.0.0.1:9200
spring.data.elasticsearch.repositories.enabled = true
2、实体类
  • 在ES 7.0之前的版本,ES中有 索引(index)、类型(type)、文档(doc)、字段(field) ,分别对应常规的关系型数据库中的 数据库、表、行、列,但如果整合的ES的版本为7.0及以上版本的时候,是移除了type的概念,从ES的官方解释来说,ES初期设计是参考关系型数据库的设计模式,所以存在了type(数据表)的概念,但ES本身是基于Luncene,根本快的原因是因为 倒序索引 的使用,而倒序索引 是基于index的,而非type,多个type反而会降低es搜索的速度,所以逐步过渡的情况下,es在7.x版本中去除了type。 另外一种原因是因为type一定程度上限制了es的使用,比如两个实体类 User 和 WechatUser 其中都有 age 这个字段,但在User中字段类型是 int ,但在WechatUser中类型是 double ,在7.x之前的版本中,必须要求 User 和 WechatUser 的 type中 age这个字段的类型必须完全一致,但 7.x 的版本中,es所有不同类型的同字段内部使用的是同一个字段存储,区分type反而会降低es 压缩数据的能力。

  • 在建立Bean的时候,需要在类头部添加@Document(index="xxx")的注解,并且在对应字段上添加@Field字段,可以根据实际使用情况添加是否使用分词器(分词器的作用后续再说),es 中比较特殊的是日期类型的格式,比较建议使用自定义注解的方式去定义,es默认会使用时间戳的方式进行保存。自定义时间格式的注解为: @Field(type = FieldType.Date,format = DateFormat.custom,pattern = "yyyy-MM-dd HH:mm:ss")private Date invoiceDate;

3、基础CRUD
  • Java中对于ES数据的查询主要分为两种,一个是继承 Repository<T, ID> ,实现一部分简单的CRUD查询,比较类似于mybatis-plus中的查询。Repository 的结构如下: PagingAndSortingRepository 继承 CrudRepository,继承 Repository,一般情况我们实际使用过程中 继承 PagingAndSortingRepository,基本可以实现简单的单个保存、批量保存、根据id删除等。 另外一种方式是复杂查询(这里仅仅指组合查询),通过ElasticsearchRestTemplate 进行自定义数据检索操作。
4、相关文档

Elasticsearch: 权威指南

posted @ 2020-12-14 18:46  向零  阅读(421)  评论(0)    收藏  举报