面向文檔
應(yīng)用中的對(duì)象很少只是簡(jiǎn)單的鍵值列表,更多時(shí)候它擁有復(fù)雜的數(shù)據(jù)結(jié)構(gòu)艘策,比如包含日期蹈胡、地理位置、另一個(gè)對(duì)象或者數(shù)組。
總有一天你會(huì)想到把這些對(duì)象存儲(chǔ)到數(shù)據(jù)庫(kù)中罚渐。將這些數(shù)據(jù)保存到由行和列組成的關(guān)系數(shù)據(jù)庫(kù)中却汉,就好像是把一個(gè)豐富,信息表現(xiàn)力強(qiáng)的對(duì)象拆散了放入一個(gè)非常大的表格中:你不得不拆散對(duì)象以適應(yīng)表模式(通常一列表示一個(gè)字段)荷并,然后又不得不在查詢的時(shí)候重建它們合砂。
Elasticsearch是面向文檔(document oriented)的,這意味著它可以存儲(chǔ)整個(gè)對(duì)象或文檔(document)源织。然而它不僅僅是存儲(chǔ)翩伪,還會(huì)索引(index)每個(gè)文檔的內(nèi)容使之可以被搜索。在Elasticsearch中谈息,你可以對(duì)文檔(而非成行成列的數(shù)據(jù))進(jìn)行索引缘屹、搜索、排序侠仇、過(guò)濾轻姿。這種理解數(shù)據(jù)的方式與以往完全不同,這也是Elasticsearch能夠執(zhí)行復(fù)雜的全文搜索的原因之一傅瞻。
索引
Elasticsearch集群可以包含多個(gè)索引(indices)(數(shù)據(jù)庫(kù))踢代,每一個(gè)索引可以包含多個(gè)類型(types)(表),每一個(gè)類型包含多個(gè)文檔(documents)(行)嗅骄,然后每個(gè)文檔包含多個(gè)字段(Fields)(列)胳挎。
索引含義的區(qū)分
你可能已經(jīng)注意到索引(index)這個(gè)詞在Elasticsearch中有著不同的含義,所以有必要在此做一下區(qū)分:
- 索引(名詞) 如上文所述溺森,一個(gè)索引(index)就像是傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)庫(kù)慕爬,它是相關(guān)文檔存儲(chǔ)的地方,index的復(fù)數(shù)是indices 或indexes屏积。
- 索引(動(dòng)詞) 「索引一個(gè)文檔」表示把一個(gè)文檔存儲(chǔ)到索引(名詞)里医窿,以便它可以被檢索或者查詢。這很像SQL中的INSERT關(guān)鍵字炊林,差別是姥卢,如果文檔已經(jīng)存在,新的文檔將覆蓋舊的文檔渣聚。
- 倒排索引 傳統(tǒng)數(shù)據(jù)庫(kù)為特定列增加一個(gè)索引独榴,例如B-Tree索引來(lái)加速檢索。Elasticsearch和Lucene使用一種叫做倒排索引(inverted index)的數(shù)據(jù)結(jié)構(gòu)來(lái)達(dá)到相同目的奕枝。
- 默認(rèn)的棺榔,一個(gè)文檔中的每一個(gè)屬性都是 被索引 的(有一個(gè)倒排索引)和可搜索的。一個(gè)沒(méi)有倒排索引的屬性是不能被搜索到的隘道。
創(chuàng)建索引
為了創(chuàng)建員工目錄症歇,我們將進(jìn)行如下操作:
- 為每個(gè)員工的文檔(document)建立索引郎笆,每個(gè)文檔包含了相應(yīng)員工的所有信息。
- 每個(gè)文檔的類型為employee忘晤。
- employee類型歸屬于索引megacorp宛蚓。
- megacorp索引存儲(chǔ)在Elasticsearch集群中。
實(shí)際上這些都是很容易的(盡管看起來(lái)有許多步驟)德频。我們能通過(guò)一個(gè)命令執(zhí)行完成的操作:
PUT /megacorp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
我們看到path:/megacorp/employee/1包含三部分信息:
名字 | 說(shuō)明 |
---|---|
megacorp | 索引名 |
employee | 類型名 |
1 | 這個(gè)員工的ID |
很簡(jiǎn)單吧苍息!它不需要你做額外的管理操作,比如創(chuàng)建索引或者定義每個(gè)字段的數(shù)據(jù)類型壹置。我們能夠直接索引文檔竞思,Elasticsearch已經(jīng)內(nèi)置所有的缺省設(shè)置,所有管理操作都是透明的钞护。