檢索,可以說是ES最基本也是最強大的功能。我們可以將一個 JSON 文檔扔到 Elasticsearch 裏,然後根據 ID 檢索。但 Elasticsearch 真正強大之處在於可以從無規律的數據中找出有意義的信息——從“大數據”到“大信息”。
搜索(search) 可以做到:
- 在類似於
gender
或者age
這樣的字段上使用結構化查詢,join_date
這樣的字段上使用排序,就像SQL的結構化查詢一樣。 - 全文檢索,找出所有匹配關鍵字的文檔並按照相關性(relevance) 排序後返回結果。
- 以上二者兼而有之。
很多搜索都是開箱即用的,爲了充分挖掘 Elasticsearch 的潛力,你需要理解以下三個概念:
-
映射(Mapping)
描述數據在每個字段內如何存儲
-
分析(Analysis)
全文是如何處理使之可以被搜索的
-
領域特定查詢語言(Query DSL)
Elasticsearch 中強大靈活的查詢語言
在《es基本概念介紹》中我們演示了es的基本搜索方式,下面我們來講解下es的返回信息
GET /_search
es返回
{
"took" : 4,
"timed_out" : false,
"_shards" : {
"total" : 6,
"successful" : 6,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 3,
"max_score" : 1.0,
"hits" : [
{
"_index" : "user",
"_type" : "introduce",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "jack",
"age" : 20,
"gender" : "male"
}
}
.................................
]
}
}
hits
返回結果中最重要的部分是 hits
,它包含 total
字段來表示匹配到的文檔總數,並且一個 hits
數組包含所查詢結果的前十個文檔。
在 hits
數組中每個結果包含文檔的 _index
、 _type
、 _id
,加上 _source
字段。這意味着我們可以直接從返回的搜索結果中使用整個文檔。這不像其他的搜索引擎,僅僅返回文檔的ID,需要你單獨去獲取文檔。
每個結果還有一個 _score
,它衡量了文檔與查詢的匹配程度。默認情況下,首先返回最相關的文檔結果,就是說,返回的文檔是按照 _score
降序排列的。在這個例子中,我們沒有指定任何查詢,故所有的文檔具有相同的相關性,因此對所有的結果而言 1
是中性的 _score
。
max_score
值是與查詢所匹配文檔的 _score
的最大值。
took
took
值告訴我們執行整個搜索請求耗費了多少毫秒。
shards
_shards
部分告訴我們在查詢中參與分片的總數,以及這些分片成功了多少個失敗了多少個。正常情況下我們不希望分片失敗,但是分片失敗是可能發生的。如果我們遭遇到一種災難級別的故障,在這個故障中丟失了相同分片的原始數據和副本,那麼對這個分片將沒有可用副本來對搜索請求作出響應。假若這樣,Elasticsearch 將報告這個分片是失敗的,但是會繼續返回剩餘分片的結果。
timeout
timed_out
值告訴我們查詢是否超時。默認情況下,搜索請求不會超時。如果低響應時間比完成結果更重要,你可以指定 timeout
爲 10 或者 10ms(10毫秒),或者 1s(1秒):
GET /_search?timeout=10ms
timeout
不是停止執行查詢,它僅僅是告知正在協調的節點返回到目前爲止收集的結果並且關閉連接。在後臺,其他的分片可能仍在執行查詢即使是結果已經被髮送了。