Elasticsearch的文件、索引。(三)
elasticsearch。面向文件
在應用程式中物件很少只是一個簡單的鍵和值的列表。通常,它們擁有更復雜的資料結構,可能包括日期、地理資訊、其他物件或者陣列等。
也許有一天你想把這些物件儲存在資料庫中。使用關係型資料庫的行和列儲存,這相當於是把一個表現力豐富的物件塞到一個非常大的電子表格中:為了適應表結構,你必須設法將這個物件扁平化—通常一個欄位對應一列—而且每次查詢時又需要將其重新構造為物件。
Elasticsearch 是 面向文件 的,意味著它儲存整個物件或 文件。Elasticsearch 不僅儲存文件,而且 索引 每個文件的內容,使之可以被檢索。在 Elasticsearch 中,我們對文件進行索引、檢索、排序和過濾—而不是對行列資料。這是一種完全不同的思考資料的方式,也是 Elasticsearch 能支援複雜全文檢索的原因。
JSON
Elasticsearch 使用 JavaScript Object Notation(或者 JSON)作為文件的序列化格式。JSON 序列化為大多數程式語言所支援,並且已經成為 NoSQL 領域的標準格式。 它簡單、簡潔、易於閱讀。
下面這個 JSON 文件代表了一個 user 物件:
{ "email": "[email protected]", "first_name": "John", "last_name": "Smith", "info": { "bio": "Eco-warrior and defender of the weak", "age": 25, "interests": [ "dolphins", "whales" ] }, "join_date": "2014/05/01" }
雖然原始的 user 物件很複雜,但這個物件的結構和含義在 JSON 版本中都得到了體現和保留。在 Elasticsearch 中將物件轉化為 JSON 後構建索引要比在一個扁平的表結構中要簡單的多。
我們將會建立一個僱員專案,來演示es的增刪改查。
索引員工文件
儲存員工資料。 這將會以 員工文件 的形式儲存:一個文件
代表一個員工。
儲存資料到 Elasticsearch 的行為叫做 索引
,但在索引一個文件之前,需要確定將文件儲存在哪裡。
一個 Elasticsearch 叢集可以 包含多個 索引 ,相應的每個索引可以包含多個 型別 。 這些不同的型別儲存著多個 文件 ,每個文件又有 多個 屬性 。
索引(名詞):一個 索引 類似於傳統關係資料庫中的一個 資料庫 ,是一個儲存關係型文件的地方。 索引 (index) 的複數詞為 indices 或 indexes 。
索引(動詞):索引一個文件就是儲存一個文件到一個 索引 (名詞)中以便被檢索和查詢。這非常類似於 SQL 語句中的 INSERT 關鍵詞,除了文件已存在時,新文件會替換舊文件情況之外。
倒排索引:關係型資料庫通過增加一個 索引 比如一個 B樹(B-tree)索引 到指定的列上,以便提升資料檢索速度。Elasticsearch 和 Lucene 使用了一個叫做 倒排索引 的結構來達到相同的目的。
預設的,一個文件中的每一個屬性都是 被索引 的(有一個倒排索引)和可搜尋的。一個沒有倒排索引的屬性是不能被搜尋到的。我們將在 倒排索引 討論倒排索引的更多細節。
對於員工目錄,我們將做如下操作:
- 每個員工索引一個文件,文件包含該員工的所有資訊。
- 每個文件都將是 employee 型別 。
- 該型別位於 索引 yiyang 內。
- 該索引儲存在我們的 Elasticsearch 叢集中。
我們通過傳送一個PUT請求。獲取通過kibana來發送都是可以的。在這裡我們使用kibana。
PUT /yiyang/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
注意,路徑 /yiyang/employee/1包含了三部分的資訊:
- yiyang索引名稱。相當於資料庫
- employee 型別。相當於mysql中的物件
- 特定僱員的ID
返回值:
- _version:版本號,每次修改都會增加
- result:created。說明這次是建立