Elasticsearch学习笔记(一)
使用版本说明:2.1.1
- 程序启动
入口函数:
org.elasticsearch.bootstrap.Elasticsearch
进入主函数后程序主要经过如下步骤启动:
- 启动参数校验
- 配置文件检测
- 进程号文件检测
- JVM检测(要求JDK版本1.7或以上)
- 钩子函数声明(用于节点进程突然dump的处理机制)
- Jar包校验(原1.x版本没有该过程)
- 节点各服务启动
- 保持节点存活进程启动
- 对于一个index的配置
主要用于index的Settings配置,我们可以通过在建index的过程中设置如下参数:
#分片数
index.number_of_shards
#副本数
index.number_of_replicas
#是否设为影子副本(暂未研究)
index.shadow_replicas
#是否设为可分享文件系统(暂未研究)
index.shard_filesystem
#是否自动扩展副本(暂未研究)
index.auto_expand_replicas
#暂未研究
index.blocks.read_only
#暂未研究
index.blocks.read
#暂未研究
index.blocks.write
#暂未研究
index.blocks.metadata
#创建该index用到的Elasticsearch版本
index.version.created
index.version.created_string
#更新该index用到的Elasticsearch版本
index.verison.upgraded
index.version.upgraded_string
#该index支持的最小lucene版本
index.version.minimum_compatible
#该index建立日期
index.creating_data
index.creating_data_string
#该index的优先级
index.priority
#该index的uuid,唯一标识
index.uuid
#该index各索引的routing规则,采用何种Hash方式,默认使用Murmur3,还有一种普通的Hash算法
index.legacy.routing.hash.type
#routing计算是否使用type,内部计算shard id的方法已经废弃,建议不使用,不设置,默认false即可
index.legacy.routing.use_type
#该index的数据存储路径
index.data_path
#暂未研究
#index.shared_filesystem.recover_on_any_node
Elasticsearch routing方式,使用id进行routing,通过使用Murmur3算法,计算出id的Hash值,然后利用分片总数计算出具体哪个分片:
从2.0.0-beta1开始之后的版本,分片计算方式为:
#参数:id的hash值,以及该index的分片个数
MathUtils.mod(hash, indexMetaData.getNumberOfShards());
#具体方法如下:
public static int mod(int v, int m) {
int r = v % m;
if (r < 0) {
r += m;
}
return r;
}
在该版本之前的计算方式为:
Math.abs(hash % indexMetaData.getNumberOfShards());
- index创建方法(Java API)
Elasticsearch对于常用的Java API常提供两种借口方式,一种是直接传入请求执行,一种是prepare也就是预准备,先构造相关请求,然后再执行,两种方式大同小异,这里只介绍prepare方式的API。
// 创建index
public static void createIndice(String index, String type) throws IOException {
// 创建index请求构造
CreateIndexRequestBuilder createIndexRequestBuilder = transportClient.admin().indices().prepareCreate(index);
// 设置该index的Mapping,可暂时不设置,后面建完index之后再设置也可
createIndexRequestBuilder.addMapping(type, createMapping(type));
// 设置该index的Settings配置,常用的有shard数量、副本数
createIndexRequestBuilder.setSettings(createSetting());
// 执行创建index请求
createIndexRequestBuilder.execute().actionGet();
}
// 设置index的Settings
public static Settings createSetting() {
Settings settings = Settings.builder().put("number_of_shards", 5).put("number_of_replicas", 0).build();
return settings;
}
// 设置index的Mappings,具体内容在后面解释
public static XContentBuilder createMapping(String type) throws IOException {
XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
.startObject(type)
.startObject("properties")
.startObject("name").field("type", "string").field("index", "not_analyzed").endObject()
.startObject("age").field("type", "integer").field("index", "not_analyzed").endObject()
.startObject("birthday").field("type", "date").field("index", "not_analyzed").endObject()
.endObject()
.endObject()
.endObject();
return builder;
}
- index的Mapping设置
mapping可以说是一个index的基本骨架,index数据的插入和查询需要依托mapping,我们可以理解为数据库中的表的配置。
首先介绍一下Mapping Meta Fields(基于官方文档实例,使用实例这里也不再赘述了)
-
_index:document所属的index名称字段,是一虚拟field,非lucene在索引上添加的field,支持term、terms、query_string, simply_query_string,match,不支持fuzzy,prefix,wildcard,regexp。
-
_uid:由_type和_id两个域的值构成,用#分隔
-
_type:document的Mapping type(对于一个type,只有一个mapping与之对应)
-
_id:document的id号,_id支持queries和scripts,但不支持aggregations和sorting,需要进行聚合或排序时,采用_uid
-
_source:用来存储实际建立索引期间提交的JSON数据,该字段不索引(也不支持检索),只是用来存储,所以当使用fetch类请求,如get或search时,我们能拿到_source中存储的内容。该域虽然比较实用,但会耗存储,所以可以禁用
-
_size:设置source域的字节大小,由mapper-size plugin提供。
-
_all:该字段包含了其他所有字段的值,值与值之间用空格分隔,能够分析和索引,但是该域不存储,也就是该域可以查询,但是查询结果无法提取出该域的值。当我们只知道值,却不知道是哪一字段时,我们可以用该字段进行查询
-
_field_names:包含了一个文档中所有非空字段的字段名。该字段被用作exists和missing查询,用来找出文档中的字段是否有值。该字段可以用作查询,聚合以及脚本查询(script)
-
_timestamp:该字段就是一个时间字段,在2.0.0-beta2版本,该字段已废弃。该字段当设置为enable时,可以自行设置值或者自动生成值,自动生成为当前时间。可用于查询、聚合和脚本(script),同时支持排序
-
_ttl:Time to live,文档过期设置,用于通过设置时间来确定
-
_parent:用来建立两个Mapping之间的父子关系
-
_routing:文档的路由配置,指向该文档在ES中的哪个分片上
-
_meta:自定义域,可以自定义一些内容在该域中