Elasticsearch介绍
Elasticsearch,简称ES(全文搜索服务器),既可以作为NoSQL数据库,存储任意格式的文档和数据,同时,也可以作为大数据的分析。作为一个跨界开源产品。ES有如下特点:
- 全文搜索引擎,ES是建立在Lucene上的开源搜索引擎,使用ES可以进行全文搜索、地理信息搜索,像GitHub、StackOverFlow这样的网站也在使用ES,足见其性能。
- 文档存储和查询,可以像NoSQL那样存储任意格式文档,并能根据条件查询文档。
- 大数据分析,ES可以准确实时地进行大数据分析,数据量从TB到PB皆可胜任,很多国内外的公司都采用ES来做大数据分析。
- ES同时提供REST API,用来简化对ES的操作。因此可以使用任何语言的客户端,同时也提供Java API,SpringBoot也更是对REST API进行了封装,从而简化了很多开发。
- ES常常配合传统型数据库一同使用。来完成大数据的查询、搜索和数据分析。
安装Elasticsearch
- 首先要有JDK环境,确保JDK8及以上版本
- 访问地址[(https://www.elastic.co/downloads)], 下载最新版本的ES,选择Elasticsearch进行下载即可。
- 直接解压到某个目录
- 进入下载文件的
bin
目录运行elasticsearch.bat
- 看到以下提示则说明启动成功:
**9200端口是对外的RESTFul接口,而9300端口是ES内部使用的端口。
-打开浏览器访问:http://localhost:9200
出现以下输出:
其中:
name: 表示这台ES服务器的名字,可以配置
cluster_name: 默认是elasticsearch。
ES的集群方式是通过广播在同一个网络中寻找cluster_name一样的ES,cluster_name一样的ES,cluster_name对应的名字是同一个集群的标记。
Elasticsearch的基本概念
- Index: Index是文档(Document)的集合,Index下面包含了Type,用于对Document进一步分类。可以理解为ES中的Index相当于数据库,而Type相当于数据库中的表,ES中可以轻易地联合Index和Type来搜索数据,而数据库做不到这一点。
- Type: 用来进一步组织Document,一个Index下可以有多个Type,例如用户信息是一个Type,用户的支付记录也是一个Type。
- Document: 文档是ES能够存储和搜索的基本信息,类似数据库表行数据,Document为JSON格式,文档属于Type。
- Node(结点): 节点是集群里一台ES Server,用于文档的存储和查询。应用可以只有一个节点,也可以由上百个节点组成集群来存储和搜索数据。每个节点都有一个名字,以及所属集群的名字。
- 集群: 同样集群名的节点将组合为ES集群,用来联合完成数据的存储和搜索。默认集群名字是Elasticsearch。
- 分区(Shards)和复制(Replicas): 每个Index理论上都可以包含大量的数据,超过单个节点的存储限制,将明显限制存储和搜索的性能。因此,ES会将Index在物理上分为多个分区,而且这些分区会按照配置复制到多个节点,Index的分区称为主分区,复制的分区称为复制分区。这样做,既保证了数据安全性又提高了查询性能。
Spring Data Elastic
Spring Data Elastic是Spring官方提供的访问ES的方式,相对于REST访问,更具有优势:
- 完善的封装,遵循Spring Data的规范,只要会使用Spring Data,例如Spring Data JPA,就可以使用Elastic Data。
- 屏蔽了ES REST接口的复杂性,就像调用普通方法一样调用Elastic Data,Spring会自动调用Elastic底层API来完成查询。
- 首先对于SpringBoot来说,要添加以下依赖:
- Spring Boot的application.yml配置ES的访问地址
1. spring:
data:
elasticsearch:
cluster-nodes: 127.0.0.1:9300
- 编写Entity
1. @Data
@Document(indexName = “product”,type=“book”)
public class BookEntity {
@Id
private String id;
private String name;
private String message;
private Date postDate;
private String type;
}
//其中,@Document表示这是一个Elastic Data,indexName和type对应于
//Elasticsearch的Index和Type。本例中的索引是product,类型是book。
- 编写Dao
1. public interface BookDao extends CrudRepository<BookEntity,String> {
public List getByMessage(String key);
}
//该接口继承了CrudRepository,再继续添加一个getByMessage方法,
//这是一个标准Spring Data命名,意味着Elastic Data会查询message字段。
- 编写Controller
@RestController
public class RestController {
@Autowired
private BookDao bookDao;
@RequestMapping("/springdata/book/{id}")
public BookEntity getBookById(@PathVariable String id){
//测试内置的findById
Optional<BookEntity> optional=bookDao.findById(id);
BookEntity bookEntity=optional.get();
return bookEntity;
}
@RequestMapping("/springdata/search/{key}")
public List<BookEntity> search(@PathVariable String key){
//测试全文搜索
List<BookEntity> list=bookDao.getByMessage(key);
return list;
}
@RequestMapping("/springdata/search/{key}/{page}")
public List<BookEntity> search(@PathVariable int page,@PathVariable String key){
int numberOfPage=5;
PageRequest pageRequest= PageRequest.of(page,numberOfPage);
//全文搜索翻页
Page<BookEntity> pages=bookDao.getByMessage(key,pageRequest);
long total=pages.getTotalElements();
long totalPage=pages.getTotalPages();
List<BookEntity> list=pages.getContent();
return list;
}
}