一、搜索過程
文檔能夠從主分片或任意一個複製分片被檢索。
下面我們羅列在主分片或複製分片上檢索一個文檔必要的順序步驟:
(1) 客戶端給Node 1發送get請求。
(2) 節點使用文檔的_id確定文檔屬於分片0。分片0對應的複製分片在三個節點上都有。此時,它轉發請求到Node 2。
(3) Node 2返回文檔(document)給Node 1然後返回給客戶端。
對於讀請求,爲了平衡負載,請求節點會爲每個請求選擇不同的分片——它會循環所有分片副本。
思考:使用Spring-Data-ES操作ES的時候,是如何做到負載均衡?
二、搜索結果字段說明
最基本的搜索API表單是空搜索(empty search),它沒有指定任何的查詢條件,只返回集羣索引中的所有文檔:
GET /_search
響應內容(爲了編輯簡潔)類似於這樣:
{
"hits" : {
"total" : 14,
"hits" : [
{
"_index": "us",
"_type": "tweet",
"_id": "7",
"_score": 1,
"_source": {
"date": "2014-09-17",
"name": "John Smith",
"tweet": "The Query DSL is really powerful and flexible",
"user_id": 2
}
},
... 9 RESULTS REMOVED ...
],
"max_score" : 1
},
"took" : 4,
"_shards" : {
"failed" : 0,
"successful" : 10,
"total" : 10
},
"timed_out" : false
}
1、字段解釋
(1) hits
響應中最重要的部分是hits,它包含了total字段來表示匹配到的文檔總數,hits數組還包含了匹配到的前10條數據。
hits數組中的每個結果都包含_index、_type和文檔的_id字段,被加入到_source字段中這意味着在搜索結果中我們將可以直接使用全部文檔。這不像其他搜索引擎只返回文檔ID,需要你單獨去獲取文檔。
每個節點都有一個_score字段,這是相關性得分(relevance score),它衡量了文檔與查詢的匹配程度。默認的,返回的結果中關聯性最大的文檔排在首位;這意味着,它是按照_score降序排列的。這種情況下,我們沒有指定任何查詢,所以所有文檔的相關性是一樣的,因此所有結果的_score都是取得一箇中間值1
max_score指的是所有文檔匹配查詢中_score的最大值。
(2) took
took告訴我們整個搜索請求花費的毫秒數。
(3) shards
_shards節點告訴我們參與查詢的分片數(total字段),有多少是成功的(successful字段),有多少的是失敗的(failed字段)。通常我們不希望分片失敗,不過這個有可能發生。如果我們遭受一些重大的故障導致主分片和複製分片都故障,那這個分片的數據將無法響應給搜索請求。這種情況下,Elasticsearch將報告分片failed,但仍將繼續返回剩餘分片上的結果。
(4) timeout
time_out值告訴我們查詢超時與否。一般的,搜索請求不會超時。如果響應速度比完整的結果更重要,你可以定義timeout參數爲10或者10ms(10毫秒),或者1s(1秒)
GET /_search?timeout=10ms
Elasticsearch將返回在請求超時前收集到的結果。
超時不是一個斷路器(circuit breaker)。
需要注意的是timeout不會停止執行查詢,它僅僅告訴你目前順利返回結果的節點然後關閉連接。在後臺,其他分片可能依舊執行查詢,儘管結果已經被髮送。
使用超時是因爲對於你的業務需求來說非常重要,而不是因爲你想中斷執行長時間運行的查詢。