Elasticsearch學習筆記(三)

2021-08-21 15:56:27 字數 3776 閱讀 8313

在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 smithabout字段明確的寫道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...