使用版本說明: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:自定義域,可以自定義一些內容在該域中
