Elasticsearch基础环境配置和使用
介绍
- 和传统数据库的结构对应关系
数据库 | 表 | 行 | 列 |
---|---|---|---|
索引 | 类型 | 文档 | 字段 |
- ES分布式搜索,传统数据库遍历式搜索
允许水平分割、扩展内容容量
允许在分片之上进行分布式的、并行的操作,进而提高性能、吞吐量
分片的分布,它的文档怎样聚合回搜索请求,完全由Elasticsearch管理 - ES采用倒排索引,传统数据库采用B+树索引
从单词角度看文档,标识每个单词分别在那些文档中出现(文档ID),以及在各自的文档中每个单词分别出现了多少次(词频)及其出现位置(相对于该文档首部的偏移量) - ES免费,完全开源
- 海量数据的查询,比传统数据库快
- ES天生对Json数据支持的非常完美,只要是标准的Json结构的数据,无论多么复杂,无论是嵌套多少层,都能存储到ES里面,进而能够查询和分析,检索。
- ES没有用户验证和权限控制
- ES没有事务的概念,不支持回滚,误删不能恢复
- 写到磁盘的倒序索引是不变的(想让新修改过的文档可以被搜索到,必须重新构建整个索引)
基础环境
- 安装JDK 1.8或者更高版本
- 安装Elasticsearch(建议使用6.0以下的版本,高版本坑太多。比如可以选择5.6.9版本)
相关资源文件
- Elasticsearch(华为镜像):https://mirrors.huaweicloud.com/elasticsearch/
- Kibana下载地址:https://www.elastic.co/cn/downloads/past-releases#kibana
Kibana 是在 Elasticsearch 有了相当多的数据之后,进行分析这些数据用的工具。Kibana 里面有一个叫做 Dev Tools 的,可以很方便地以 Restful 风格向 Elasticsearch 服务器提交请求。类似于使用Navicat工具连接MySQL这种关系型数据库,对数据库做操作。 elasticsearch-head(功能类似Kibana,建议用Kibana):https://github.com/mobz/elasticsearch-head- elasticsearch-analysis-ik(需要选择与ES相同的版本号):https://github.com/medcl/elasticsearch-analysis-ik/releases
直接在Elasticsearch的bin目录下执行install指令,即可完成安装:elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.2/elasticsearch-analysis-ik-6.2.2.zip
分词器指搜索引擎使用关键字进行匹配时,会把这个关键字分为多个更细粒度的关键字,这样就可以找到不同相关程度的结果了。
Springboot中使用Elasticsearch
Springboot 有一个 Spring Data 组件,可以用来连接各种数据源。用来连接 Elasticsearch 的是Spring-Data-Elasticsearch。(个人拙见,其接口设计的并不十分友好,很多方法都没有返回值信息(2020/1/17))
Spring-Data-Elasticsearch更比较慢,其最高版本可能无法支持Elasticsearch的最新版本。经实测,Elasticsearch 5.6.9 + Springboot 2.2.1.RELEASE + spring-boot-starter-data-elasticsearch可以正常运行。
相关maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
关键注意点
- 相比1.x的版本,最新版的spring-boot-starter-data-elasticsearch去掉了很多接口,此外很多方法都有改动。(网上很多博客是基于1.x版本的,所以找资料时要注意这个问题)
- 实体类要增加@Document注解,说明要连接到Elasticsearch的哪个索引和哪个类型上
@Document(indexName = "lego", type = "person")
- 实体类一定要要有id字段
可以用@Id标记一个字段作为id主键 - DAO继承ElasticsearchRepository
public interface PersonDAO extends ElasticsearchRepository<Person, Integer> {
}
- 控制类:在Controller引用DAO层的方法(部分)
// 根据id获取一条信息(此前的方法是findOne,较新版本的Spring Data改成了findById)
Optional<Person> person = personDAO.findById(id);
// 插入、更新信息
personDAO.save(person);
// 删除一条记录
personDAO.delete(personDAO.findById(id).get());
// 清空所有
personDAO.deleteAll();
// 分页查询
// 构建查询
QueryStringQueryBuilder builder = new QueryStringQueryBuilder(key);
QueryBuilder query = QueryBuilders.boolQuery().must(builder);
// 分页、排序
Sort sort = new Sort(Sort.Direction.DESC, "id");
// 此方法与旧版本用法不同
Pageable pageable = PageRequest.of(index, size, sort);
// 查找
Iterable<Person> searchResult = personDAO.search(query, pageable);
- application配置
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=localhost:9300
相关链接
- Springboot操作Elasticsearch的demo:https://github.com/letbingo/springboot_demo/tree/master/spring boot-elasticsearch
- ElasticSearch分析工具-Kibana介绍:https://www.cnblogs.com/imdeveloper/articles/12823384.html
- Spring Data Elasticsearch官方文档:https://docs.spring.io/spring-data/elasticsearch/docs/3.2.4.RELEASE/reference/html/#new-features
- Windows环境下Elasticsearch安装教程:https://www.cnblogs.com/hualess/p/11540477.html