Elasticsearch系列(六)ES數據搜索(上)

一、搜索過程

文檔能夠從主分片或任意一個複製分片被檢索。
在這裏插入圖片描述
下面我們羅列在主分片或複製分片上檢索一個文檔必要的順序步驟:
(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不會停止執行查詢,它僅僅告訴你目前順利返回結果的節點然後關閉連接。在後臺,其他分片可能依舊執行查詢,儘管結果已經被髮送。

使用超時是因爲對於你的業務需求來說非常重要,而不是因爲你想中斷執行長時間運行的查詢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章