项目的DEMO代码:https://github.com/heyu52/-spring-cloud
以下介绍来自百度百科
ElasticSearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用ElasticSearch的水平伸缩性,能使数据在生产环境变得更有价值。ElasticSearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elastic Search 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。
Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。”Elasticsearch是分布式的,这意味着索引可以被分成分片,每个分片可以有0个或多个副本。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。再平衡和路由是自动完成的。“相关数据通常存储在同一个索引中,该索引由一个或多个主分片和零个或多个复制分片组成。一旦创建了索引,就不能更改主分片的数量。
Elasticsearch使用Lucene,并试图通过JSON和Java API提供其所有特性。它支持facetting和percolating,如果新文档与注册查询匹配,这对于通知非常有用。另一个特性称为“网关”,处理索引的长期持久性;例如,在服务器崩溃的情况下,可以从网关恢复索引。Elasticsearch支持实时GET请求,适合作为NoSQL数据存储,但缺少分布式事务。
有关概念
Elasticsearch官网:https://www.elastic.co/cn/products/elasticsearch
Elastic官网:https://www.elastic.co/cn/
Elastic有一条完整的产品线:Elasticsearch、Kibana、Logstash等,就是大家常说的ELK技术栈。
安装
docker镜像地址:https://hub.docker.com/_/elasticsearch
docker pull elasticsearch
我想说的,这个是安装不成功的,得指定版本,我装的是6.8.2
docker pull elasticsearch:6.8.2
镜像网页上还有一个关于生产环境安装的指引,版本是6.4.2:https://www.elastic.co/guide/en/elasticsearch/reference/6.4/docker.html
运行
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.8.2
我们在浏览器输入:http://192.168.0.123:9200/
能看到上面的信息,表明Elasticsearch已经安装成功了,等下我们配置连接,要使用到上面的一些信息。
创建model
package com.csdn.demo.model;
import lombok.*;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
//文档(document) 存入索引库原始的数据。比如每一条商品信息,就是一个文档
//索引库(indices) indices是index的复数,代表许多的索引,
//类型(type) 类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引,比如商品索引,订单索引,其数据格式不同。不过这会导致索引库混乱,因此未来版本中会移除这个概念
//分片(shard) 数据拆分后的各个部分
//副本(replica) 每个分片的复制
//字段(field) 文档中的属性
//映射配置(mappings) 字段的数据类型、属性、是否索引、是否存储等特性
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ToString
@Document(indexName = "user", type = "user", shards = 1, replicas = 0, refreshInterval = "-1")
public class User {
@Id
private String id;
private String userName;
private String address;
private int age;
public User(String userName, String address, int age) {
this.userName = userName;
this.address = address;
this.age = age;
}
}
创建Repository
package com.csdn.demo.Repository;
import com.csdn.demo.model.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
public interface UserRepository extends ElasticsearchRepository {
public List findByAddress(String address);
public User findByUserName(String userName);
public int deleteByUserName(String userName);
public Page findByAddress(String address, Pageable pageable);
}
创建Controller
package com.csdn.demo.web;
import com.csdn.demo.Repository.UserRepository;
import com.csdn.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@Autowired
private UserRepository repository;
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@RequestMapping("saveUsers")
public void saveUsers() {
repository.save(new User("csdn01", "深圳01", 11));
repository.save(new User("csdn02", "深圳02", 12));
repository.save(new User("csdn03", "深圳03", 13));
repository.save(new User("csdn04", "深圳04", 14));
repository.save(new User("csdn05", "深圳05", 15));
repository.save(new User("csdn06", "深圳06", 16));
}
@RequestMapping("fetchAllUsers")
public String fetchAllCustomers() {
Iterable iterable = repository.findAll();
String value="";
for (User user :iterable) {
value+= user.toString();
}
return value;
}
@RequestMapping("updateUsers")
public String updateUsers() {
User user= repository.findByUserName("csdn04");
user.setAddress("深圳007");
repository.save(user);
user=repository.findByUserName("csdn04");
return user.toString();
}
@RequestMapping("fetchPageUsers")
public String fetchPageUsers() {
Sort sort = new Sort(Sort.Direction.DESC, "address.keyword");
Pageable pageable = PageRequest.of(0, 10, sort);
Page users=repository.findByAddress("深圳01", pageable);
return users.getContent().toString();
}
}
配置连接
spring.data.elasticsearch.cluster-name=docker-cluster
# 集群节点地址列表,用逗号分隔
spring.data.elasticsearch.cluster-nodes=192.168.0.123:9300
如果编译报错,按如下修改配置
测试
浏览器输入
http://127.0.0.1:8080/saveUsers
http://127.0.0.1:8080/fetchAllUsers
http://127.0.0.1:8080/fetchPageUsers 测试分页
Spring Boot 项目中对 ElasticSearch 的增、删、改、查操作,通过上面的操作也可以发现操作 ElasticSearch 的语法和 Spring Data JPA 的语法非常类似,其它别的语法,这里就不讲了,都差不了多少。