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来完成查询。
  1. 首先对于SpringBoot来说,要添加以下依赖:
  2. Spring Boot的application.yml配置ES的访问地址
1. spring:
 data:
 elasticsearch:
 cluster-nodes: 127.0.0.1:9300
  1. 编写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。
  1. 编写Dao
1. public interface BookDao extends CrudRepository<BookEntity,String> {
 public List getByMessage(String key);
 }
 //该接口继承了CrudRepository,再继续添加一个getByMessage方法,
 //这是一个标准Spring Data命名,意味着Elastic Data会查询message字段。
  1. 编写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;
}

}