博客打鱼党
最近手上的一个项目用到了ES相关的东西,研究了一下,简单敲了点可用的代码,在这里记录一下。
平台环境
ES和Kibana均采用的6.4.2的版本,Java API Client版本采用的和集群相同的版本
一些简单的说明
就目前来说,主要常用的操作ES方式有三种
- 最原始也是普适性最好的方式,通过ES的Rest接口进行访问,这种方式的缺点就是需要开发者自己从接口地址以及接口传参等方面来区分要具体进行的操作,对ESrest接口不熟悉的话,开发起来比较困难,但是优点就是普适性极强,并且支持全部ES可以实现的操作,最为灵活。
- 使用ES的API Client,这种方式就类似于JDBC,相对rest接口来说,要执行的操作更为明确,但是同样的,对API中方法不熟悉的话,一样开发起来会遇到各种问题。总的来说,优点是操作更加明确清晰,不用自己来区分一系列接口,统一使用client及其衍生相关对象操作即可,同样可以实现绝大部分的可行操作,较为灵活
- 集成的API接口,最常见的就是spring data相关的ES操作方法,优点是便于配置使用,自己无需管理client,并且封装了大量的方法,缺点是要实现提供方法之外的功能时,修改实现比较麻烦,另外在使用的时候接口对数据格式有一定的要求
在这里先简单记录一下第二种方式,通过API Client操作ES,这种方式相对于第一种要更加简单,对于第三种要更加灵活。
相关代码
创建索引结构Mapping
/**
* 创建新的ES索引\n
* 该方法的作用是根据传入的结构,创建索引结构(Mapping),不涉及插入数据
* @param indexName
* @param type
* @param fields
* @return
*/
public boolean createIndex(String indexName, String type, List<ElasticField> fields) throws IOException {
if (checkIndex(indexName)) {
LOG.warn(" index " + indexName + " already exsit");
return false;
}
CreateIndexRequestBuilder cib = client.admin().indices().prepareCreate(indexName);
XContentBuilder mapping = null;
try {
//设置只定义字段,不传参
XContentBuilder properties = XContentFactory.jsonBuilder()
.startObject()//表示开始设置值
.startObject("properties");
setFields(fields, properties);
mapping = properties.endObject