Elasticsearch学习笔记(一)

使用版本说明:2.1.1

  • 程序启动

入口函数:

org.elasticsearch.bootstrap.Elasticsearch

进入主函数后程序主要经过如下步骤启动:

  1. 启动参数校验
  2. 配置文件检测
  3. 进程号文件检测
  4. JVM检测(要求JDK版本1.7或以上)
  5. 钩子函数声明(用于节点进程突然dump的处理机制)
  6. Jar包校验(原1.x版本没有该过程)
  7. 节点各服务启动
  8. 保持节点存活进程启动
  • 对于一个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(基于官方文档实例,使用实例这里也不再赘述了)

  1. _index:document所属的index名称字段,是一虚拟field,非lucene在索引上添加的field,支持term、terms、query_string, simply_query_string,match,不支持fuzzy,prefix,wildcard,regexp。

  2. _uid:由_type和_id两个域的值构成,用#分隔

  3. _type:document的Mapping type(对于一个type,只有一个mapping与之对应)

  4. _id:document的id号,_id支持queries和scripts,但不支持aggregations和sorting,需要进行聚合或排序时,采用_uid

  5. _source:用来存储实际建立索引期间提交的JSON数据,该字段不索引(也不支持检索),只是用来存储,所以当使用fetch类请求,如get或search时,我们能拿到_source中存储的内容。该域虽然比较实用,但会耗存储,所以可以禁用

  6. _size:设置source域的字节大小,由mapper-size plugin提供。

  7. _all:该字段包含了其他所有字段的值,值与值之间用空格分隔,能够分析和索引,但是该域不存储,也就是该域可以查询,但是查询结果无法提取出该域的值。当我们只知道值,却不知道是哪一字段时,我们可以用该字段进行查询

  8. _field_names:包含了一个文档中所有非空字段的字段名。该字段被用作exists和missing查询,用来找出文档中的字段是否有值。该字段可以用作查询,聚合以及脚本查询(script)

  9. _timestamp:该字段就是一个时间字段,在2.0.0-beta2版本,该字段已废弃。该字段当设置为enable时,可以自行设置值或者自动生成值,自动生成为当前时间。可用于查询、聚合和脚本(script),同时支持排序

  10. _ttl:Time to live,文档过期设置,用于通过设置时间来确定

  11. _parent:用来建立两个Mapping之间的父子关系

  12. _routing:文档的路由配置,指向该文档在ES中的哪个分片上

  13. _meta:自定义域,可以自定义一些内容在该域中

posted @ 2016-04-10 23:30  幽·轩  阅读(5802)  评论(0编辑  收藏  举报