1.基本概念
索引(Index)
索引是具有某种相似特征的文档的集合。例如,客户数据索引,产品目录索引,以及订单数据索引。索引由名称(必须全部为小写)标识,此名称用于在对文档进行索引、搜索、更新和删除操作时使用。在单个集群中,您可以根据需要定义任意数量的索引。
类型(Type)
一个索引可以定义一个或多个类型。类型是索引的逻辑类别/分区,你怎么理解都行。通常,为具有一组公共字段的文档定义一种类型。例如,一个博客平台,假如将所有数据存储在单个索引中。在此索引中,可以定义用户数据类型,博客数据类型以及评论数据类型。
文档(document)
文档是可以被索引的基本单位。例如,用一个文档保存某个客户的数据,或者保存单个产品的数据,或者保存单个订单的数据。文档使用JSON表示。在索引/类型中可以存储大量文档。值得注意的是,尽管文档本质上是存放在索引中,但实际上是被索引/分配到索引中的一个类型中。
分片和副本(shards & replicas)
一个索引可能存储海量数据,有可能超过单个节点的硬盘容量。例如,某个索引存储了10亿个文档,占用1TB的硬盘空间,单个节点的硬盘有可能不足以存储那么大的数据量,就算可以存储下,但是可能会降低服务器处理搜索请求的速度。
为了解决这个问题, elasticsearch 提供了分片功能,即将索引细分。创建索引时,可以简单地定义所需的分片数。每个分片本身就具备索引的全部功能,可以存放在集群中的任何一个节点。
在网络/云环境中,任何时候都可能发生故障,分片会非常有用,并强烈建议使用故障转移机制,以防止分片/节点脱机或消失。为此, elasticsearch 允许您将索引的分片复制一份或多份,也就是所谓的复制分片,或简写为副本。
2.Index操作
官方文档中已经给出了我们需要调用的方法 接下来就是在业务中实现的代码 代码的话博主会从controller到接口到实现类一一展示出来
/**
* 创建索引
*
* @param index 索引
* @param shardsNum 主分片数
* @param replicasNum 副本分片数
* @return net.conn.es.elasticsearch.utils.ResultInfo
* @creator Conn
* @date 2018/10/19
*/
@PutMapping("/createIndexSettings")
public ResultInfo createIndexSettings(@RequestParam(name = "index") String index,
@RequestParam(name = "shardsNum", defaultValue = "5") Integer shardsNum,
@RequestParam(name = "replicasNum", defaultValue = "1") Integer replicasNum) {
ResponseEntity result = null;
try {
result = iElasticSearchService.createIndexSettings(index, shardsNum, replicasNum);
return ResultInfo.success().build(result);
} catch (CustomException e) {
e.printStackTrace();
return ResultInfo.failure(e.getMessage());
}
}
/**
* 创建索引
*
* @param index 索引
* @param shardsNum 主分片数
* @param replicasNum 副本分片数
* @return org.springframework.http.ResponseEntity
* @throws CustomException
* @creator Conn
* @date 2018/10/19
*/
ResponseEntity createIndexSettings(String index, Integer shardsNum, Integer replicasNum) throws CustomException;
/**
* 创建索引
*
* @param index 索引
* @param shardsNum 主分片数
* @param replicasNum 副本分片数
* @return org.springframework.http.ResponseEntity
* @throws CustomException
* @creator Conn
* @date 2018/10/19
*/
@Override
public ResponseEntity createIndexSettings(String index, Integer shardsNum, Integer replicasNum) throws CustomException {
if (index == null) {
throw new CustomException("索引不能为空");
}
try {
//分片数及副本数
Settings.Builder sb = Settings.builder()
.put("index.number_of_shards", shardsNum)
.put("index.number_of_replicas", replicasNum);
//创建索引
CreateIndexResponse response = client.admin().indices()
.prepareCreate(index)
.setSettings(sb)
.get();
return new ResponseEntity(response.isAcknowledged(), HttpStatus.OK);
} catch (Exception e) {
e.printStackTrace();
throw new CustomException("创建索引业务层异常");
}
}
至于异常的话 博主自定义了一个输出异常信息的工具类 也贴出来吧
/**
* @Author Conn
* @Date 2018/9/29
*/
public class CustomException extends Exception {
public CustomException() {
super();
}
public CustomException(String msg) {
super(msg);
}
}
/**
* 修改索引
*
* @param index 索引
* @param replicasNum 副本分片数
* @return net.conn.es.elasticsearch.utils.ResultInfo
* @creator Conn
* @date 2018/10/19
*/
@PutMapping("/updateIndexSettings")
public ResultInfo updateIndexSettings(@RequestParam(name = "index") String index,
@RequestParam(name = "replicasNum", defaultValue = "") Integer replicasNum) {
ResponseEntity result = null;
try {
result = iElasticSearchService.updateIndexSettings(index, replicasNum);
return ResultInfo.success().build(result);
} catch (CustomException e) {
e.printStackTrace();
return ResultInfo.failure(e.getMessage());
}
}
/**
* 修改索引
*
* @param index 索引
* @param replicasNum 副本分片数
* @return org.springframework.http.ResponseEntity
* @throws CustomException
* @creator Conn
* @date 2018/10/19
*/
ResponseEntity updateIndexSettings(String index, Integer replicasNum) throws CustomException;
/**
* 修改索引
*
* @param index 索引
* @param replicasNum 副本分片数
* @return org.springframework.http.ResponseEntity
* @throws CustomException
* @creator Conn
* @date 2018/10/19
*/
@Override
public ResponseEntity updateIndexSettings(String index, Integer replicasNum) throws CustomException {
if (index == null) {
throw new CustomException("索引不能为空");
}
if (replicasNum == null) {
throw new CustomException("副本数不能为空");
}
try {
//创建条件
Settings.Builder sb = Settings.builder();
//如果需要更改副本数 则加进条件 注:索引分片数在索引创建好了之后就不能调整了,只能重建索引
sb.put("index.number_of_replicas", replicasNum);
UpdateSettingsResponse response = client.admin().indices()
.prepareUpdateSettings(index)
.setSettings(sb)
.get();
return new ResponseEntity(response.isAcknowledged(), HttpStatus.OK);
} catch (Exception e) {
e.printStackTrace();
throw new CustomException("修改索引业务层异常");
}
}
这里要提一嘴的就是 当索引分片数在索引创建完成后就不能调整了 只能通过重建索引实现调整
删除索引的话在5.6的文档里没有具体的展示 但是我们根据常用的方法也能猜出来是prepareDelete这个方法
/**
* 删除索引
*
* @param index 索引
* @return net.conn.es.elasticsearch.utils.ResultInfo
* @creator Conn
* @date 2018/10/19
*/
@DeleteMapping("/deleteIndex")
public ResultInfo deleteIndex(@RequestParam(name = "index") String index) {
try {
ResponseEntity result = iElasticSearchService.deleteIndex(index);
return ResultInfo.success().build(result);
} catch (CustomException e) {
e.printStackTrace();
return ResultInfo.failure(e.getMessage());
}
}
/**
* 删除索引
*
* @param index 索引
* @return org.springframework.http.ResponseEntity
* @throws CustomException
* @creator Conn
* @date 2018/10/19
*/
ResponseEntity deleteIndex(String index) throws CustomException;
/**
* 删除索引
*
* @param index 索引
* @return org.springframework.http.ResponseEntity
* @throws CustomException
* @creator Conn
* @date 2018/10/19
*/
@Override
public ResponseEntity deleteIndex(String index) throws CustomException {
try {
DeleteIndexResponse response = client.admin().indices()
.prepareDelete(index)
.get();
return new ResponseEntity(response.isAcknowledged(), HttpStatus.OK);
} catch (Exception e) {
e.printStackTrace();
throw new CustomException("删除索引业务层异常");
}
}
/**
* 获得索引配置信息
*
* @param index 索引
* @param type 类型
* @return net.conn.es.elasticsearch.utils.ResultInfo
* @creator Conn
* @date 2018/10/24
*/
@GetMapping("/getIndexSettings")
public ResultInfo getIndexSettings(@RequestParam(name = "index", defaultValue = "resource") String index,
@RequestParam(name = "type", defaultValue = "resource") String type) {
try {
ResponseEntity result = iElasticSearchService.getIndexSettings(index, type);
return ResultInfo.success().build(result);
} catch (CustomException e) {
e.printStackTrace();
return ResultInfo.failure(e.getMessage());
}
}
/**
* 获得索引配置信息
*
* @param index 索引
* @param type 类型
* @return org.springframework.http.ResponseEntity
* @throws CustomException
* @creator Conn
* @date 2018/10/24
*/
ResponseEntity getIndexSettings(String index, String type) throws CustomException;
/**
* 获得索引配置信息
*
* @param index 索引
* @param type 类型
* @return org.springframework.http.ResponseEntity
* @throws CustomException
* @creator Conn
* @date 2018/10/24
*/
@Override
public ResponseEntity getIndexSettings(String index, String type) throws CustomException {
try {
GetSettingsResponse response = client.admin().indices()
.prepareGetSettings(index)
.get();
Map map = new HashMap<>();
for (ObjectObjectCursor cursor : response.getIndexToSettings()) {
String index2 = cursor.key;
Settings settings = cursor.value;
Integer shards = settings.getAsInt("index.number_of_shards", null);
Integer replicas = settings.getAsInt("index.number_of_replicas", null);
map.put("index", index2);
map.put("shards", shards);
map.put("replicas", replicas);
}
return new ResponseEntity(map, HttpStatus.OK);
} catch (Exception e) {
e.printStackTrace();
throw new CustomException("获得索引配置信息业务层异常");
}
}
3.测试操作
Postman Download
ElasticSearch启动 运行ES/bin目录下elasticsearch.bat
Head启动 运行cmd 跳转到head目录下 grunt server 回车 如下图所示
©喜欢我的文章就评论或点个赞吧 至少让我知道有帮助到你