Elasticsearch基础环境配置和使用


原文地址:

介绍

  1. 和传统数据库的结构对应关系
数据库
索引 类型 文档 字段
  1. ES分布式搜索,传统数据库遍历式搜索
    允许水平分割、扩展内容容量
    允许在分片之上进行分布式的、并行的操作,进而提高性能、吞吐量
    分片的分布,它的文档怎样聚合回搜索请求,完全由Elasticsearch管理
  2. ES采用倒排索引,传统数据库采用B+树索引
    从单词角度看文档,标识每个单词分别在那些文档中出现(文档ID),以及在各自的文档中每个单词分别出现了多少次(词频)及其出现位置(相对于该文档首部的偏移量)
  3. ES免费,完全开源
  4. 海量数据的查询,比传统数据库快
  5. ES天生对Json数据支持的非常完美,只要是标准的Json结构的数据,无论多么复杂,无论是嵌套多少层,都能存储到ES里面,进而能够查询和分析,检索。
  6. ES没有用户验证和权限控制
  7. ES没有事务的概念,不支持回滚,误删不能恢复
  8. 写到磁盘的倒序索引是不变的(想让新修改过的文档可以被搜索到,必须重新构建整个索引)

基础环境

  • 安装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依赖


    org.springframework.boot
    spring-boot-starter-data-elasticsearch
    

关键注意点

  1. 相比1.x的版本,最新版的spring-boot-starter-data-elasticsearch去掉了很多接口,此外很多方法都有改动。(网上很多博客是基于1.x版本的,所以找资料时要注意这个问题)
  2. 实体类要增加@Document注解,说明要连接到Elasticsearch的哪个索引和哪个类型上
@Document(indexName = "lego", type = "person")
  1. 实体类一定要要有id字段
    可以用@Id标记一个字段作为id主键
  2. DAO继承ElasticsearchRepository
public interface PersonDAO extends ElasticsearchRepository {
}
  1. 控制类:在Controller引用DAO层的方法(部分)
// 根据id获取一条信息(此前的方法是findOne,较新版本的Spring Data改成了findById)
Optional 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 searchResult = personDAO.search(query, pageable);
  1. application配置
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=localhost:9300

相关链接

  1. Springboot操作Elasticsearch的demo:https://github.com/letbingo/springboot_demo/tree/master/spring boot-elasticsearch
  2. ElasticSearch分析工具-Kibana介绍:
  3. Spring Data Elasticsearch官方文档:https://docs.spring.io/spring-data/elasticsearch/docs/3.2.4.RELEASE/reference/html/#new-features
  4. Windows环境下Elasticsearch安装教程: