一、Elasticsearch简介&安装
前言
应用程序中经常需要添加检索功能,开源的ElasticSearch是目前全文搜索引擎的首选。
可以快速存储、搜索和分析海量数据。
SpringBoot目前整合Spring Data ElasticSearch提供了便捷的检索功能支持。
ElasticSearch是一个分布式搜索服务,提供了Restful API,底层基于Lucene,采用多shard(分片)的方式保证数据的安全性,并且服务提供自动reshsharding的功能。
安装
docker search elasticsearch
注意事项
elasticsearch是java写的。默认会占用2G的JVM内存
二、ElasticSearch快速入门
ES中使用JSON作为序列化格式
ES面向文档检索
概念
以==员工文档==的形式存储为例:一个文档代表一个员工数据。存储数据到ElasticSearch的行为叫做索引
但在索引一个文档之前,需要确定将文档存储在哪里
一个ElasticSearch集群可以包含多个 索引,相应的每个索引包含多个 类型。这些不同的类型存储着多个 文档 每个文档又有多个 属性
类似关系
- 索引-数据库
- 类型-表
- 文档-表中的记录
- 属性-列
操作
- 每个雇员索引一个文档,包含该雇员的所有信息
- 每个文档都将是employee类型
- 该类型位于索引megacorn内
- 该索引保存在我们的ElasticSearch集群中
实际操作只需要一条指令就可以完成!!!!
PUT /megacorp/employee/1
{
"first_name":"张三",
"last_name":"Smith",
"age":25,
"hobby":["football","basketball"]
}
PUT /megacorp/employee/1 此命令包含了三个信息
megacorp:索引名称
employee:类型名称
1:特定雇员的ID
检索文档
发送GET请求
GET /megacorp/employee/1
总结
将HTTP命令由PUT给成GET可以用来检索数据,DELETE命令来删除数据,以及HEAD命令来检查是否存在,如果像更新已经存在的数据,需要使用PUT命令
轻量搜索
GET /megacorp/employee/_search
可以获取搜索结果给最终用户所需的全部内容
GET /megacorp/employee/_search?q=last_name:Smith
可以检索关键字查询
使用查询表达式进行查询
GET /megacorp/employee/_search
{
"query":{
"match":{
"last_name":"Smith"
}
}
}
此次查询不再使用query-string参数,而是一个请求体代替。这个请求使用JSON构造,并使用了match
查询
三、springboot整合elasticSearch
-
导入maven工程坐标
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
-
springBoot默认使用springdata ElasticSearch模块进行操作
-
两种方式操作ES
- 原生的 SpringData ElasticSearch
- jest操作(需要导入jest的工具包 io.searchbox.client.JestClient)
自动配置
SpringData ElasticSearch
- Client 节点信息clusterNodes; clusterName
- ElasticSearchTemplate 操作es
- 编写一个ElasticSearchRepository的子接口来操作ES
如何使用jest操作ES
-
导入jest的工具包maven坐标
<dependency> <groupId>io.searchbox</groupId> <artifactId>jest</artifactId> <version>5.3.3</version> </dependency>
-
配置信息
spring.elasticsearch.ject.uris=http://118.24.44.169:9200
-
操作
@Autowired JestClient jestClient; //添加操作 public void contextLoad(){ //给Es中索引一个文档 创建一个Article的Bean Article article = new Article(); article.setId(1); article.setTile("好消息"); //构建一个索引 Index index = new index.Builder(article).index("guigu").type("news").build(); //执行操作 jestClient.execute(index); } //搜索操作 public void search(){ String json = ""; Search s = new Search.Builder(json).addIndex("guigu").addType("news").build(); Search result = jestClient.execute(s); }
四、整合SpringDataElasticSearch
springData ElasticSearch【ES版本有可能改变】
如果版本不适配,解决方案:
- 升级springboot版本
- docker安装对应版本的ES
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=118.24.44.169:9301
两种用法:
-
编写一个 ElasticsearchRepository
public interface BookRepositoory implements ElasticsearchRepository<Book,Integer>{ }
-
在Book上标注注解来识别 index等信息
@Document(indexName = "guigu",type = "book") public class Book{ Integer id; String bookName; }
-
操作
@Autowrie BookRepository bookRepository; //添加操作 public void test(){ bookRepository.index(new Book()); } //查询操作 public void find(){ //自定义内部的查询操作 }
~
-
操作
@Autowrie BookRepository bookRepository; //添加操作 public void test(){ bookRepository.index(new Book()); } //查询操作 public void find(){ //自定义内部的查询操作 }