1:索引(創建或者刪除)一個文檔
首先:發送一個索引或者刪除的請求給node1
其次:node1接收到請求之后,會根據請求中攜帶的參數“文檔id”判斷出該文檔應該存儲在具體哪一個shard中
shard = hash(routing) % number_of_primary_shards
,比如shard0;其次就是node1通過元數據信息可以知道shard0在具體哪一個節點,於是node1會把請求轉發給node3
最后:node3接收到請求之后會將請求並行的分發給shard0的所有replica shard之上,也就是存在於node 1和node 2中的replica shard;如果所有的replica shard都成功地執行了請求,那么將會向node 3回復一個成功確認,當node 3收到了所有replica shard的確認信息后,則最后向用戶返回一個Success的消息。
2:刪除一個文檔
該過程可以分為四個階段來描述: 階段1:客戶端向node 1發送一個文檔刪除的請求。 階段2:同樣的node 1通過請求中文檔的 _id 值判斷出該文檔應該被存儲在shard 0 這個分片中,並且node 1知道shard 0的primary shard位於node 3這個節點上。因此node 1會把這個請求轉發到node 3。 階段3:node 3接收到請求后,在主分片上面執行刪除請求 階段4:如果node 3成功地刪除了文檔,node 3將會請求並行地發給其余所有的replica shard所在node中。這些node也同樣操作刪除,執行后則向node 3確認成功,當node 3接收到所有的成功確認之后,再向客戶端發送一個刪除成功的信息。
3:檢索文檔
檢索文檔的時候,我們並不知道文檔在集群中的哪個位置,所以一般情況下不得不去詢問index中的每一個shard,然后將結果拼接成一個大的已排好序的匯總結果列表;
(1):客戶端發送一個檢索請求給node3,此時node3會創建一個空的優先級隊列並且配置好分頁參數from與size。
(2):node3將檢所請求發送給index中的每一個shard(primary 和 replica),每一個在本地執行檢索,並將結果添加到本地的優先級隊列中;
(3):每個shard返回本地優先級序列中所記錄的_id與score值,並發送node3。Node3將這些值合並到自己的本地的優先級隊列中,並做全局的排序(node 3將它們合並成一條匯總的結果),返回給客戶端。
列子:
1):構建測試數據:
PUT website/blog/1
{
"title" : "this is title",
"conteng" : "this is content"
}
PUT website/blog/2
{
"title" : "thi title",
"conteng" : "thi content"
}
PUT website/blog/3
{
"title" : "thitle",
"conteng" : "thontent"
}
PUT website/blog/4
{
"title" : "aaa",
"conteng" : "aaaaa"
}
PUT website/blog/5
{
"title" : "bbbbb",
"conteng" : "cccccc"
}
PUT website/blog/6
{
"title" : "e",
"conteng" : "ssss"
}
PUT website/blog/7
{
"title" : "this title",
"conteng" : "thi content"
}
在最初的查詢過程中,查詢請求會廣播到index中的每一個primary shard和replica shard中,每一個shard會在本地執行檢索,並建立一個優先級隊列(priority queue)。這個優先級隊列是一個根據文檔匹配度這個指標所排序列表,列表的長度由分頁參數from和size兩個參數所決定
GET website/_search
{
"query": {
"match": {
"title": "this"
}
}
}