ElasticSearch

ElasticSearch

使用springdata操作es出错org.elasticsearch.client.transport.NoNodeAvailableException

Spring Datastrongant 发表了文章 • 3 个评论 • 252 次浏览 • 2017-07-16 13:42 • 来自相关话题

  之前的项目中使用的是http-client操作es,比较轻量级。目前为了学习下springdata,使用Java API 的方式来操作ES,但是在引入springdata的es模块依赖后,操作es并未成功,出现以下错误:$(document).ready(function() {$('pre code').each(function(i, block) { hljs.highlightBlock( block); }); });org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [{#transport#-1}{127.0.0.1}{127.0.0.1:9300}]
注意:如果你下载elasticsearch的压缩包安装的话,可能不会出现该问题!因为es默认的配置文件cluster.name是elasticsearch。但是奇葩的是使用brew安装es之后,默认的elasticsearch.yml的配置项成了这样:cluster.name: elasticsearch_bwh,就是这个原因导致了这个问题的产生,项目启动后控制台一直抛这个错:transport#-1}{127.0.0.1}{127.0.0.1:9300} not part of the cluster Cluster [Assassin], ignoring...当执行添加操作时,提示:org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [{#transport#-1}{127.0.0.1}{127.0.0.1:9300}]最后需要注意的是,如果你修改了es默认的集群名称,则需要在src/main/resources/application.properties配置文件中进行指定:

spring.data.elasticsearch.clusterName=elasticsearch_bwh
通过源码org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchProperties可以看到,默认的
clusterName为elasticsearch。
 
希望可以帮助遇到此类问题的同学。 查看全部
  之前的项目中使用的是http-client操作es,比较轻量级。目前为了学习下springdata,使用Java API 的方式来操作ES,但是在引入springdata的es模块依赖后,操作es并未成功,出现以下错误:
org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [{#transport#-1}{127.0.0.1}{127.0.0.1:9300}]

注意:如果你下载elasticsearch的压缩包安装的话,可能不会出现该问题!因为es默认的配置文件cluster.name是elasticsearch。但是奇葩的是使用brew安装es之后,默认的elasticsearch.yml的配置项成了这样:cluster.name: elasticsearch_bwh,就是这个原因导致了这个问题的产生,项目启动后控制台一直抛这个错:
transport#-1}{127.0.0.1}{127.0.0.1:9300} not part of the cluster Cluster [Assassin], ignoring...
当执行添加操作时,提示:
org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [{#transport#-1}{127.0.0.1}{127.0.0.1:9300}]
最后需要注意的是,如果你修改了es默认的集群名称,则需要在src/main/resources/application.properties配置文件中进行指定:

spring.data.elasticsearch.clusterName=elasticsearch_bwh
通过源码org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchProperties可以看到,默认的
clusterName为elasticsearch。
 
希望可以帮助遇到此类问题的同学。

spring-data-es 视频公开课(二)《spring-data-elasticsearch 简单案例搭建》

开源项目泥瓦匠BYSocket 发表了文章 • 5 个评论 • 1478 次浏览 • 2017-06-27 20:46 • 来自相关话题

spring-data-es 视频公开课(二)《spring-data-elasticsearch 简单案例搭建》
视频如下:







一、前言
a. 版权声明 
本视频由 泥瓦匠BYSocket 支持 Spring For All 社区 www.spring4all.com ,版权为个人及社区所有,欢迎转发。
b. 视频主旨
学会 ElasticSearch 及 spring-data-elasticsearch项目实战教学

视频系列目录
spring-data-es 视频公开课(一)《elasticsearch 及 head 插件安装使用》spring-data-es 视频公开课(二)《spring-data-elasticsearch 简单案例搭建》spring-data-es 视频公开课(三)《spring-data-elasticsearch 实战案例搭建》

二、正文

本节提纲
一、spring-data-elasticsearch-crud 的工程介绍
二、搭建 spring-data-elasticsearch-crud 工程

一、spring-data-elasticsearch-crud 的工程介绍
spring-data-elasticsearch-crud 的工程,介绍 Spring Data Elasticsearch 简单的 ES 操作。Spring Data Elasticsearch 可以跟 JPA 进行类比。其使用方法也很简单。

二、运行 spring-data-elasticsearch-crud 工程
1.后台起守护线程启动 Elasticsearch
cd elasticsearch-2.3.2/
./bin/elasticsearch -d

2.添加 maven 依赖
pom.xml:<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/ma ... gt%3B
<modelVersion>4.0.0</modelVersion>
<groupId>springboot</groupId>
<artifactId>spring-data-elasticsearch-crud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-data-elasticsearch-crud :: spring-data-elasticsearch - 基本案例 </name>
<!-- Spring Boot 启动父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
</parent>
<dependencies>
<!-- Spring Boot Elasticsearch 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- Spring Boot Web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>


这里依赖的 spring-boot-starter-data-elasticsearch 版本是 1.5.1.RELEASE,对应的 spring-data-elasticsearch 版本是 2.1.0.RELEASE。对应官方文档:http://docs.spring.io/spring-d ... html/。后面数据操作层都是通过该 spring-data-elasticsearch 提供的接口实现。

3.新建启动 Application 类
Application.java:// Spring Boot 应用的标识
@SpringBootApplication
public class Application {
public static void main(String args) {
// 程序启动入口
// 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
SpringApplication.run(Application.class,args);
}
}

4.编写 ES 代码(重点)
application.properties
 配置 ES 地址# ES
spring.data.elasticsearch.repositories.enabled = true
spring.data.elasticsearch.cluster-nodes = 127.0.0.1:9300
默认 9300 是 Java 客户端的端口。9200 是支持 Restful HTTP 的接口。
更多配置:
 spring.data.elasticsearch.cluster-name Elasticsearch    集群名。(默认值: elasticsearch)
 spring.data.elasticsearch.cluster-nodes    集群节点地址列表,用逗号分隔。如果没有指定,就启动一个客户端节点。
 spring.data.elasticsearch.propertie     用来配置客户端的额外属性。
 spring.data.elasticsearch.repositories.enabled     开启 Elasticsearch 仓库。(默认值:true。)


ES domain 实体类
City.java/**
* 城市实体类
* <p>
* Created by bysocket on 03/05/2017.
*/
@Document(indexName = "province", type = "city")
public class City implements Serializable {
private static final long serialVersionUID = -1L;
/**
* 城市编号
*/
private Long id;
/**
* 城市名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 城市评分
*/
private Integer score;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
}


注意
a. City 属性名不支持驼峰式。
b. indexName 配置必须是全部小写,不然会出异常。
org.elasticsearch.indices.InvalidIndexNameException: Invalid index name [provinceIndex], must be lowercase
 

ES 数据操作层
CityRepository.java/**
* ES 操作类
* <p>
* Created by bysocket on 17/05/2017.
*/
public interface CityRepository extends ElasticsearchRepository<City, Long> {
/**
* AND 语句查询
*
* @param description
* @param score
* @return
*/
List<City> findByDescriptionAndScore(String description, Integer score);
/**
* OR 语句查询
*
* @param description
* @param score
* @return
*/
List<City> findByDescriptionOrScore(String description, Integer score);
/**
* 查询城市描述
*
* 等同于下面代码
* @Query("{\"bool\" : {\"must\" : {\"term\" : {\"description\" : \"?0\"}}}}")
* Page<City> findByDescription(String description, Pageable pageable);
*
* @param description
* @param page
* @return
*/
Page<City> findByDescription(String description, Pageable page);
/**
* NOT 语句查询
*
* @param description
* @param page
* @return
*/
Page<City> findByDescriptionNot(String description, Pageable page);
/**
* LIKE 语句查询
*
* @param description
* @param page
* @return
*/
Page<City> findByDescriptionLike(String description, Pageable page);
}
接口只要继承 ElasticsearchRepository 类即可。默认会提供很多实现,比如 CRUD 和搜索相关的实现。类似于 JPA 读取数据,是使用 CrudRepository 进行操作 ES 数据。支持的默认方法有: count(), findAll(), findOne(ID), delete(ID), deleteAll(), exists(ID), save(DomainObject), save(Iterable<DomainObject>)。

另外可以看出,接口的命名是遵循规范的。常用命名规则如下:
关键字     方法命名
And          findByNameAndPwd
Or             findByNameOrSex
Is              findById
Between   findByIdBetween
Like           findByNameLike
NotLike     findByNameNotLike
OrderBy    findByIdOrderByXDesc
Not           findByNameNot


城市 ES 业务接口类
CityService.java/**
* 城市 ES 业务接口类
*
*/
public interface CityService {
/**
* 新增 ES 城市信息
*
* @param city
* @return
*/
Long saveCity(City city);
/**
* AND 语句查询
*
* @param description
* @param score
* @return
*/
List<City> findByDescriptionAndScore(String description, Integer score);
/**
* OR 语句查询
*
* @param description
* @param score
* @return
*/
List<City> findByDescriptionOrScore(String description, Integer score);
/**
* 查询城市描述
*
* @param description
* @return
*/
List<City> findByDescription(String description);
/**
* NOT 语句查询
*
* @param description
* @return
*/
List<City> findByDescriptionNot(String description);
/**
* LIKE 语句查询
*
* @param description
* @return
*/
List<City> findByDescriptionLike(String description);
}




城市 ES 业务逻辑实现类
CityESServiceImpl.java/**
* 城市 ES 业务逻辑实现类
* <p>
* Created by bysocket on 07/02/2017.
*/
@Service
public class CityESServiceImpl implements CityService {
private static final Logger LOGGER = LoggerFactory.getLogger(CityESServiceImpl.class);
// 分页参数 -> TODO 代码可迁移到具体项目的公共 common 模块
private static final Integer pageNumber = 0;
private static final Integer pageSize = 10;
Pageable pageable = new PageRequest(pageNumber, pageSize);
// ES 操作类
@Autowired
CityRepository cityRepository;
public Long saveCity(City city) {
City cityResult = cityRepository.save(city);
return cityResult.getId();
}
public List<City> findByDescriptionAndScore(String description, Integer score) {
return cityRepository.findByDescriptionAndScore(description, score);
}
public List<City> findByDescriptionOrScore(String description, Integer score) {
return cityRepository.findByDescriptionOrScore(description, score);
}
public List<City> findByDescription(String description) {
return cityRepository.findByDescription(description, pageable).getContent();
}
public List<City> findByDescriptionNot(String description) {
return cityRepository.findByDescriptionNot(description, pageable).getContent();
}
public List<City> findByDescriptionLike(String description) {
return cityRepository.findByDescriptionLike(description, pageable).getContent();
}
}




城市 Controller 实现 Restful HTTP 服务
CityRestController.java/**
* 城市 Controller 实现 Restful HTTP 服务
* <p>
* Created by bysocket on 03/05/2017.
*/
@RestController
public class CityRestController {
@Autowired
private CityService cityService;
/**
* 插入 ES 新城市
*
* @param city
* @return
*/
@RequestMapping(value = "/api/city", method = RequestMethod.POST)
public Long createCity(@RequestBody City city) {
return cityService.saveCity(city);
}
/**
* AND 语句查询
*
* @param description
* @param score
* @return
*/
@RequestMapping(value = "/api/city/and/find", method = RequestMethod.GET)
public List<City> findByDescriptionAndScore(@RequestParam(value = "description") String description,
@RequestParam(value = "score") Integer score) {
return cityService.findByDescriptionAndScore(description, score);
}
/**
* OR 语句查询
*
* @param description
* @param score
* @return
*/
@RequestMapping(value = "/api/city/or/find", method = RequestMethod.GET)
public List<City> findByDescriptionOrScore(@RequestParam(value = "description") String description,
@RequestParam(value = "score") Integer score) {
return cityService.findByDescriptionOrScore(description, score);
}
/**
* 查询城市描述
*
* @param description
* @return
*/
@RequestMapping(value = "/api/city/description/find", method = RequestMethod.GET)
public List<City> findByDescription(@RequestParam(value = "description") String description) {
return cityService.findByDescription(description);
}
/**
* NOT 语句查询
*
* @param description
* @return
*/
@RequestMapping(value = "/api/city/description/not/find", method = RequestMethod.GET)
public List<City> findByDescriptionNot(@RequestParam(value = "description") String description) {
return cityService.findByDescriptionNot(description);
}
/**
* LIKE 语句查询
*
* @param description
* @return
*/
@RequestMapping(value = "/api/city/like/find", method = RequestMethod.GET)
public List<City> findByDescriptionLike(@RequestParam(value = "description") String description) {
return cityService.findByDescriptionLike(description);
}
}


5.编译工程
mvn clean install

6.运行工程
右键运行 Application 应用启动类的 main 函数,这样就成功启动了 springboot-elasticsearch 案例。

用 Postman 工具新增两个城市
a. 新增城市信息
POST http://127.0.0.1:8080/api/city
{
    "id":"1",
    "score":"5",
    "name":"上海",
    "description":"上海是个热城市"
}
POST http://127.0.0.1:8080/api/city
{
    "id":"2",
    "score":"4",
    "name":"温岭",
    "description":"温岭是个沿海城市"
}

可以打开 ES 可视化工具 head 插件:http://localhost:9200/_plugin/head/。
 
下面是基本查询语句的接口:
a. 普通查询,查询城市描述
GET http://localhost:8080/api/city ... on%3D温岭
b. AND 语句查询
GET http://localhost:8080/api/city ... on%3D温岭&score=4
如果换成 score=5 ,就没有结果了。
c. OR 语句查询
GET http://localhost:8080/api/city ... on%3D上海&score=4
d. NOT 语句查询
GET http://localhost:8080/api/city ... on%3D温州
e. LIKE 语句查询
GET http://localhost:8080/api/city ... on%3D城市

三、视频小结
下一视频《spring-data-elasticsearch 实战案例搭建》,会带来实战项目中涉及到的权重分 & 短语精准匹配的讲解。
  查看全部
spring-data-es 视频公开课(二)《spring-data-elasticsearch 简单案例搭建》
视频如下:








一、前言
a. 版权声明 
本视频由 泥瓦匠BYSocket 支持 Spring For All 社区 www.spring4all.com ,版权为个人及社区所有,欢迎转发。
b. 视频主旨
  • 学会 ElasticSearch 及 spring-data-elasticsearch
  • 项目实战教学


视频系列目录


二、正文

本节提纲
一、spring-data-elasticsearch-crud 的工程介绍
二、搭建 spring-data-elasticsearch-crud 工程

一、spring-data-elasticsearch-crud 的工程介绍
spring-data-elasticsearch-crud 的工程,介绍 Spring Data Elasticsearch 简单的 ES 操作。Spring Data Elasticsearch 可以跟 JPA 进行类比。其使用方法也很简单。

二、运行 spring-data-elasticsearch-crud 工程
1.后台起守护线程启动 Elasticsearch
cd elasticsearch-2.3.2/
./bin/elasticsearch -d

2.添加 maven 依赖
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/ma ... gt%3B
<modelVersion>4.0.0</modelVersion>
<groupId>springboot</groupId>
<artifactId>spring-data-elasticsearch-crud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-data-elasticsearch-crud :: spring-data-elasticsearch - 基本案例 </name>
<!-- Spring Boot 启动父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
</parent>
<dependencies>
<!-- Spring Boot Elasticsearch 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- Spring Boot Web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>



这里依赖的 spring-boot-starter-data-elasticsearch 版本是 1.5.1.RELEASE,对应的 spring-data-elasticsearch 版本是 2.1.0.RELEASE。对应官方文档:http://docs.spring.io/spring-d ... html/。后面数据操作层都是通过该 spring-data-elasticsearch 提供的接口实现。

3.新建启动 Application 类
Application.java:
// Spring Boot 应用的标识
@SpringBootApplication
public class Application {
public static void main(String args) {
// 程序启动入口
// 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
SpringApplication.run(Application.class,args);
}
}


4.编写 ES 代码(重点)
application.properties
 配置 ES 地址
# ES
spring.data.elasticsearch.repositories.enabled = true
spring.data.elasticsearch.cluster-nodes = 127.0.0.1:9300

默认 9300 是 Java 客户端的端口。9200 是支持 Restful HTTP 的接口。
更多配置:
 spring.data.elasticsearch.cluster-name Elasticsearch    集群名。(默认值: elasticsearch)
 spring.data.elasticsearch.cluster-nodes    集群节点地址列表,用逗号分隔。如果没有指定,就启动一个客户端节点。
 spring.data.elasticsearch.propertie     用来配置客户端的额外属性。
 spring.data.elasticsearch.repositories.enabled     开启 Elasticsearch 仓库。(默认值:true。)


ES domain 实体类
City.java
/**
* 城市实体类
* <p>
* Created by bysocket on 03/05/2017.
*/
@Document(indexName = "province", type = "city")
public class City implements Serializable {
private static final long serialVersionUID = -1L;
/**
* 城市编号
*/
private Long id;
/**
* 城市名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 城市评分
*/
private Integer score;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
}



注意
a. City 属性名不支持驼峰式。
b. indexName 配置必须是全部小写,不然会出异常。
org.elasticsearch.indices.InvalidIndexNameException: Invalid index name [provinceIndex], must be lowercase
 

ES 数据操作层
CityRepository.java
/**
* ES 操作类
* <p>
* Created by bysocket on 17/05/2017.
*/
public interface CityRepository extends ElasticsearchRepository<City, Long> {
/**
* AND 语句查询
*
* @param description
* @param score
* @return
*/
List<City> findByDescriptionAndScore(String description, Integer score);
/**
* OR 语句查询
*
* @param description
* @param score
* @return
*/
List<City> findByDescriptionOrScore(String description, Integer score);
/**
* 查询城市描述
*
* 等同于下面代码
* @Query("{\"bool\" : {\"must\" : {\"term\" : {\"description\" : \"?0\"}}}}")
* Page<City> findByDescription(String description, Pageable pageable);
*
* @param description
* @param page
* @return
*/
Page<City> findByDescription(String description, Pageable page);
/**
* NOT 语句查询
*
* @param description
* @param page
* @return
*/
Page<City> findByDescriptionNot(String description, Pageable page);
/**
* LIKE 语句查询
*
* @param description
* @param page
* @return
*/
Page<City> findByDescriptionLike(String description, Pageable page);
}

接口只要继承 ElasticsearchRepository 类即可。默认会提供很多实现,比如 CRUD 和搜索相关的实现。类似于 JPA 读取数据,是使用 CrudRepository 进行操作 ES 数据。支持的默认方法有: count(), findAll(), findOne(ID), delete(ID), deleteAll(), exists(ID), save(DomainObject), save(Iterable<DomainObject>)。

另外可以看出,接口的命名是遵循规范的。常用命名规则如下:
关键字     方法命名
And          findByNameAndPwd
Or             findByNameOrSex
Is              findById
Between   findByIdBetween
Like           findByNameLike
NotLike     findByNameNotLike
OrderBy    findByIdOrderByXDesc
Not           findByNameNot


城市 ES 业务接口类
CityService.java
/**
* 城市 ES 业务接口类
*
*/
public interface CityService {
/**
* 新增 ES 城市信息
*
* @param city
* @return
*/
Long saveCity(City city);
/**
* AND 语句查询
*
* @param description
* @param score
* @return
*/
List<City> findByDescriptionAndScore(String description, Integer score);
/**
* OR 语句查询
*
* @param description
* @param score
* @return
*/
List<City> findByDescriptionOrScore(String description, Integer score);
/**
* 查询城市描述
*
* @param description
* @return
*/
List<City> findByDescription(String description);
/**
* NOT 语句查询
*
* @param description
* @return
*/
List<City> findByDescriptionNot(String description);
/**
* LIKE 语句查询
*
* @param description
* @return
*/
List<City> findByDescriptionLike(String description);
}





城市 ES 业务逻辑实现类
CityESServiceImpl.java
/**
* 城市 ES 业务逻辑实现类
* <p>
* Created by bysocket on 07/02/2017.
*/
@Service
public class CityESServiceImpl implements CityService {
private static final Logger LOGGER = LoggerFactory.getLogger(CityESServiceImpl.class);
// 分页参数 -> TODO 代码可迁移到具体项目的公共 common 模块
private static final Integer pageNumber = 0;
private static final Integer pageSize = 10;
Pageable pageable = new PageRequest(pageNumber, pageSize);
// ES 操作类
@Autowired
CityRepository cityRepository;
public Long saveCity(City city) {
City cityResult = cityRepository.save(city);
return cityResult.getId();
}
public List<City> findByDescriptionAndScore(String description, Integer score) {
return cityRepository.findByDescriptionAndScore(description, score);
}
public List<City> findByDescriptionOrScore(String description, Integer score) {
return cityRepository.findByDescriptionOrScore(description, score);
}
public List<City> findByDescription(String description) {
return cityRepository.findByDescription(description, pageable).getContent();
}
public List<City> findByDescriptionNot(String description) {
return cityRepository.findByDescriptionNot(description, pageable).getContent();
}
public List<City> findByDescriptionLike(String description) {
return cityRepository.findByDescriptionLike(description, pageable).getContent();
}
}





城市 Controller 实现 Restful HTTP 服务
CityRestController.java
/**
* 城市 Controller 实现 Restful HTTP 服务
* <p>
* Created by bysocket on 03/05/2017.
*/
@RestController
public class CityRestController {
@Autowired
private CityService cityService;
/**
* 插入 ES 新城市
*
* @param city
* @return
*/
@RequestMapping(value = "/api/city", method = RequestMethod.POST)
public Long createCity(@RequestBody City city) {
return cityService.saveCity(city);
}
/**
* AND 语句查询
*
* @param description
* @param score
* @return
*/
@RequestMapping(value = "/api/city/and/find", method = RequestMethod.GET)
public List<City> findByDescriptionAndScore(@RequestParam(value = "description") String description,
@RequestParam(value = "score") Integer score) {
return cityService.findByDescriptionAndScore(description, score);
}
/**
* OR 语句查询
*
* @param description
* @param score
* @return
*/
@RequestMapping(value = "/api/city/or/find", method = RequestMethod.GET)
public List<City> findByDescriptionOrScore(@RequestParam(value = "description") String description,
@RequestParam(value = "score") Integer score) {
return cityService.findByDescriptionOrScore(description, score);
}
/**
* 查询城市描述
*
* @param description
* @return
*/
@RequestMapping(value = "/api/city/description/find", method = RequestMethod.GET)
public List<City> findByDescription(@RequestParam(value = "description") String description) {
return cityService.findByDescription(description);
}
/**
* NOT 语句查询
*
* @param description
* @return
*/
@RequestMapping(value = "/api/city/description/not/find", method = RequestMethod.GET)
public List<City> findByDescriptionNot(@RequestParam(value = "description") String description) {
return cityService.findByDescriptionNot(description);
}
/**
* LIKE 语句查询
*
* @param description
* @return
*/
@RequestMapping(value = "/api/city/like/find", method = RequestMethod.GET)
public List<City> findByDescriptionLike(@RequestParam(value = "description") String description) {
return cityService.findByDescriptionLike(description);
}
}



5.编译工程
mvn clean install

6.运行工程
右键运行 Application 应用启动类的 main 函数,这样就成功启动了 springboot-elasticsearch 案例。

用 Postman 工具新增两个城市
a. 新增城市信息
POST http://127.0.0.1:8080/api/city
{
    "id":"1",
    "score":"5",
    "name":"上海",
    "description":"上海是个热城市"
}
POST http://127.0.0.1:8080/api/city
{
    "id":"2",
    "score":"4",
    "name":"温岭",
    "description":"温岭是个沿海城市"
}

可以打开 ES 可视化工具 head 插件:http://localhost:9200/_plugin/head/
 
下面是基本查询语句的接口:
a. 普通查询,查询城市描述
GET http://localhost:8080/api/city ... on%3D温岭
b. AND 语句查询
GET http://localhost:8080/api/city ... on%3D温岭&score=4
如果换成 score=5 ,就没有结果了。
c. OR 语句查询
GET http://localhost:8080/api/city ... on%3D上海&score=4
d. NOT 语句查询
GET http://localhost:8080/api/city ... on%3D温州
e. LIKE 语句查询
GET http://localhost:8080/api/city ... on%3D城市

三、视频小结
下一视频《spring-data-elasticsearch 实战案例搭建》,会带来实战项目中涉及到的权重分 & 短语精准匹配的讲解。
 

spring-data-es 视频公开课(一)《elasticsearch 及 head 插件安装使用》

开源项目泥瓦匠BYSocket 发表了文章 • 1 个评论 • 1613 次浏览 • 2017-06-26 23:05 • 来自相关话题

spring-data-es 视频公开课(一)《elasticsearch 及 head 插件安装使用》 
视频如下:



 

一、前言
a. 版权声明 
本视频由 泥瓦匠BYSocket 支持 Spring For All 社区 www.spring4all.com ,版权为个人及社区所有,欢迎转发。

b. 视频主旨
学会 ElasticSearch 及 spring-data-elasticsearch项目实战教学

视频系列目录
spring-data-es 视频公开课(一)《elasticsearch 及 head 插件安装使用》spring-data-es 视频公开课(二)《spring-data-elasticsearch 简单案例搭建》spring-data-es 视频公开课(三)《spring-data-elasticsearch 实战案例搭建》

二、正文
本节提纲
一、Elasticsearch 安装
二、可视化插件 elasticsearch-head 安装
三、小结

运行环境
Mac OS 10.12.x
Elasticsearch 2.3.2

一、Elasticsearch 安装
什么是 Elasticsearch ?
Elasticsearch 是一个基于 Apache Lucene(TM) 的开源搜索引擎。无论在开源还是专有领域,Lucene 可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。并通过简单的 HTTP RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
Elasticsearch 不仅仅是 Lucene 和全文搜索,我们还能这样去描述它:
分布式的实时文件存储,每个字段都被索引并可被搜索分布式的实时分析搜索引擎可以扩展到上百台服务器,处理PB级结构化或非结构化数据


下面开始具体安装步骤:
1. .tar.gz 安装包安装 Elasticsearch 2.3.2
首先打开官网下载页 https://www.elastic.co/downloads/elasticsearch ,下载对应的 elasticsearch-2.3.2.tar.gz 文件,本文下载到 /java/es 目录。然后在文件的当前目录,通过 tar 命令解压安装包完成安装。tar -xzf elasticsearch-2.3.2.tar.gz
cd elasticsearch-2.3.2
2. 运行
一般在后台起守护线程启动 Elasticsearch,在命令行加入 -d 指定。自然,也可以加入 -p ,可将进程 ID 记录到文件中。./bin/elasticsearch -d








访问 http://localhost:9200/ ,可以看到成功运行的案例,返回的 JSON 页面。如图:
要关闭 Elasticsearch 进程,需要通过 ps 找到对应的 pid,在 kill pid 即可。ps aux |grep elasticsearch
kill -7 pid

二、可视化插件 elasticsearch-head 安装
官方 GitHub 地址:https://github.com/mobz/elasticsearch-head。
安装也很简单,安装 README 步骤走就好了:sudo ./bin/plugin install mobz/elasticsearch-head

访问 http://localhost:9200/_plugin/head/ ,右上角表示连接上了上小节启动的 Elasticsearch。
 

三、小结
本文写的比较基础,记录下主要两个点:
A、为啥不用高版本 ES?
- 版本问题,目前spring-data-elasticsearch 最高版本还只是 snapshot 版。所以 spring boot 的 starter 不敢用。详细点击 spring-data-elasticsearch Github 地址:
https://github.com/spring-proj ... earch
- 业界还是比较流行 2.3.2 和 最高版本 两种

B、为啥项目中不用 HTTP 去调用?
- 其实是可以的,HTTP 比较轻量级
- 本系列主要实践中总结 spring-data-elasticsearch ,spring-data-elasticsearch 提供对 ES 数据的访问



  查看全部
spring-data-es 视频公开课(一)《elasticsearch 及 head 插件安装使用》 
视频如下:




 

一、前言
a. 版权声明 
本视频由 泥瓦匠BYSocket 支持 Spring For All 社区 www.spring4all.com ,版权为个人及社区所有,欢迎转发。

b. 视频主旨
  • 学会 ElasticSearch 及 spring-data-elasticsearch
  • 项目实战教学


视频系列目录


二、正文
本节提纲
一、Elasticsearch 安装
二、可视化插件 elasticsearch-head 安装
三、小结

运行环境
Mac OS 10.12.x
Elasticsearch 2.3.2

一、Elasticsearch 安装
什么是 Elasticsearch ?
Elasticsearch 是一个基于 Apache Lucene(TM) 的开源搜索引擎。无论在开源还是专有领域,Lucene 可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。并通过简单的 HTTP RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
Elasticsearch 不仅仅是 Lucene 和全文搜索,我们还能这样去描述它:
  • 分布式的实时文件存储,每个字段都被索引并可被搜索
  • 分布式的实时分析搜索引擎
  • 可以扩展到上百台服务器,处理PB级结构化或非结构化数据



下面开始具体安装步骤:
1. .tar.gz 安装包安装 Elasticsearch 2.3.2
首先打开官网下载页 https://www.elastic.co/downloads/elasticsearch ,下载对应的 elasticsearch-2.3.2.tar.gz 文件,本文下载到 /java/es 目录。然后在文件的当前目录,通过 tar 命令解压安装包完成安装。
tar -xzf elasticsearch-2.3.2.tar.gz
cd elasticsearch-2.3.2

2. 运行
一般在后台起守护线程启动 Elasticsearch,在命令行加入 -d 指定。自然,也可以加入 -p ,可将进程 ID 记录到文件中。
./bin/elasticsearch -d








访问 http://localhost:9200/ ,可以看到成功运行的案例,返回的 JSON 页面。如图:
要关闭 Elasticsearch 进程,需要通过 ps 找到对应的 pid,在 kill pid 即可。
ps aux |grep elasticsearch
kill -7 pid


二、可视化插件 elasticsearch-head 安装
官方 GitHub 地址:https://github.com/mobz/elasticsearch-head
安装也很简单,安装 README 步骤走就好了:
sudo ./bin/plugin install mobz/elasticsearch-head


访问 http://localhost:9200/_plugin/head/ ,右上角表示连接上了上小节启动的 Elasticsearch。
 

三、小结
本文写的比较基础,记录下主要两个点:
A、为啥不用高版本 ES?
- 版本问题,目前spring-data-elasticsearch 最高版本还只是 snapshot 版。所以 spring boot 的 starter 不敢用。详细点击 spring-data-elasticsearch Github 地址:
https://github.com/spring-proj ... earch
- 业界还是比较流行 2.3.2 和 最高版本 两种

B、为啥项目中不用 HTTP 去调用?
- 其实是可以的,HTTP 比较轻量级
- 本系列主要实践中总结 spring-data-elasticsearch ,spring-data-elasticsearch 提供对 ES 数据的访问



 

elasticSearch应用场景

Spring Boot泥瓦匠BYSocket 回复了问题 • 2 人关注 • 1 个回复 • 382 次浏览 • 2017-06-25 22:09 • 来自相关话题

有哪位大神知道关于elasticsearch 比较好点中文教程吗

Spring Framework梁桂钊 回复了问题 • 6 人关注 • 4 个回复 • 529 次浏览 • 2017-06-15 21:51 • 来自相关话题

深入浅出 spring-data-elasticsearch 系列 - 概述及入门(二)

Spring Data泥瓦匠BYSocket 发表了文章 • 0 个评论 • 1307 次浏览 • 2017-06-08 15:45 • 来自相关话题

本文目录
一、spring-data-elasticsearch 是什么?
1.1 Spring Data
1.2 Spring Data Elasticsearch
二、spring-data-elasticsearch 快速入门
2.1 pom.xml 依赖
2.2 ElasticsearchRepository
2.3 ElasticsearchTemplate
2.4 使用案例
三、spring-data-elasticsearch 和 elasticsearch 版本
四、小结
 

一、spring-data-elasticsearch 是什么?
1.1 Spring Data
要了解 spring-data-elasticsearch 是什么,首先了解什么是 Spring Data。
Spring Data 基于 Spring 为数据访问提供一种相似且一致性的编程模型,并保存底层数据存储的。

1.2 Spring Data Elasticsearch
spring-data-elasticsearch 是 Spring Data 的 Community modules 之一,是 Spring Data 对 Elasticsearch 引擎的实现。
Elasticsearch 默认提供轻量级的 HTTP Restful 接口形式的访问。相对来说,使用 HTTP Client 调用也很简单。但 spring-data-elasticsearch 可以更快的支持构建在 Spring 应用上,比如在 application.properties 配置 ES 节点信息和 spring-boot-starter-data-elasticsearch 依赖,直接在 Spring Boot 应用上使用。

二、spring-data-elasticsearch 快速入门
2.1 pom.xml 依赖<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>x.y.z.RELEASE</version>
</dependency>
2.2 ElasticsearchRepository
ES 通用的存储接口的一种默认实现。Spring 根据接口定义的方法名,具体执行对应的数据存储实现。
ElasticsearchRepository 继承 ElasticsearchCrudRepository ,ElasticsearchCrudRepository 继承 PagingAndSortingRepository。所以一般 CRUD 带分页已经支持。如图:
 






2.3 ElasticsearchTemplate
ES 数据操作的中心支持类。和 JdbcTemplate 一样,几乎所有操作都可以使用 ElasticsearchTemplate 来完成。
ElasticsearchTemplate 实现了 ElasticsearchOperations 和 ApplicationContextAware 接口。ElasticsearchOperations 接口提供了 ES 相关的操作,并将 ElasticsearchTemplate 加入到 Spring 上下文。如图:
 





 
2.4 使用案例
拿官方案例来吧,详细介绍了 Book ES 对象的接口实现。
可以看出,book 拥有 name 和 price 两个属性。下面支持  name 和 price 列表 ES 查询,分页查询,范围查询等。还有可以利用注解实现 DSL 操作。 public interface BookRepository extends Repository<Book, String> {
List<Book> findByNameAndPrice(String name, Integer price);
List<Book> findByNameOrPrice(String name, Integer price);
Page<Book> findByName(String name,Pageable page);
Page<Book> findByNameNot(String name,Pageable page);
Page<Book> findByPriceBetween(int price,Pageable page);
Page<Book> findByNameLike(String name,Pageable page);
@Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}")
Page<Book> findByMessage(String message, Pageable pageable);
}

三、spring-data-elasticsearch 和 elasticsearch 版本
SpringBoot 1.5+ 目前仅支持 ElasticSearch 2.3.2,所以如果想要使用最新的 ES。可以通过默认的轻量级的 HTTP 去调用实现。其版本对应如下:

spring data elasticsearch    elasticsearch
3.0.0.BUILD-SNAPSHOT    5.4.0
2.0.4.RELEASE                    2.4.0
2.0.0.RELEASE                    2.2.0
1.4.0.M1                               1.7.3
1.3.0.RELEASE                    1.5.2
1.2.0.RELEASE                    1.4.4
1.1.0.RELEASE                    1.3.2
1.0.0.RELEASE                    1.1.1

四、小结
本小结介绍了 spring-data-elasticsearch 是概述以及它的入门,还有 spring-data-elasticsearch 核心接口及版本的情况。

资料:
项目地址
https://github.com/spring-proj ... earch
官方文档
http://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/ 

本文作者: 泥瓦匠
原文链接: http://www.bysocket.com
版权归作者所有,转载请注明出处 查看全部
本文目录
一、spring-data-elasticsearch 是什么?
1.1 Spring Data
1.2 Spring Data Elasticsearch
二、spring-data-elasticsearch 快速入门
2.1 pom.xml 依赖
2.2 ElasticsearchRepository
2.3 ElasticsearchTemplate
2.4 使用案例
三、spring-data-elasticsearch 和 elasticsearch 版本
四、小结
 

一、spring-data-elasticsearch 是什么?
1.1 Spring Data
要了解 spring-data-elasticsearch 是什么,首先了解什么是 Spring Data。
Spring Data 基于 Spring 为数据访问提供一种相似且一致性的编程模型,并保存底层数据存储的。

1.2 Spring Data Elasticsearch
spring-data-elasticsearch 是 Spring Data 的 Community modules 之一,是 Spring Data 对 Elasticsearch 引擎的实现。
Elasticsearch 默认提供轻量级的 HTTP Restful 接口形式的访问。相对来说,使用 HTTP Client 调用也很简单。但 spring-data-elasticsearch 可以更快的支持构建在 Spring 应用上,比如在 application.properties 配置 ES 节点信息和 spring-boot-starter-data-elasticsearch 依赖,直接在 Spring Boot 应用上使用。

二、spring-data-elasticsearch 快速入门
2.1 pom.xml 依赖
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>x.y.z.RELEASE</version>
</dependency>

2.2 ElasticsearchRepository
ES 通用的存储接口的一种默认实现。Spring 根据接口定义的方法名,具体执行对应的数据存储实现。
ElasticsearchRepository 继承 ElasticsearchCrudRepository ,ElasticsearchCrudRepository 继承 PagingAndSortingRepository。所以一般 CRUD 带分页已经支持。如图:
 
esr.png



2.3 ElasticsearchTemplate
ES 数据操作的中心支持类。和 JdbcTemplate 一样,几乎所有操作都可以使用 ElasticsearchTemplate 来完成。
ElasticsearchTemplate 实现了 ElasticsearchOperations 和 ApplicationContextAware 接口。ElasticsearchOperations 接口提供了 ES 相关的操作,并将 ElasticsearchTemplate 加入到 Spring 上下文。如图:
 
est.png


 
2.4 使用案例
拿官方案例来吧,详细介绍了 Book ES 对象的接口实现。
可以看出,book 拥有 name 和 price 两个属性。下面支持  name 和 price 列表 ES 查询,分页查询,范围查询等。还有可以利用注解实现 DSL 操作。
    public interface BookRepository extends Repository<Book, String> {
List<Book> findByNameAndPrice(String name, Integer price);
List<Book> findByNameOrPrice(String name, Integer price);
Page<Book> findByName(String name,Pageable page);
Page<Book> findByNameNot(String name,Pageable page);
Page<Book> findByPriceBetween(int price,Pageable page);
Page<Book> findByNameLike(String name,Pageable page);
@Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}")
Page<Book> findByMessage(String message, Pageable pageable);
}


三、spring-data-elasticsearch 和 elasticsearch 版本
SpringBoot 1.5+ 目前仅支持 ElasticSearch 2.3.2,所以如果想要使用最新的 ES。可以通过默认的轻量级的 HTTP 去调用实现。其版本对应如下:

spring data elasticsearch    elasticsearch
3.0.0.BUILD-SNAPSHOT    5.4.0
2.0.4.RELEASE                    2.4.0
2.0.0.RELEASE                    2.2.0
1.4.0.M1                               1.7.3
1.3.0.RELEASE                    1.5.2
1.2.0.RELEASE                    1.4.4
1.1.0.RELEASE                    1.3.2
1.0.0.RELEASE                    1.1.1

四、小结
本小结介绍了 spring-data-elasticsearch 是概述以及它的入门,还有 spring-data-elasticsearch 核心接口及版本的情况。

资料:
项目地址
https://github.com/spring-proj ... earch
官方文档
http://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/ 


本文作者: 泥瓦匠
原文链接: http://www.bysocket.com
版权归作者所有,转载请注明出处


深入浅出 spring-data-elasticsearch 之 ElasticSearch 架构初探(一)

Spring Data泥瓦匠BYSocket 发表了文章 • 2 个评论 • 2552 次浏览 • 2017-06-04 17:20 • 来自相关话题

本文目录
一、Elasticsearch 基本术语
1.1 文档(Document)、索引(Index)、类型(Type)文档三要素
1.2 集群(Cluster)、节点(Node)、分片(Shard)分布式三要素
二、Elasticsearch 工作原理
2.1 文档存储的路由
2.2 如何健康检查
2.3 如何水平扩容
三、小结

一、Elasticsearch 基本术语

1.1 文档(Document)、索引(Index)、类型(Type)文档三要素
文档(Document)
文档,在面向对象观念就是一个对象。在 ES 里面,是一个大 JSON 对象,是指定了唯一 ID 的最底层或者根对象。文档的位置由 _index、_type 和 _id 唯一标识。

索引(Index)
索引,用于区分文档成组,即分到一组的文档集合。索引,用于存储文档和使文档可被搜索。比如项目存索引 project 里面,交易存索引 sales 等。

类型(Type)
类型,用于区分索引中的文档,即在索引中对数据逻辑分区。比如索引 project 的项目数据,根据项目类型 ui 项目、插画项目等进行区分。

和关系型数据库 MySQL 做个类比:
Document 类似于 Record
Type 类似于 Table
Index 类似于 Database

1.2 集群(Cluster)、节点(Node)、分片(Shard)分布式三要素
集群(Cluster)
服务器集群大家都知道,这里 ES 也是类似的。多个 ElasticSearch 运行实例(节点)组合的组合体是 ElasticSearch 集群。
ElasticSearch 是天然的分布式,通过水平扩容为集群添加更多节点。
集群是去中心化的,有一个主节点(Master)。主节点是动态选举,因此不会出现单点故障。

那分片和节点的配置呢?
节点(Node)
一个 ElasticSearch 运行实例就是节点。顺着集群来,任何节点都可以被选举成为主节点。主节点负责集群内所以变更,比如索引的增加、删除等。所以集群不会因为主节点流量的增大成为瓶颈。因为任何节点都会成为主节点。
下面有 3 个节点,第 1 个节点有:2 个主分片和 1 个副分片。如图:





那么,只有一个节点的 ElasticSearch 服务会存在瓶颈。如图:





分片(Shard)
分片,是 ES 节点中最小的工作单元。分片仅仅保存全部数据的一部分,分片的集合是 ES 的索引。分片包括主分片和副分片,主分片是副分片的拷贝。主分片和副分片地工作基本没有大的区别。
在索引中全文搜索,然后会查询到每个分片,将每个分配的结果进行全局地收集处理,并返回。

二、Elasticsearch 工作原理

2.1 文档存储的路由
当索引到一个文档(如:报价系统),具体的文档数据(如:报价数据)会存储到一个分片。具体文档数据会被切分,并分别存储在分片 1 或者 分片 2 … 
那么如何确定存在哪个分片呢?
存储路由过程由下面地公式决定:shard = hash(routing) % number_of_primary_shards
routing 是可变值,支持自定义,默认文档 _id。
hash 函数生成数字,经过取余算法得到余数,那么这个余数就是分片的位置。
这是不是有点负载均衡的类似。
 
2.2 如何健康检查
集群名,集群的健康状态GET http://127.0.0.1:9200/_cluster/stats
{
"cluster_name": "elasticsearch",
"status": "green",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 0,
"active_shards": 0,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0
}
status 字段是需要我们关心的。状态可能是下列三个值之一:green
所有的主分片和副本分片都已分配。你的集群是 100% 可用的。
yellow
所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。高可用会弱化把 yellow 想象成一个需要及时调查的警告。
red
至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。


active_primary_shards 集群中的主分片数量
active_shards 所有分片的汇总值
relocating_shards 显示当前正在从一个节点迁往其他节点的分片的数量。通常来说应该是 0,不过在 Elasticsearch 发现集群不太均衡时,该值会上涨。比如说:添加了一个新节点,或者下线了一个节点。
initializing_shards 刚刚创建的分片的个数。
unassigned_shards 已经在集群状态中存在的分片。
 
2.3 如何水平扩容
主分片在索引创建已经确定。读操作可以同时被主分片和副分片处理。因此,更多的分片,会拥有更高的吞吐量。自然,需要增加更多的硬件资源支持吞吐量。
说明,这里无法提高性能,因为每个分片获得的资源会变少。
动态调整副本分片数,按需伸缩集群,比如把副本数默认值为 1 增加到 2:PUT /blogs/_settings
{
"number_of_replicas" : 2
}

三、小结
简单初探了下 ElasticSearch 的相关内容。后面会主要落地到实战,关于  spring-data-elasticsearch 这块的实战。

最后,《 深入浅出 spring-data-elasticsearch 》小连载目录如下:
深入浅出 spring-data-elasticsearch - ElasticSearch 架构初探(一)
深入浅出 spring-data-elasticsearch - 概述(二)
深入浅出 spring-data-elasticsearch - 基本案例详解(三)
深入浅出 spring-data-elasticsearch - 复杂案例详解(四)
深入浅出 spring-data-elasticsearch - 架构原理以及源码浅析(五)
 

资料:
官方《Elasticsearch: 权威指南》
https://www.elastic.co/guide/c ... .html
 

本文作者: 泥瓦匠
原文链接: http://www.bysocket.com
版权归作者所有,转载请注明出处 查看全部
本文目录
一、Elasticsearch 基本术语
1.1 文档(Document)、索引(Index)、类型(Type)文档三要素
1.2 集群(Cluster)、节点(Node)、分片(Shard)分布式三要素
二、Elasticsearch 工作原理
2.1 文档存储的路由
2.2 如何健康检查
2.3 如何水平扩容
三、小结

一、Elasticsearch 基本术语

1.1 文档(Document)、索引(Index)、类型(Type)文档三要素
文档(Document)
文档,在面向对象观念就是一个对象。在 ES 里面,是一个大 JSON 对象,是指定了唯一 ID 的最底层或者根对象。文档的位置由 _index、_type 和 _id 唯一标识。

索引(Index)
索引,用于区分文档成组,即分到一组的文档集合。索引,用于存储文档和使文档可被搜索。比如项目存索引 project 里面,交易存索引 sales 等。

类型(Type)
类型,用于区分索引中的文档,即在索引中对数据逻辑分区。比如索引 project 的项目数据,根据项目类型 ui 项目、插画项目等进行区分。

和关系型数据库 MySQL 做个类比
Document 类似于 Record
Type 类似于 Table
Index 类似于 Database

1.2 集群(Cluster)、节点(Node)、分片(Shard)分布式三要素
集群(Cluster)
服务器集群大家都知道,这里 ES 也是类似的。多个 ElasticSearch 运行实例(节点)组合的组合体是 ElasticSearch 集群。
ElasticSearch 是天然的分布式,通过水平扩容为集群添加更多节点。
集群是去中心化的,有一个主节点(Master)。主节点是动态选举,因此不会出现单点故障。

那分片和节点的配置呢?
节点(Node
一个 ElasticSearch 运行实例就是节点。顺着集群来,任何节点都可以被选举成为主节点。主节点负责集群内所以变更,比如索引的增加、删除等。所以集群不会因为主节点流量的增大成为瓶颈。因为任何节点都会成为主节点。
下面有 3 个节点,第 1 个节点有:2 个主分片和 1 个副分片。如图:
elas_node.png


那么,只有一个节点的 ElasticSearch 服务会存在瓶颈。如图:
elas_0201.png


分片(Shard)
分片,是 ES 节点中最小的工作单元。分片仅仅保存全部数据的一部分,分片的集合是 ES 的索引。分片包括主分片和副分片,主分片是副分片的拷贝。主分片和副分片地工作基本没有大的区别。
在索引中全文搜索,然后会查询到每个分片,将每个分配的结果进行全局地收集处理,并返回。

二、Elasticsearch 工作原理

2.1 文档存储的路由
当索引到一个文档(如:报价系统),具体的文档数据(如:报价数据)会存储到一个分片。具体文档数据会被切分,并分别存储在分片 1 或者 分片 2 … 
那么如何确定存在哪个分片呢?
存储路由过程由下面地公式决定:
shard = hash(routing) % number_of_primary_shards

routing 是可变值,支持自定义,默认文档 _id。
hash 函数生成数字,经过取余算法得到余数,那么这个余数就是分片的位置。
这是不是有点负载均衡的类似。
 
2.2 如何健康检查
集群名,集群的健康状态
GET http://127.0.0.1:9200/_cluster/stats 
{
"cluster_name": "elasticsearch",
"status": "green",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 0,
"active_shards": 0,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0
}

status 字段是需要我们关心的。状态可能是下列三个值之一:
green
所有的主分片和副本分片都已分配。你的集群是 100% 可用的。
yellow
所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。高可用会弱化把 yellow 想象成一个需要及时调查的警告。
red
至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。


active_primary_shards 集群中的主分片数量
active_shards 所有分片的汇总值
relocating_shards 显示当前正在从一个节点迁往其他节点的分片的数量。通常来说应该是 0,不过在 Elasticsearch 发现集群不太均衡时,该值会上涨。比如说:添加了一个新节点,或者下线了一个节点。
initializing_shards 刚刚创建的分片的个数。
unassigned_shards 已经在集群状态中存在的分片。
 
2.3 如何水平扩容
主分片在索引创建已经确定。读操作可以同时被主分片和副分片处理。因此,更多的分片,会拥有更高的吞吐量。自然,需要增加更多的硬件资源支持吞吐量。
说明,这里无法提高性能,因为每个分片获得的资源会变少。
动态调整副本分片数,按需伸缩集群,比如把副本数默认值为 1 增加到 2:
PUT /blogs/_settings
{
"number_of_replicas" : 2
}


三、小结
简单初探了下 ElasticSearch 的相关内容。后面会主要落地到实战,关于  spring-data-elasticsearch 这块的实战。

最后,《 深入浅出 spring-data-elasticsearch 》小连载目录如下:
深入浅出 spring-data-elasticsearch - ElasticSearch 架构初探(一)
深入浅出 spring-data-elasticsearch - 概述(二)
深入浅出 spring-data-elasticsearch - 基本案例详解(三)
深入浅出 spring-data-elasticsearch - 复杂案例详解(四)
深入浅出 spring-data-elasticsearch - 架构原理以及源码浅析(五)
 

资料:
官方《Elasticsearch: 权威指南》
https://www.elastic.co/guide/c ... .html
 


本文作者: 泥瓦匠
原文链接: http://www.bysocket.com
版权归作者所有,转载请注明出处


深入浅出 spring-data-elasticsearch 之 ElasticSearch 架构初探(一)

Spring Data泥瓦匠BYSocket 发表了文章 • 2 个评论 • 2552 次浏览 • 2017-06-04 17:20 • 来自相关话题

本文目录
一、Elasticsearch 基本术语
1.1 文档(Document)、索引(Index)、类型(Type)文档三要素
1.2 集群(Cluster)、节点(Node)、分片(Shard)分布式三要素
二、Elasticsearch 工作原理
2.1 文档存储的路由
2.2 如何健康检查
2.3 如何水平扩容
三、小结

一、Elasticsearch 基本术语

1.1 文档(Document)、索引(Index)、类型(Type)文档三要素
文档(Document)
文档,在面向对象观念就是一个对象。在 ES 里面,是一个大 JSON 对象,是指定了唯一 ID 的最底层或者根对象。文档的位置由 _index、_type 和 _id 唯一标识。

索引(Index)
索引,用于区分文档成组,即分到一组的文档集合。索引,用于存储文档和使文档可被搜索。比如项目存索引 project 里面,交易存索引 sales 等。

类型(Type)
类型,用于区分索引中的文档,即在索引中对数据逻辑分区。比如索引 project 的项目数据,根据项目类型 ui 项目、插画项目等进行区分。

和关系型数据库 MySQL 做个类比:
Document 类似于 Record
Type 类似于 Table
Index 类似于 Database

1.2 集群(Cluster)、节点(Node)、分片(Shard)分布式三要素
集群(Cluster)
服务器集群大家都知道,这里 ES 也是类似的。多个 ElasticSearch 运行实例(节点)组合的组合体是 ElasticSearch 集群。
ElasticSearch 是天然的分布式,通过水平扩容为集群添加更多节点。
集群是去中心化的,有一个主节点(Master)。主节点是动态选举,因此不会出现单点故障。

那分片和节点的配置呢?
节点(Node)
一个 ElasticSearch 运行实例就是节点。顺着集群来,任何节点都可以被选举成为主节点。主节点负责集群内所以变更,比如索引的增加、删除等。所以集群不会因为主节点流量的增大成为瓶颈。因为任何节点都会成为主节点。
下面有 3 个节点,第 1 个节点有:2 个主分片和 1 个副分片。如图:





那么,只有一个节点的 ElasticSearch 服务会存在瓶颈。如图:





分片(Shard)
分片,是 ES 节点中最小的工作单元。分片仅仅保存全部数据的一部分,分片的集合是 ES 的索引。分片包括主分片和副分片,主分片是副分片的拷贝。主分片和副分片地工作基本没有大的区别。
在索引中全文搜索,然后会查询到每个分片,将每个分配的结果进行全局地收集处理,并返回。

二、Elasticsearch 工作原理

2.1 文档存储的路由
当索引到一个文档(如:报价系统),具体的文档数据(如:报价数据)会存储到一个分片。具体文档数据会被切分,并分别存储在分片 1 或者 分片 2 … 
那么如何确定存在哪个分片呢?
存储路由过程由下面地公式决定:shard = hash(routing) % number_of_primary_shards
routing 是可变值,支持自定义,默认文档 _id。
hash 函数生成数字,经过取余算法得到余数,那么这个余数就是分片的位置。
这是不是有点负载均衡的类似。
 
2.2 如何健康检查
集群名,集群的健康状态GET http://127.0.0.1:9200/_cluster/stats
{
"cluster_name": "elasticsearch",
"status": "green",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 0,
"active_shards": 0,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0
}
status 字段是需要我们关心的。状态可能是下列三个值之一:green
所有的主分片和副本分片都已分配。你的集群是 100% 可用的。
yellow
所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。高可用会弱化把 yellow 想象成一个需要及时调查的警告。
red
至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。


active_primary_shards 集群中的主分片数量
active_shards 所有分片的汇总值
relocating_shards 显示当前正在从一个节点迁往其他节点的分片的数量。通常来说应该是 0,不过在 Elasticsearch 发现集群不太均衡时,该值会上涨。比如说:添加了一个新节点,或者下线了一个节点。
initializing_shards 刚刚创建的分片的个数。
unassigned_shards 已经在集群状态中存在的分片。
 
2.3 如何水平扩容
主分片在索引创建已经确定。读操作可以同时被主分片和副分片处理。因此,更多的分片,会拥有更高的吞吐量。自然,需要增加更多的硬件资源支持吞吐量。
说明,这里无法提高性能,因为每个分片获得的资源会变少。
动态调整副本分片数,按需伸缩集群,比如把副本数默认值为 1 增加到 2:PUT /blogs/_settings
{
"number_of_replicas" : 2
}

三、小结
简单初探了下 ElasticSearch 的相关内容。后面会主要落地到实战,关于  spring-data-elasticsearch 这块的实战。

最后,《 深入浅出 spring-data-elasticsearch 》小连载目录如下:
深入浅出 spring-data-elasticsearch - ElasticSearch 架构初探(一)
深入浅出 spring-data-elasticsearch - 概述(二)
深入浅出 spring-data-elasticsearch - 基本案例详解(三)
深入浅出 spring-data-elasticsearch - 复杂案例详解(四)
深入浅出 spring-data-elasticsearch - 架构原理以及源码浅析(五)
 

资料:
官方《Elasticsearch: 权威指南》
https://www.elastic.co/guide/c ... .html
 

本文作者: 泥瓦匠
原文链接: http://www.bysocket.com
版权归作者所有,转载请注明出处 查看全部
本文目录
一、Elasticsearch 基本术语
1.1 文档(Document)、索引(Index)、类型(Type)文档三要素
1.2 集群(Cluster)、节点(Node)、分片(Shard)分布式三要素
二、Elasticsearch 工作原理
2.1 文档存储的路由
2.2 如何健康检查
2.3 如何水平扩容
三、小结

一、Elasticsearch 基本术语

1.1 文档(Document)、索引(Index)、类型(Type)文档三要素
文档(Document)
文档,在面向对象观念就是一个对象。在 ES 里面,是一个大 JSON 对象,是指定了唯一 ID 的最底层或者根对象。文档的位置由 _index、_type 和 _id 唯一标识。

索引(Index)
索引,用于区分文档成组,即分到一组的文档集合。索引,用于存储文档和使文档可被搜索。比如项目存索引 project 里面,交易存索引 sales 等。

类型(Type)
类型,用于区分索引中的文档,即在索引中对数据逻辑分区。比如索引 project 的项目数据,根据项目类型 ui 项目、插画项目等进行区分。

和关系型数据库 MySQL 做个类比
Document 类似于 Record
Type 类似于 Table
Index 类似于 Database

1.2 集群(Cluster)、节点(Node)、分片(Shard)分布式三要素
集群(Cluster)
服务器集群大家都知道,这里 ES 也是类似的。多个 ElasticSearch 运行实例(节点)组合的组合体是 ElasticSearch 集群。
ElasticSearch 是天然的分布式,通过水平扩容为集群添加更多节点。
集群是去中心化的,有一个主节点(Master)。主节点是动态选举,因此不会出现单点故障。

那分片和节点的配置呢?
节点(Node
一个 ElasticSearch 运行实例就是节点。顺着集群来,任何节点都可以被选举成为主节点。主节点负责集群内所以变更,比如索引的增加、删除等。所以集群不会因为主节点流量的增大成为瓶颈。因为任何节点都会成为主节点。
下面有 3 个节点,第 1 个节点有:2 个主分片和 1 个副分片。如图:
elas_node.png


那么,只有一个节点的 ElasticSearch 服务会存在瓶颈。如图:
elas_0201.png


分片(Shard)
分片,是 ES 节点中最小的工作单元。分片仅仅保存全部数据的一部分,分片的集合是 ES 的索引。分片包括主分片和副分片,主分片是副分片的拷贝。主分片和副分片地工作基本没有大的区别。
在索引中全文搜索,然后会查询到每个分片,将每个分配的结果进行全局地收集处理,并返回。

二、Elasticsearch 工作原理

2.1 文档存储的路由
当索引到一个文档(如:报价系统),具体的文档数据(如:报价数据)会存储到一个分片。具体文档数据会被切分,并分别存储在分片 1 或者 分片 2 … 
那么如何确定存在哪个分片呢?
存储路由过程由下面地公式决定:
shard = hash(routing) % number_of_primary_shards

routing 是可变值,支持自定义,默认文档 _id。
hash 函数生成数字,经过取余算法得到余数,那么这个余数就是分片的位置。
这是不是有点负载均衡的类似。
 
2.2 如何健康检查
集群名,集群的健康状态
GET http://127.0.0.1:9200/_cluster/stats 
{
"cluster_name": "elasticsearch",
"status": "green",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 0,
"active_shards": 0,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0
}

status 字段是需要我们关心的。状态可能是下列三个值之一:
green
所有的主分片和副本分片都已分配。你的集群是 100% 可用的。
yellow
所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。高可用会弱化把 yellow 想象成一个需要及时调查的警告。
red
至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。


active_primary_shards 集群中的主分片数量
active_shards 所有分片的汇总值
relocating_shards 显示当前正在从一个节点迁往其他节点的分片的数量。通常来说应该是 0,不过在 Elasticsearch 发现集群不太均衡时,该值会上涨。比如说:添加了一个新节点,或者下线了一个节点。
initializing_shards 刚刚创建的分片的个数。
unassigned_shards 已经在集群状态中存在的分片。
 
2.3 如何水平扩容
主分片在索引创建已经确定。读操作可以同时被主分片和副分片处理。因此,更多的分片,会拥有更高的吞吐量。自然,需要增加更多的硬件资源支持吞吐量。
说明,这里无法提高性能,因为每个分片获得的资源会变少。
动态调整副本分片数,按需伸缩集群,比如把副本数默认值为 1 增加到 2:
PUT /blogs/_settings
{
"number_of_replicas" : 2
}


三、小结
简单初探了下 ElasticSearch 的相关内容。后面会主要落地到实战,关于  spring-data-elasticsearch 这块的实战。

最后,《 深入浅出 spring-data-elasticsearch 》小连载目录如下:
深入浅出 spring-data-elasticsearch - ElasticSearch 架构初探(一)
深入浅出 spring-data-elasticsearch - 概述(二)
深入浅出 spring-data-elasticsearch - 基本案例详解(三)
深入浅出 spring-data-elasticsearch - 复杂案例详解(四)
深入浅出 spring-data-elasticsearch - 架构原理以及源码浅析(五)
 

资料:
官方《Elasticsearch: 权威指南》
https://www.elastic.co/guide/c ... .html
 


本文作者: 泥瓦匠
原文链接: http://www.bysocket.com
版权归作者所有,转载请注明出处


elasticSearch应用场景

回复

Spring Boot泥瓦匠BYSocket 回复了问题 • 2 人关注 • 1 个回复 • 382 次浏览 • 2017-06-25 22:09 • 来自相关话题

有哪位大神知道关于elasticsearch 比较好点中文教程吗

回复

Spring Framework梁桂钊 回复了问题 • 6 人关注 • 4 个回复 • 529 次浏览 • 2017-06-15 21:51 • 来自相关话题

使用springdata操作es出错org.elasticsearch.client.transport.NoNodeAvailableException

Spring Datastrongant 发表了文章 • 3 个评论 • 252 次浏览 • 2017-07-16 13:42 • 来自相关话题

  之前的项目中使用的是http-client操作es,比较轻量级。目前为了学习下springdata,使用Java API 的方式来操作ES,但是在引入springdata的es模块依赖后,操作es并未成功,出现以下错误:org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [{#transport#-1}{127.0.0.1}{127.0.0.1:9300}]
注意:如果你下载elasticsearch的压缩包安装的话,可能不会出现该问题!因为es默认的配置文件cluster.name是elasticsearch。但是奇葩的是使用brew安装es之后,默认的elasticsearch.yml的配置项成了这样:cluster.name: elasticsearch_bwh,就是这个原因导致了这个问题的产生,项目启动后控制台一直抛这个错:transport#-1}{127.0.0.1}{127.0.0.1:9300} not part of the cluster Cluster [Assassin], ignoring...当执行添加操作时,提示:org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [{#transport#-1}{127.0.0.1}{127.0.0.1:9300}]最后需要注意的是,如果你修改了es默认的集群名称,则需要在src/main/resources/application.properties配置文件中进行指定:

spring.data.elasticsearch.clusterName=elasticsearch_bwh
通过源码org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchProperties可以看到,默认的
clusterName为elasticsearch。
 
希望可以帮助遇到此类问题的同学。 查看全部
  之前的项目中使用的是http-client操作es,比较轻量级。目前为了学习下springdata,使用Java API 的方式来操作ES,但是在引入springdata的es模块依赖后,操作es并未成功,出现以下错误:
org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [{#transport#-1}{127.0.0.1}{127.0.0.1:9300}]

注意:如果你下载elasticsearch的压缩包安装的话,可能不会出现该问题!因为es默认的配置文件cluster.name是elasticsearch。但是奇葩的是使用brew安装es之后,默认的elasticsearch.yml的配置项成了这样:cluster.name: elasticsearch_bwh,就是这个原因导致了这个问题的产生,项目启动后控制台一直抛这个错:
transport#-1}{127.0.0.1}{127.0.0.1:9300} not part of the cluster Cluster [Assassin], ignoring...
当执行添加操作时,提示:
org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [{#transport#-1}{127.0.0.1}{127.0.0.1:9300}]
最后需要注意的是,如果你修改了es默认的集群名称,则需要在src/main/resources/application.properties配置文件中进行指定:

spring.data.elasticsearch.clusterName=elasticsearch_bwh
通过源码org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchProperties可以看到,默认的
clusterName为elasticsearch。
 
希望可以帮助遇到此类问题的同学。

spring-data-es 视频公开课(二)《spring-data-elasticsearch 简单案例搭建》

开源项目泥瓦匠BYSocket 发表了文章 • 5 个评论 • 1478 次浏览 • 2017-06-27 20:46 • 来自相关话题

spring-data-es 视频公开课(二)《spring-data-elasticsearch 简单案例搭建》
视频如下:







一、前言
a. 版权声明 
本视频由 泥瓦匠BYSocket 支持 Spring For All 社区 www.spring4all.com ,版权为个人及社区所有,欢迎转发。
b. 视频主旨
学会 ElasticSearch 及 spring-data-elasticsearch项目实战教学

视频系列目录
spring-data-es 视频公开课(一)《elasticsearch 及 head 插件安装使用》spring-data-es 视频公开课(二)《spring-data-elasticsearch 简单案例搭建》spring-data-es 视频公开课(三)《spring-data-elasticsearch 实战案例搭建》

二、正文

本节提纲
一、spring-data-elasticsearch-crud 的工程介绍
二、搭建 spring-data-elasticsearch-crud 工程

一、spring-data-elasticsearch-crud 的工程介绍
spring-data-elasticsearch-crud 的工程,介绍 Spring Data Elasticsearch 简单的 ES 操作。Spring Data Elasticsearch 可以跟 JPA 进行类比。其使用方法也很简单。

二、运行 spring-data-elasticsearch-crud 工程
1.后台起守护线程启动 Elasticsearch
cd elasticsearch-2.3.2/
./bin/elasticsearch -d

2.添加 maven 依赖
pom.xml:<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/ma ... gt%3B
<modelVersion>4.0.0</modelVersion>
<groupId>springboot</groupId>
<artifactId>spring-data-elasticsearch-crud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-data-elasticsearch-crud :: spring-data-elasticsearch - 基本案例 </name>
<!-- Spring Boot 启动父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
</parent>
<dependencies>
<!-- Spring Boot Elasticsearch 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- Spring Boot Web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>


这里依赖的 spring-boot-starter-data-elasticsearch 版本是 1.5.1.RELEASE,对应的 spring-data-elasticsearch 版本是 2.1.0.RELEASE。对应官方文档:http://docs.spring.io/spring-d ... html/。后面数据操作层都是通过该 spring-data-elasticsearch 提供的接口实现。

3.新建启动 Application 类
Application.java:// Spring Boot 应用的标识
@SpringBootApplication
public class Application {
public static void main(String args) {
// 程序启动入口
// 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
SpringApplication.run(Application.class,args);
}
}

4.编写 ES 代码(重点)
application.properties
 配置 ES 地址# ES
spring.data.elasticsearch.repositories.enabled = true
spring.data.elasticsearch.cluster-nodes = 127.0.0.1:9300
默认 9300 是 Java 客户端的端口。9200 是支持 Restful HTTP 的接口。
更多配置:
 spring.data.elasticsearch.cluster-name Elasticsearch    集群名。(默认值: elasticsearch)
 spring.data.elasticsearch.cluster-nodes    集群节点地址列表,用逗号分隔。如果没有指定,就启动一个客户端节点。
 spring.data.elasticsearch.propertie     用来配置客户端的额外属性。
 spring.data.elasticsearch.repositories.enabled     开启 Elasticsearch 仓库。(默认值:true。)


ES domain 实体类
City.java/**
* 城市实体类
* <p>
* Created by bysocket on 03/05/2017.
*/
@Document(indexName = "province", type = "city")
public class City implements Serializable {
private static final long serialVersionUID = -1L;
/**
* 城市编号
*/
private Long id;
/**
* 城市名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 城市评分
*/
private Integer score;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
}


注意
a. City 属性名不支持驼峰式。
b. indexName 配置必须是全部小写,不然会出异常。
org.elasticsearch.indices.InvalidIndexNameException: Invalid index name [provinceIndex], must be lowercase
 

ES 数据操作层
CityRepository.java/**
* ES 操作类
* <p>
* Created by bysocket on 17/05/2017.
*/
public interface CityRepository extends ElasticsearchRepository<City, Long> {
/**
* AND 语句查询
*
* @param description
* @param score
* @return
*/
List<City> findByDescriptionAndScore(String description, Integer score);
/**
* OR 语句查询
*
* @param description
* @param score
* @return
*/
List<City> findByDescriptionOrScore(String description, Integer score);
/**
* 查询城市描述
*
* 等同于下面代码
* @Query("{\"bool\" : {\"must\" : {\"term\" : {\"description\" : \"?0\"}}}}")
* Page<City> findByDescription(String description, Pageable pageable);
*
* @param description
* @param page
* @return
*/
Page<City> findByDescription(String description, Pageable page);
/**
* NOT 语句查询
*
* @param description
* @param page
* @return
*/
Page<City> findByDescriptionNot(String description, Pageable page);
/**
* LIKE 语句查询
*
* @param description
* @param page
* @return
*/
Page<City> findByDescriptionLike(String description, Pageable page);
}
接口只要继承 ElasticsearchRepository 类即可。默认会提供很多实现,比如 CRUD 和搜索相关的实现。类似于 JPA 读取数据,是使用 CrudRepository 进行操作 ES 数据。支持的默认方法有: count(), findAll(), findOne(ID), delete(ID), deleteAll(), exists(ID), save(DomainObject), save(Iterable<DomainObject>)。

另外可以看出,接口的命名是遵循规范的。常用命名规则如下:
关键字     方法命名
And          findByNameAndPwd
Or             findByNameOrSex
Is              findById
Between   findByIdBetween
Like           findByNameLike
NotLike     findByNameNotLike
OrderBy    findByIdOrderByXDesc
Not           findByNameNot


城市 ES 业务接口类
CityService.java/**
* 城市 ES 业务接口类
*
*/
public interface CityService {
/**
* 新增 ES 城市信息
*
* @param city
* @return
*/
Long saveCity(City city);
/**
* AND 语句查询
*
* @param description
* @param score
* @return
*/
List<City> findByDescriptionAndScore(String description, Integer score);
/**
* OR 语句查询
*
* @param description
* @param score
* @return
*/
List<City> findByDescriptionOrScore(String description, Integer score);
/**
* 查询城市描述
*
* @param description
* @return
*/
List<City> findByDescription(String description);
/**
* NOT 语句查询
*
* @param description
* @return
*/
List<City> findByDescriptionNot(String description);
/**
* LIKE 语句查询
*
* @param description
* @return
*/
List<City> findByDescriptionLike(String description);
}




城市 ES 业务逻辑实现类
CityESServiceImpl.java/**
* 城市 ES 业务逻辑实现类
* <p>
* Created by bysocket on 07/02/2017.
*/
@Service
public class CityESServiceImpl implements CityService {
private static final Logger LOGGER = LoggerFactory.getLogger(CityESServiceImpl.class);
// 分页参数 -> TODO 代码可迁移到具体项目的公共 common 模块
private static final Integer pageNumber = 0;
private static final Integer pageSize = 10;
Pageable pageable = new PageRequest(pageNumber, pageSize);
// ES 操作类
@Autowired
CityRepository cityRepository;
public Long saveCity(City city) {
City cityResult = cityRepository.save(city);
return cityResult.getId();
}
public List<City> findByDescriptionAndScore(String description, Integer score) {
return cityRepository.findByDescriptionAndScore(description, score);
}
public List<City> findByDescriptionOrScore(String description, Integer score) {
return cityRepository.findByDescriptionOrScore(description, score);
}
public List<City> findByDescription(String description) {
return cityRepository.findByDescription(description, pageable).getContent();
}
public List<City> findByDescriptionNot(String description) {
return cityRepository.findByDescriptionNot(description, pageable).getContent();
}
public List<City> findByDescriptionLike(String description) {
return cityRepository.findByDescriptionLike(description, pageable).getContent();
}
}




城市 Controller 实现 Restful HTTP 服务
CityRestController.java/**
* 城市 Controller 实现 Restful HTTP 服务
* <p>
* Created by bysocket on 03/05/2017.
*/
@RestController
public class CityRestController {
@Autowired
private CityService cityService;
/**
* 插入 ES 新城市
*
* @param city
* @return
*/
@RequestMapping(value = "/api/city", method = RequestMethod.POST)
public Long createCity(@RequestBody City city) {
return cityService.saveCity(city);
}
/**
* AND 语句查询
*
* @param description
* @param score
* @return
*/
@RequestMapping(value = "/api/city/and/find", method = RequestMethod.GET)
public List<City> findByDescriptionAndScore(@RequestParam(value = "description") String description,
@RequestParam(value = "score") Integer score) {
return cityService.findByDescriptionAndScore(description, score);
}
/**
* OR 语句查询
*
* @param description
* @param score
* @return
*/
@RequestMapping(value = "/api/city/or/find", method = RequestMethod.GET)
public List<City> findByDescriptionOrScore(@RequestParam(value = "description") String description,
@RequestParam(value = "score") Integer score) {
return cityService.findByDescriptionOrScore(description, score);
}
/**
* 查询城市描述
*
* @param description
* @return
*/
@RequestMapping(value = "/api/city/description/find", method = RequestMethod.GET)
public List<City> findByDescription(@RequestParam(value = "description") String description) {
return cityService.findByDescription(description);
}
/**
* NOT 语句查询
*
* @param description
* @return
*/
@RequestMapping(value = "/api/city/description/not/find", method = RequestMethod.GET)
public List<City> findByDescriptionNot(@RequestParam(value = "description") String description) {
return cityService.findByDescriptionNot(description);
}
/**
* LIKE 语句查询
*
* @param description
* @return
*/
@RequestMapping(value = "/api/city/like/find", method = RequestMethod.GET)
public List<City> findByDescriptionLike(@RequestParam(value = "description") String description) {
return cityService.findByDescriptionLike(description);
}
}


5.编译工程
mvn clean install

6.运行工程
右键运行 Application 应用启动类的 main 函数,这样就成功启动了 springboot-elasticsearch 案例。

用 Postman 工具新增两个城市
a. 新增城市信息
POST http://127.0.0.1:8080/api/city
{
    "id":"1",
    "score":"5",
    "name":"上海",
    "description":"上海是个热城市"
}
POST http://127.0.0.1:8080/api/city
{
    "id":"2",
    "score":"4",
    "name":"温岭",
    "description":"温岭是个沿海城市"
}

可以打开 ES 可视化工具 head 插件:http://localhost:9200/_plugin/head/。
 
下面是基本查询语句的接口:
a. 普通查询,查询城市描述
GET http://localhost:8080/api/city ... on%3D温岭
b. AND 语句查询
GET http://localhost:8080/api/city ... on%3D温岭&score=4
如果换成 score=5 ,就没有结果了。
c. OR 语句查询
GET http://localhost:8080/api/city ... on%3D上海&score=4
d. NOT 语句查询
GET http://localhost:8080/api/city ... on%3D温州
e. LIKE 语句查询
GET http://localhost:8080/api/city ... on%3D城市

三、视频小结
下一视频《spring-data-elasticsearch 实战案例搭建》,会带来实战项目中涉及到的权重分 & 短语精准匹配的讲解。
  查看全部
spring-data-es 视频公开课(二)《spring-data-elasticsearch 简单案例搭建》
视频如下:








一、前言
a. 版权声明 
本视频由 泥瓦匠BYSocket 支持 Spring For All 社区 www.spring4all.com ,版权为个人及社区所有,欢迎转发。
b. 视频主旨
  • 学会 ElasticSearch 及 spring-data-elasticsearch
  • 项目实战教学


视频系列目录


二、正文

本节提纲
一、spring-data-elasticsearch-crud 的工程介绍
二、搭建 spring-data-elasticsearch-crud 工程

一、spring-data-elasticsearch-crud 的工程介绍
spring-data-elasticsearch-crud 的工程,介绍 Spring Data Elasticsearch 简单的 ES 操作。Spring Data Elasticsearch 可以跟 JPA 进行类比。其使用方法也很简单。

二、运行 spring-data-elasticsearch-crud 工程
1.后台起守护线程启动 Elasticsearch
cd elasticsearch-2.3.2/
./bin/elasticsearch -d

2.添加 maven 依赖
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/ma ... gt%3B
<modelVersion>4.0.0</modelVersion>
<groupId>springboot</groupId>
<artifactId>spring-data-elasticsearch-crud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-data-elasticsearch-crud :: spring-data-elasticsearch - 基本案例 </name>
<!-- Spring Boot 启动父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
</parent>
<dependencies>
<!-- Spring Boot Elasticsearch 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- Spring Boot Web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>



这里依赖的 spring-boot-starter-data-elasticsearch 版本是 1.5.1.RELEASE,对应的 spring-data-elasticsearch 版本是 2.1.0.RELEASE。对应官方文档:http://docs.spring.io/spring-d ... html/。后面数据操作层都是通过该 spring-data-elasticsearch 提供的接口实现。

3.新建启动 Application 类
Application.java:
// Spring Boot 应用的标识
@SpringBootApplication
public class Application {
public static void main(String args) {
// 程序启动入口
// 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
SpringApplication.run(Application.class,args);
}
}


4.编写 ES 代码(重点)
application.properties
 配置 ES 地址
# ES
spring.data.elasticsearch.repositories.enabled = true
spring.data.elasticsearch.cluster-nodes = 127.0.0.1:9300

默认 9300 是 Java 客户端的端口。9200 是支持 Restful HTTP 的接口。
更多配置:
 spring.data.elasticsearch.cluster-name Elasticsearch    集群名。(默认值: elasticsearch)
 spring.data.elasticsearch.cluster-nodes    集群节点地址列表,用逗号分隔。如果没有指定,就启动一个客户端节点。
 spring.data.elasticsearch.propertie     用来配置客户端的额外属性。
 spring.data.elasticsearch.repositories.enabled     开启 Elasticsearch 仓库。(默认值:true。)


ES domain 实体类
City.java
/**
* 城市实体类
* <p>
* Created by bysocket on 03/05/2017.
*/
@Document(indexName = "province", type = "city")
public class City implements Serializable {
private static final long serialVersionUID = -1L;
/**
* 城市编号
*/
private Long id;
/**
* 城市名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 城市评分
*/
private Integer score;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
}



注意
a. City 属性名不支持驼峰式。
b. indexName 配置必须是全部小写,不然会出异常。
org.elasticsearch.indices.InvalidIndexNameException: Invalid index name [provinceIndex], must be lowercase
 

ES 数据操作层
CityRepository.java
/**
* ES 操作类
* <p>
* Created by bysocket on 17/05/2017.
*/
public interface CityRepository extends ElasticsearchRepository<City, Long> {
/**
* AND 语句查询
*
* @param description
* @param score
* @return
*/
List<City> findByDescriptionAndScore(String description, Integer score);
/**
* OR 语句查询
*
* @param description
* @param score
* @return
*/
List<City> findByDescriptionOrScore(String description, Integer score);
/**
* 查询城市描述
*
* 等同于下面代码
* @Query("{\"bool\" : {\"must\" : {\"term\" : {\"description\" : \"?0\"}}}}")
* Page<City> findByDescription(String description, Pageable pageable);
*
* @param description
* @param page
* @return
*/
Page<City> findByDescription(String description, Pageable page);
/**
* NOT 语句查询
*
* @param description
* @param page
* @return
*/
Page<City> findByDescriptionNot(String description, Pageable page);
/**
* LIKE 语句查询
*
* @param description
* @param page
* @return
*/
Page<City> findByDescriptionLike(String description, Pageable page);
}

接口只要继承 ElasticsearchRepository 类即可。默认会提供很多实现,比如 CRUD 和搜索相关的实现。类似于 JPA 读取数据,是使用 CrudRepository 进行操作 ES 数据。支持的默认方法有: count(), findAll(), findOne(ID), delete(ID), deleteAll(), exists(ID), save(DomainObject), save(Iterable<DomainObject>)。

另外可以看出,接口的命名是遵循规范的。常用命名规则如下:
关键字     方法命名
And          findByNameAndPwd
Or             findByNameOrSex
Is              findById
Between   findByIdBetween
Like           findByNameLike
NotLike     findByNameNotLike
OrderBy    findByIdOrderByXDesc
Not           findByNameNot


城市 ES 业务接口类
CityService.java
/**
* 城市 ES 业务接口类
*
*/
public interface CityService {
/**
* 新增 ES 城市信息
*
* @param city
* @return
*/
Long saveCity(City city);
/**
* AND 语句查询
*
* @param description
* @param score
* @return
*/
List<City> findByDescriptionAndScore(String description, Integer score);
/**
* OR 语句查询
*
* @param description
* @param score
* @return
*/
List<City> findByDescriptionOrScore(String description, Integer score);
/**
* 查询城市描述
*
* @param description
* @return
*/
List<City> findByDescription(String description);
/**
* NOT 语句查询
*
* @param description
* @return
*/
List<City> findByDescriptionNot(String description);
/**
* LIKE 语句查询
*
* @param description
* @return
*/
List<City> findByDescriptionLike(String description);
}





城市 ES 业务逻辑实现类
CityESServiceImpl.java
/**
* 城市 ES 业务逻辑实现类
* <p>
* Created by bysocket on 07/02/2017.
*/
@Service
public class CityESServiceImpl implements CityService {
private static final Logger LOGGER = LoggerFactory.getLogger(CityESServiceImpl.class);
// 分页参数 -> TODO 代码可迁移到具体项目的公共 common 模块
private static final Integer pageNumber = 0;
private static final Integer pageSize = 10;
Pageable pageable = new PageRequest(pageNumber, pageSize);
// ES 操作类
@Autowired
CityRepository cityRepository;
public Long saveCity(City city) {
City cityResult = cityRepository.save(city);
return cityResult.getId();
}
public List<City> findByDescriptionAndScore(String description, Integer score) {
return cityRepository.findByDescriptionAndScore(description, score);
}
public List<City> findByDescriptionOrScore(String description, Integer score) {
return cityRepository.findByDescriptionOrScore(description, score);
}
public List<City> findByDescription(String description) {
return cityRepository.findByDescription(description, pageable).getContent();
}
public List<City> findByDescriptionNot(String description) {
return cityRepository.findByDescriptionNot(description, pageable).getContent();
}
public List<City> findByDescriptionLike(String description) {
return cityRepository.findByDescriptionLike(description, pageable).getContent();
}
}





城市 Controller 实现 Restful HTTP 服务
CityRestController.java
/**
* 城市 Controller 实现 Restful HTTP 服务
* <p>
* Created by bysocket on 03/05/2017.
*/
@RestController
public class CityRestController {
@Autowired
private CityService cityService;
/**
* 插入 ES 新城市
*
* @param city
* @return
*/
@RequestMapping(value = "/api/city", method = RequestMethod.POST)
public Long createCity(@RequestBody City city) {
return cityService.saveCity(city);
}
/**
* AND 语句查询
*
* @param description
* @param score
* @return
*/
@RequestMapping(value = "/api/city/and/find", method = RequestMethod.GET)
public List<City> findByDescriptionAndScore(@RequestParam(value = "description") String description,
@RequestParam(value = "score") Integer score) {
return cityService.findByDescriptionAndScore(description, score);
}
/**
* OR 语句查询
*
* @param description
* @param score
* @return
*/
@RequestMapping(value = "/api/city/or/find", method = RequestMethod.GET)
public List<City> findByDescriptionOrScore(@RequestParam(value = "description") String description,
@RequestParam(value = "score") Integer score) {
return cityService.findByDescriptionOrScore(description, score);
}
/**
* 查询城市描述
*
* @param description
* @return
*/
@RequestMapping(value = "/api/city/description/find", method = RequestMethod.GET)
public List<City> findByDescription(@RequestParam(value = "description") String description) {
return cityService.findByDescription(description);
}
/**
* NOT 语句查询
*
* @param description
* @return
*/
@RequestMapping(value = "/api/city/description/not/find", method = RequestMethod.GET)
public List<City> findByDescriptionNot(@RequestParam(value = "description") String description) {
return cityService.findByDescriptionNot(description);
}
/**
* LIKE 语句查询
*
* @param description
* @return
*/
@RequestMapping(value = "/api/city/like/find", method = RequestMethod.GET)
public List<City> findByDescriptionLike(@RequestParam(value = "description") String description) {
return cityService.findByDescriptionLike(description);
}
}



5.编译工程
mvn clean install

6.运行工程
右键运行 Application 应用启动类的 main 函数,这样就成功启动了 springboot-elasticsearch 案例。

用 Postman 工具新增两个城市
a. 新增城市信息
POST http://127.0.0.1:8080/api/city
{
    "id":"1",
    "score":"5",
    "name":"上海",
    "description":"上海是个热城市"
}
POST http://127.0.0.1:8080/api/city
{
    "id":"2",
    "score":"4",
    "name":"温岭",
    "description":"温岭是个沿海城市"
}

可以打开 ES 可视化工具 head 插件:http://localhost:9200/_plugin/head/
 
下面是基本查询语句的接口:
a. 普通查询,查询城市描述
GET http://localhost:8080/api/city ... on%3D温岭
b. AND 语句查询
GET http://localhost:8080/api/city ... on%3D温岭&score=4
如果换成 score=5 ,就没有结果了。
c. OR 语句查询
GET http://localhost:8080/api/city ... on%3D上海&score=4
d. NOT 语句查询
GET http://localhost:8080/api/city ... on%3D温州
e. LIKE 语句查询
GET http://localhost:8080/api/city ... on%3D城市

三、视频小结
下一视频《spring-data-elasticsearch 实战案例搭建》,会带来实战项目中涉及到的权重分 & 短语精准匹配的讲解。
 

spring-data-es 视频公开课(一)《elasticsearch 及 head 插件安装使用》

开源项目泥瓦匠BYSocket 发表了文章 • 1 个评论 • 1613 次浏览 • 2017-06-26 23:05 • 来自相关话题

spring-data-es 视频公开课(一)《elasticsearch 及 head 插件安装使用》 
视频如下:



 

一、前言
a. 版权声明 
本视频由 泥瓦匠BYSocket 支持 Spring For All 社区 www.spring4all.com ,版权为个人及社区所有,欢迎转发。

b. 视频主旨
学会 ElasticSearch 及 spring-data-elasticsearch项目实战教学

视频系列目录
spring-data-es 视频公开课(一)《elasticsearch 及 head 插件安装使用》spring-data-es 视频公开课(二)《spring-data-elasticsearch 简单案例搭建》spring-data-es 视频公开课(三)《spring-data-elasticsearch 实战案例搭建》

二、正文
本节提纲
一、Elasticsearch 安装
二、可视化插件 elasticsearch-head 安装
三、小结

运行环境
Mac OS 10.12.x
Elasticsearch 2.3.2

一、Elasticsearch 安装
什么是 Elasticsearch ?
Elasticsearch 是一个基于 Apache Lucene(TM) 的开源搜索引擎。无论在开源还是专有领域,Lucene 可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。并通过简单的 HTTP RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
Elasticsearch 不仅仅是 Lucene 和全文搜索,我们还能这样去描述它:
分布式的实时文件存储,每个字段都被索引并可被搜索分布式的实时分析搜索引擎可以扩展到上百台服务器,处理PB级结构化或非结构化数据


下面开始具体安装步骤:
1. .tar.gz 安装包安装 Elasticsearch 2.3.2
首先打开官网下载页 https://www.elastic.co/downloads/elasticsearch ,下载对应的 elasticsearch-2.3.2.tar.gz 文件,本文下载到 /java/es 目录。然后在文件的当前目录,通过 tar 命令解压安装包完成安装。tar -xzf elasticsearch-2.3.2.tar.gz
cd elasticsearch-2.3.2
2. 运行
一般在后台起守护线程启动 Elasticsearch,在命令行加入 -d 指定。自然,也可以加入 -p ,可将进程 ID 记录到文件中。./bin/elasticsearch -d








访问 http://localhost:9200/ ,可以看到成功运行的案例,返回的 JSON 页面。如图:
要关闭 Elasticsearch 进程,需要通过 ps 找到对应的 pid,在 kill pid 即可。ps aux |grep elasticsearch
kill -7 pid

二、可视化插件 elasticsearch-head 安装
官方 GitHub 地址:https://github.com/mobz/elasticsearch-head。
安装也很简单,安装 README 步骤走就好了:sudo ./bin/plugin install mobz/elasticsearch-head

访问 http://localhost:9200/_plugin/head/ ,右上角表示连接上了上小节启动的 Elasticsearch。
 

三、小结
本文写的比较基础,记录下主要两个点:
A、为啥不用高版本 ES?
- 版本问题,目前spring-data-elasticsearch 最高版本还只是 snapshot 版。所以 spring boot 的 starter 不敢用。详细点击 spring-data-elasticsearch Github 地址:
https://github.com/spring-proj ... earch
- 业界还是比较流行 2.3.2 和 最高版本 两种

B、为啥项目中不用 HTTP 去调用?
- 其实是可以的,HTTP 比较轻量级
- 本系列主要实践中总结 spring-data-elasticsearch ,spring-data-elasticsearch 提供对 ES 数据的访问



  查看全部
spring-data-es 视频公开课(一)《elasticsearch 及 head 插件安装使用》 
视频如下:




 

一、前言
a. 版权声明 
本视频由 泥瓦匠BYSocket 支持 Spring For All 社区 www.spring4all.com ,版权为个人及社区所有,欢迎转发。

b. 视频主旨
  • 学会 ElasticSearch 及 spring-data-elasticsearch
  • 项目实战教学


视频系列目录


二、正文
本节提纲
一、Elasticsearch 安装
二、可视化插件 elasticsearch-head 安装
三、小结

运行环境
Mac OS 10.12.x
Elasticsearch 2.3.2

一、Elasticsearch 安装
什么是 Elasticsearch ?
Elasticsearch 是一个基于 Apache Lucene(TM) 的开源搜索引擎。无论在开源还是专有领域,Lucene 可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。并通过简单的 HTTP RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
Elasticsearch 不仅仅是 Lucene 和全文搜索,我们还能这样去描述它:
  • 分布式的实时文件存储,每个字段都被索引并可被搜索
  • 分布式的实时分析搜索引擎
  • 可以扩展到上百台服务器,处理PB级结构化或非结构化数据



下面开始具体安装步骤:
1. .tar.gz 安装包安装 Elasticsearch 2.3.2
首先打开官网下载页 https://www.elastic.co/downloads/elasticsearch ,下载对应的 elasticsearch-2.3.2.tar.gz 文件,本文下载到 /java/es 目录。然后在文件的当前目录,通过 tar 命令解压安装包完成安装。
tar -xzf elasticsearch-2.3.2.tar.gz
cd elasticsearch-2.3.2

2. 运行
一般在后台起守护线程启动 Elasticsearch,在命令行加入 -d 指定。自然,也可以加入 -p ,可将进程 ID 记录到文件中。
./bin/elasticsearch -d








访问 http://localhost:9200/ ,可以看到成功运行的案例,返回的 JSON 页面。如图:
要关闭 Elasticsearch 进程,需要通过 ps 找到对应的 pid,在 kill pid 即可。
ps aux |grep elasticsearch
kill -7 pid


二、可视化插件 elasticsearch-head 安装
官方 GitHub 地址:https://github.com/mobz/elasticsearch-head
安装也很简单,安装 README 步骤走就好了:
sudo ./bin/plugin install mobz/elasticsearch-head


访问 http://localhost:9200/_plugin/head/ ,右上角表示连接上了上小节启动的 Elasticsearch。
 

三、小结
本文写的比较基础,记录下主要两个点:
A、为啥不用高版本 ES?
- 版本问题,目前spring-data-elasticsearch 最高版本还只是 snapshot 版。所以 spring boot 的 starter 不敢用。详细点击 spring-data-elasticsearch Github 地址:
https://github.com/spring-proj ... earch
- 业界还是比较流行 2.3.2 和 最高版本 两种

B、为啥项目中不用 HTTP 去调用?
- 其实是可以的,HTTP 比较轻量级
- 本系列主要实践中总结 spring-data-elasticsearch ,spring-data-elasticsearch 提供对 ES 数据的访问



 

深入浅出 spring-data-elasticsearch 系列 - 概述及入门(二)

Spring Data泥瓦匠BYSocket 发表了文章 • 0 个评论 • 1307 次浏览 • 2017-06-08 15:45 • 来自相关话题

本文目录
一、spring-data-elasticsearch 是什么?
1.1 Spring Data
1.2 Spring Data Elasticsearch
二、spring-data-elasticsearch 快速入门
2.1 pom.xml 依赖
2.2 ElasticsearchRepository
2.3 ElasticsearchTemplate
2.4 使用案例
三、spring-data-elasticsearch 和 elasticsearch 版本
四、小结
 

一、spring-data-elasticsearch 是什么?
1.1 Spring Data
要了解 spring-data-elasticsearch 是什么,首先了解什么是 Spring Data。
Spring Data 基于 Spring 为数据访问提供一种相似且一致性的编程模型,并保存底层数据存储的。

1.2 Spring Data Elasticsearch
spring-data-elasticsearch 是 Spring Data 的 Community modules 之一,是 Spring Data 对 Elasticsearch 引擎的实现。
Elasticsearch 默认提供轻量级的 HTTP Restful 接口形式的访问。相对来说,使用 HTTP Client 调用也很简单。但 spring-data-elasticsearch 可以更快的支持构建在 Spring 应用上,比如在 application.properties 配置 ES 节点信息和 spring-boot-starter-data-elasticsearch 依赖,直接在 Spring Boot 应用上使用。

二、spring-data-elasticsearch 快速入门
2.1 pom.xml 依赖<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>x.y.z.RELEASE</version>
</dependency>
2.2 ElasticsearchRepository
ES 通用的存储接口的一种默认实现。Spring 根据接口定义的方法名,具体执行对应的数据存储实现。
ElasticsearchRepository 继承 ElasticsearchCrudRepository ,ElasticsearchCrudRepository 继承 PagingAndSortingRepository。所以一般 CRUD 带分页已经支持。如图:
 






2.3 ElasticsearchTemplate
ES 数据操作的中心支持类。和 JdbcTemplate 一样,几乎所有操作都可以使用 ElasticsearchTemplate 来完成。
ElasticsearchTemplate 实现了 ElasticsearchOperations 和 ApplicationContextAware 接口。ElasticsearchOperations 接口提供了 ES 相关的操作,并将 ElasticsearchTemplate 加入到 Spring 上下文。如图:
 





 
2.4 使用案例
拿官方案例来吧,详细介绍了 Book ES 对象的接口实现。
可以看出,book 拥有 name 和 price 两个属性。下面支持  name 和 price 列表 ES 查询,分页查询,范围查询等。还有可以利用注解实现 DSL 操作。 public interface BookRepository extends Repository<Book, String> {
List<Book> findByNameAndPrice(String name, Integer price);
List<Book> findByNameOrPrice(String name, Integer price);
Page<Book> findByName(String name,Pageable page);
Page<Book> findByNameNot(String name,Pageable page);
Page<Book> findByPriceBetween(int price,Pageable page);
Page<Book> findByNameLike(String name,Pageable page);
@Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}")
Page<Book> findByMessage(String message, Pageable pageable);
}

三、spring-data-elasticsearch 和 elasticsearch 版本
SpringBoot 1.5+ 目前仅支持 ElasticSearch 2.3.2,所以如果想要使用最新的 ES。可以通过默认的轻量级的 HTTP 去调用实现。其版本对应如下:

spring data elasticsearch    elasticsearch
3.0.0.BUILD-SNAPSHOT    5.4.0
2.0.4.RELEASE                    2.4.0
2.0.0.RELEASE                    2.2.0
1.4.0.M1                               1.7.3
1.3.0.RELEASE                    1.5.2
1.2.0.RELEASE                    1.4.4
1.1.0.RELEASE                    1.3.2
1.0.0.RELEASE                    1.1.1

四、小结
本小结介绍了 spring-data-elasticsearch 是概述以及它的入门,还有 spring-data-elasticsearch 核心接口及版本的情况。

资料:
项目地址
https://github.com/spring-proj ... earch
官方文档
http://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/ 

本文作者: 泥瓦匠
原文链接: http://www.bysocket.com
版权归作者所有,转载请注明出处 查看全部
本文目录
一、spring-data-elasticsearch 是什么?
1.1 Spring Data
1.2 Spring Data Elasticsearch
二、spring-data-elasticsearch 快速入门
2.1 pom.xml 依赖
2.2 ElasticsearchRepository
2.3 ElasticsearchTemplate
2.4 使用案例
三、spring-data-elasticsearch 和 elasticsearch 版本
四、小结
 

一、spring-data-elasticsearch 是什么?
1.1 Spring Data
要了解 spring-data-elasticsearch 是什么,首先了解什么是 Spring Data。
Spring Data 基于 Spring 为数据访问提供一种相似且一致性的编程模型,并保存底层数据存储的。

1.2 Spring Data Elasticsearch
spring-data-elasticsearch 是 Spring Data 的 Community modules 之一,是 Spring Data 对 Elasticsearch 引擎的实现。
Elasticsearch 默认提供轻量级的 HTTP Restful 接口形式的访问。相对来说,使用 HTTP Client 调用也很简单。但 spring-data-elasticsearch 可以更快的支持构建在 Spring 应用上,比如在 application.properties 配置 ES 节点信息和 spring-boot-starter-data-elasticsearch 依赖,直接在 Spring Boot 应用上使用。

二、spring-data-elasticsearch 快速入门
2.1 pom.xml 依赖
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>x.y.z.RELEASE</version>
</dependency>

2.2 ElasticsearchRepository
ES 通用的存储接口的一种默认实现。Spring 根据接口定义的方法名,具体执行对应的数据存储实现。
ElasticsearchRepository 继承 ElasticsearchCrudRepository ,ElasticsearchCrudRepository 继承 PagingAndSortingRepository。所以一般 CRUD 带分页已经支持。如图:
 
esr.png



2.3 ElasticsearchTemplate
ES 数据操作的中心支持类。和 JdbcTemplate 一样,几乎所有操作都可以使用 ElasticsearchTemplate 来完成。
ElasticsearchTemplate 实现了 ElasticsearchOperations 和 ApplicationContextAware 接口。ElasticsearchOperations 接口提供了 ES 相关的操作,并将 ElasticsearchTemplate 加入到 Spring 上下文。如图:
 
est.png


 
2.4 使用案例
拿官方案例来吧,详细介绍了 Book ES 对象的接口实现。
可以看出,book 拥有 name 和 price 两个属性。下面支持  name 和 price 列表 ES 查询,分页查询,范围查询等。还有可以利用注解实现 DSL 操作。
    public interface BookRepository extends Repository<Book, String> {
List<Book> findByNameAndPrice(String name, Integer price);
List<Book> findByNameOrPrice(String name, Integer price);
Page<Book> findByName(String name,Pageable page);
Page<Book> findByNameNot(String name,Pageable page);
Page<Book> findByPriceBetween(int price,Pageable page);
Page<Book> findByNameLike(String name,Pageable page);
@Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}")
Page<Book> findByMessage(String message, Pageable pageable);
}


三、spring-data-elasticsearch 和 elasticsearch 版本
SpringBoot 1.5+ 目前仅支持 ElasticSearch 2.3.2,所以如果想要使用最新的 ES。可以通过默认的轻量级的 HTTP 去调用实现。其版本对应如下:

spring data elasticsearch    elasticsearch
3.0.0.BUILD-SNAPSHOT    5.4.0
2.0.4.RELEASE                    2.4.0
2.0.0.RELEASE                    2.2.0
1.4.0.M1                               1.7.3
1.3.0.RELEASE                    1.5.2
1.2.0.RELEASE                    1.4.4
1.1.0.RELEASE                    1.3.2
1.0.0.RELEASE                    1.1.1

四、小结
本小结介绍了 spring-data-elasticsearch 是概述以及它的入门,还有 spring-data-elasticsearch 核心接口及版本的情况。

资料:
项目地址
https://github.com/spring-proj ... earch
官方文档
http://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/ 


本文作者: 泥瓦匠
原文链接: http://www.bysocket.com
版权归作者所有,转载请注明出处


深入浅出 spring-data-elasticsearch 之 ElasticSearch 架构初探(一)

Spring Data泥瓦匠BYSocket 发表了文章 • 2 个评论 • 2552 次浏览 • 2017-06-04 17:20 • 来自相关话题

本文目录
一、Elasticsearch 基本术语
1.1 文档(Document)、索引(Index)、类型(Type)文档三要素
1.2 集群(Cluster)、节点(Node)、分片(Shard)分布式三要素
二、Elasticsearch 工作原理
2.1 文档存储的路由
2.2 如何健康检查
2.3 如何水平扩容
三、小结

一、Elasticsearch 基本术语

1.1 文档(Document)、索引(Index)、类型(Type)文档三要素
文档(Document)
文档,在面向对象观念就是一个对象。在 ES 里面,是一个大 JSON 对象,是指定了唯一 ID 的最底层或者根对象。文档的位置由 _index、_type 和 _id 唯一标识。

索引(Index)
索引,用于区分文档成组,即分到一组的文档集合。索引,用于存储文档和使文档可被搜索。比如项目存索引 project 里面,交易存索引 sales 等。

类型(Type)
类型,用于区分索引中的文档,即在索引中对数据逻辑分区。比如索引 project 的项目数据,根据项目类型 ui 项目、插画项目等进行区分。

和关系型数据库 MySQL 做个类比:
Document 类似于 Record
Type 类似于 Table
Index 类似于 Database

1.2 集群(Cluster)、节点(Node)、分片(Shard)分布式三要素
集群(Cluster)
服务器集群大家都知道,这里 ES 也是类似的。多个 ElasticSearch 运行实例(节点)组合的组合体是 ElasticSearch 集群。
ElasticSearch 是天然的分布式,通过水平扩容为集群添加更多节点。
集群是去中心化的,有一个主节点(Master)。主节点是动态选举,因此不会出现单点故障。

那分片和节点的配置呢?
节点(Node)
一个 ElasticSearch 运行实例就是节点。顺着集群来,任何节点都可以被选举成为主节点。主节点负责集群内所以变更,比如索引的增加、删除等。所以集群不会因为主节点流量的增大成为瓶颈。因为任何节点都会成为主节点。
下面有 3 个节点,第 1 个节点有:2 个主分片和 1 个副分片。如图:





那么,只有一个节点的 ElasticSearch 服务会存在瓶颈。如图:





分片(Shard)
分片,是 ES 节点中最小的工作单元。分片仅仅保存全部数据的一部分,分片的集合是 ES 的索引。分片包括主分片和副分片,主分片是副分片的拷贝。主分片和副分片地工作基本没有大的区别。
在索引中全文搜索,然后会查询到每个分片,将每个分配的结果进行全局地收集处理,并返回。

二、Elasticsearch 工作原理

2.1 文档存储的路由
当索引到一个文档(如:报价系统),具体的文档数据(如:报价数据)会存储到一个分片。具体文档数据会被切分,并分别存储在分片 1 或者 分片 2 … 
那么如何确定存在哪个分片呢?
存储路由过程由下面地公式决定:shard = hash(routing) % number_of_primary_shards
routing 是可变值,支持自定义,默认文档 _id。
hash 函数生成数字,经过取余算法得到余数,那么这个余数就是分片的位置。
这是不是有点负载均衡的类似。
 
2.2 如何健康检查
集群名,集群的健康状态GET http://127.0.0.1:9200/_cluster/stats
{
"cluster_name": "elasticsearch",
"status": "green",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 0,
"active_shards": 0,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0
}
status 字段是需要我们关心的。状态可能是下列三个值之一:green
所有的主分片和副本分片都已分配。你的集群是 100% 可用的。
yellow
所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。高可用会弱化把 yellow 想象成一个需要及时调查的警告。
red
至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。


active_primary_shards 集群中的主分片数量
active_shards 所有分片的汇总值
relocating_shards 显示当前正在从一个节点迁往其他节点的分片的数量。通常来说应该是 0,不过在 Elasticsearch 发现集群不太均衡时,该值会上涨。比如说:添加了一个新节点,或者下线了一个节点。
initializing_shards 刚刚创建的分片的个数。
unassigned_shards 已经在集群状态中存在的分片。
 
2.3 如何水平扩容
主分片在索引创建已经确定。读操作可以同时被主分片和副分片处理。因此,更多的分片,会拥有更高的吞吐量。自然,需要增加更多的硬件资源支持吞吐量。
说明,这里无法提高性能,因为每个分片获得的资源会变少。
动态调整副本分片数,按需伸缩集群,比如把副本数默认值为 1 增加到 2:PUT /blogs/_settings
{
"number_of_replicas" : 2
}

三、小结
简单初探了下 ElasticSearch 的相关内容。后面会主要落地到实战,关于  spring-data-elasticsearch 这块的实战。

最后,《 深入浅出 spring-data-elasticsearch 》小连载目录如下:
深入浅出 spring-data-elasticsearch - ElasticSearch 架构初探(一)
深入浅出 spring-data-elasticsearch - 概述(二)
深入浅出 spring-data-elasticsearch - 基本案例详解(三)
深入浅出 spring-data-elasticsearch - 复杂案例详解(四)
深入浅出 spring-data-elasticsearch - 架构原理以及源码浅析(五)
 

资料:
官方《Elasticsearch: 权威指南》
https://www.elastic.co/guide/c ... .html
 

本文作者: 泥瓦匠
原文链接: http://www.bysocket.com
版权归作者所有,转载请注明出处 查看全部
本文目录
一、Elasticsearch 基本术语
1.1 文档(Document)、索引(Index)、类型(Type)文档三要素
1.2 集群(Cluster)、节点(Node)、分片(Shard)分布式三要素
二、Elasticsearch 工作原理
2.1 文档存储的路由
2.2 如何健康检查
2.3 如何水平扩容
三、小结

一、Elasticsearch 基本术语

1.1 文档(Document)、索引(Index)、类型(Type)文档三要素
文档(Document)
文档,在面向对象观念就是一个对象。在 ES 里面,是一个大 JSON 对象,是指定了唯一 ID 的最底层或者根对象。文档的位置由 _index、_type 和 _id 唯一标识。

索引(Index)
索引,用于区分文档成组,即分到一组的文档集合。索引,用于存储文档和使文档可被搜索。比如项目存索引 project 里面,交易存索引 sales 等。

类型(Type)
类型,用于区分索引中的文档,即在索引中对数据逻辑分区。比如索引 project 的项目数据,根据项目类型 ui 项目、插画项目等进行区分。

和关系型数据库 MySQL 做个类比
Document 类似于 Record
Type 类似于 Table
Index 类似于 Database

1.2 集群(Cluster)、节点(Node)、分片(Shard)分布式三要素
集群(Cluster)
服务器集群大家都知道,这里 ES 也是类似的。多个 ElasticSearch 运行实例(节点)组合的组合体是 ElasticSearch 集群。
ElasticSearch 是天然的分布式,通过水平扩容为集群添加更多节点。
集群是去中心化的,有一个主节点(Master)。主节点是动态选举,因此不会出现单点故障。

那分片和节点的配置呢?
节点(Node
一个 ElasticSearch 运行实例就是节点。顺着集群来,任何节点都可以被选举成为主节点。主节点负责集群内所以变更,比如索引的增加、删除等。所以集群不会因为主节点流量的增大成为瓶颈。因为任何节点都会成为主节点。
下面有 3 个节点,第 1 个节点有:2 个主分片和 1 个副分片。如图:
elas_node.png


那么,只有一个节点的 ElasticSearch 服务会存在瓶颈。如图:
elas_0201.png


分片(Shard)
分片,是 ES 节点中最小的工作单元。分片仅仅保存全部数据的一部分,分片的集合是 ES 的索引。分片包括主分片和副分片,主分片是副分片的拷贝。主分片和副分片地工作基本没有大的区别。
在索引中全文搜索,然后会查询到每个分片,将每个分配的结果进行全局地收集处理,并返回。

二、Elasticsearch 工作原理

2.1 文档存储的路由
当索引到一个文档(如:报价系统),具体的文档数据(如:报价数据)会存储到一个分片。具体文档数据会被切分,并分别存储在分片 1 或者 分片 2 … 
那么如何确定存在哪个分片呢?
存储路由过程由下面地公式决定:
shard = hash(routing) % number_of_primary_shards

routing 是可变值,支持自定义,默认文档 _id。
hash 函数生成数字,经过取余算法得到余数,那么这个余数就是分片的位置。
这是不是有点负载均衡的类似。
 
2.2 如何健康检查
集群名,集群的健康状态
GET http://127.0.0.1:9200/_cluster/stats 
{
"cluster_name": "elasticsearch",
"status": "green",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 0,
"active_shards": 0,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0
}

status 字段是需要我们关心的。状态可能是下列三个值之一:
green
所有的主分片和副本分片都已分配。你的集群是 100% 可用的。
yellow
所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。高可用会弱化把 yellow 想象成一个需要及时调查的警告。
red
至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。


active_primary_shards 集群中的主分片数量
active_shards 所有分片的汇总值
relocating_shards 显示当前正在从一个节点迁往其他节点的分片的数量。通常来说应该是 0,不过在 Elasticsearch 发现集群不太均衡时,该值会上涨。比如说:添加了一个新节点,或者下线了一个节点。
initializing_shards 刚刚创建的分片的个数。
unassigned_shards 已经在集群状态中存在的分片。
 
2.3 如何水平扩容
主分片在索引创建已经确定。读操作可以同时被主分片和副分片处理。因此,更多的分片,会拥有更高的吞吐量。自然,需要增加更多的硬件资源支持吞吐量。
说明,这里无法提高性能,因为每个分片获得的资源会变少。
动态调整副本分片数,按需伸缩集群,比如把副本数默认值为 1 增加到 2:
PUT /blogs/_settings
{
"number_of_replicas" : 2
}


三、小结
简单初探了下 ElasticSearch 的相关内容。后面会主要落地到实战,关于  spring-data-elasticsearch 这块的实战。

最后,《 深入浅出 spring-data-elasticsearch 》小连载目录如下:
深入浅出 spring-data-elasticsearch - ElasticSearch 架构初探(一)
深入浅出 spring-data-elasticsearch - 概述(二)
深入浅出 spring-data-elasticsearch - 基本案例详解(三)
深入浅出 spring-data-elasticsearch - 复杂案例详解(四)
深入浅出 spring-data-elasticsearch - 架构原理以及源码浅析(五)
 

资料:
官方《Elasticsearch: 权威指南》
https://www.elastic.co/guide/c ... .html
 


本文作者: 泥瓦匠
原文链接: http://www.bysocket.com
版权归作者所有,转载请注明出处