在elasticsearch中,文件歸屬於一種型別,而這些型別存在於索引中,我們可以畫一些簡單的對比圖來模擬傳統關係型資料庫
relational db -> databases -> tables ->
rows
->columns
elasticsearch -> indices -> types -> documents -> fields
elasticsearch集群可以包含多個索引(indices),每個索引可以包含多個型別(types),每個型別包含多個文件(documents),然後每個文件包含多個字段(fields)。
索引(動詞)表示把乙個文件儲存到索引(名詞)裡,以便它可以北檢索或者查詢。這很像sql中的insert
關鍵字,差別是,如果文件已經存在,新的文件將覆蓋舊的文件。
倒排索引 傳統資料庫為特定列增加乙個索引,例如b-tree索引來加速檢索。
為了建立員工的目錄,我們將進行如下操作:
實際上這些都是很容易的,儘管看起來有很多的步驟,我們通過乙個命令執行完成的操作:
put /megacorp/employee/1
我們看到path:/megacorp/employee/1
包含三部分資訊:
名字說明
megacorp
索引名employee
型別名1
員工id
請求實體(json文件),包含了這個員工的所有資訊。她的名字叫「john smith」,25歲,喜歡攀岩。
很簡單吧,它不需要你做額外的管理操作,比如建立索引或者定義每個欄位的資料型別。我們能夠直接索引,elasticsearch已經內建所有的預設設定,所有管理操作都是透明的。
put /megacorp/employee/2
put /megacorp/employee/3
get
請求非常簡單——你能輕鬆獲取你想要的文件,讓我們來進一步嘗試一些東西,比如簡單的搜尋。
我們嘗試乙個最簡單的搜尋全部員工的請求:
get /megacorp/employee/_search
你可以看到我們依然使用megacorp
索引和employee
型別,但是我們在結尾使用關鍵字_search
來取代原來的文件id。響應內容的hit
陣列中包含了我們所有的三個文件。預設情況下搜尋會返回前10個結果。
,
"hit":
},},}]
}}
響應內容不僅會告訴我們哪些文件被匹配到,而且這些文件內容完整的被包含在其中,我們會給使用者展示搜尋結果時需要用到的所有資訊都有了。
接下來,讓我們搜尋姓氏中包含smith
的員工,要做到這一點,我們將在命令中使用輕量級的搜尋方法,這種方法常北稱作查詢字串搜尋,因為我們像傳遞url引數一樣去傳遞查詢語句:
get /megacorp/employee/_search?q=last_name:smith
我們在請求中依舊使用_search
關鍵字,然後將查詢語句傳遞給引數q=
。這樣就可以得到所有姓氏為smith的結果:
},}
]}
}
查詢字串搜尋便於通過命令列完成特定(ad hoc)的搜尋,但是他也有侷限性。elasticsearch提供豐富且靈活的查詢語句叫做dsl查詢(query dsl),它允許你構建更加複雜、強大的查詢。
dsl(domain specific language特定領域語言)以json請求體的形式出現。我們可以這樣表示之前關於「smith」 的查詢:
get /megacorp/employee/_search
}}
這會返回與之前查詢相同的結果,你可以看到有些東西改變了,我們不再使用查詢字串(query string)做為引數,而是使用請求體代替。這個請求體使用json表示,其中使用了match
語句(查詢型別之一)。
我們讓搜尋稍微在變的複雜一些,我們依舊想要找到姓氏為「smith」的員工,但是我們只想得到年齡大於30歲的員工。我們的語句將新增過濾器(filter),它使得我們高效率的執行乙個結構化搜尋:
get /megacorp/employee/_search
<1>}},
"query"
: }}}
}
<1>這部分查詢屬於區間過濾器(range filter),它用於查詢所有年齡大於30歲的資料,gt為「greater than」的縮寫
<2>這部分查詢與之前的match語句一致
現在不要擔心語法太多,我們將會在以後詳細的討論,你只要知道我們新增了乙個過濾器filter用於執行區間搜尋,然後重複利用了之前的match語句。現在我們搜尋結果之顯示了乙個32歲且名字是「jane smith」的員工:
}]
}}
到目前為止,搜尋都很簡單:搜尋特定的名字,通過年齡篩選。讓我們嘗試一種更高階的搜尋,全文搜尋——一種傳統資料庫很難實現的功能。
我們將會搜尋所有喜歡「rock climbing」的員工:
get /megacorp/employee/_search
}}
你可以看到我們使用了之前的match
查詢,從about
欄位中搜尋「rock climbing」,我們得到兩個匹配文件;
},}
]}
}
<1><2>結果相關性評分
預設情況下,elasticsearch根據結果相關性評分來對結果集進行排序,所謂結果相關性評分,就是文件與查詢條件的匹配程度。很顯然,排名第一的john smith
的about
字段明確的寫道rock climbing
.
但是為什麼jane smith
也會出現在結果裡呢?原因是rock
欄位中被提及了。因為只有「rock」被提及而「climing」沒有,所以她的_score
要低於john。
這個例子很好的解釋了elasticsearch如何在各種文字欄位中進行全文搜尋,並且返回相關性最大的結果集。相關性的概念非常重要,而這個概念在傳統關係行資料庫中是不可想象的,因為傳統資料庫對記錄的查詢只有匹配或者不匹配。
目前我們可以在字段中搜尋單獨的乙個詞,這挺好的,但是有時候你想要確切的匹配若干個單詞或者短語。例如我們想要查詢同時包含「rock」和「climbing」(並且是相鄰的)的員工記錄。
要做到這個,我們只要將match
查詢變更為match_phrase
查詢即可:
get /megacorp/employee/_search
}}
毫無疑問,該查詢返回john smith的文件:
}]
}}
讓我們在之前的語句上增加highlight
引數
get /megacorp/employee/_search
},"highlight":}}
}
elasticsearch學習入門
由於es更新很快,本文這類快餐式的記錄僅供參考 es的官網有比較全面的api,但我看過以後感覺api的層次還是有點亂,至少沒有mongodb的文件那麼簡單易讀。從簡單的應用開始慢慢認識es的。比如要搭建個中文新聞資訊的搜尋引擎,新聞有 標題 內容 作者 型別 發布時間 這五個字段 我們要提供 標題和...
elasticsearch 入門學習
原文 1 思考 大規模資料如何檢索 當系統資料量上了10億 100億條的時候,我們在做系統架構的時候通常會從以下角度去考慮問題 2 傳統資料庫的應對解決方案 對於關係型資料,我們通常採用以下或類似架構去解決查詢瓶頸和寫瓶頸 3 非關係型資料庫的解決方案 對於nosql資料庫,以mongdb為例,其它...
Elasticsearch 學習筆記
參考 關係型資料庫 elasticsearch 資料庫database索引index,支援全文檢索 表table型別type 資料行row文件document,但不需要固定結構,不同文件可以具有不同字段集合 資料列column字段field 模式schema 索引字段型別numeric dataty...