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:自定義域,可以自定義一些內容在該域中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM