ElasticSearch學(xué)習(xí)筆記


ElasticSearch(以下簡稱ES)是一個(gè)基于Apache Lucene(TM)的開源搜索引擎媳荒。無論在開源還是專有領(lǐng)域,Lucene可以被認(rèn)為是迄今為止最先進(jìn)、性能最好的、功能最全的搜索引擎庫。其使用Java開發(fā)并使用Lucene作為其核心來實(shí)現(xiàn)所有索引和搜索的功能结蟋,但是它的目的是通過簡單的RESTful API來隱藏Lucene的復(fù)雜性,從而讓全文搜索變得簡單渔彰。

一嵌屎、安裝與啟動(dòng)(windows)

首先在官網(wǎng)下載zip包,下載地址:https://www.elastic.co/downloads/elasticsearch#ga-release恍涂,下載后解壓宝惰,啟動(dòng)bin目錄下的elasticsearch.bat,ElasticSearch便啟動(dòng)了再沧。這時(shí)在瀏覽器中輸入網(wǎng)址http://localhost:9200/?pretty掌测,可以看到一個(gè)Json(如下),顯示的是ES的版本等信息产园。

{
    "name": "x62D3ht",
    "cluster_name": "elasticsearch",
    "cluster_uuid": "yDPE_WTBQE6Hp5ZBydgjSw",
    "version": {
        "number": "5.6.2",
        "build_hash": "57e20f3",
        "build_date": "2017-09-23T13:16:45.703Z",
        "build_snapshot": false,
        "lucene_version": "6.6.1"
    },
    "tagline": "You Know, for Search"
}

二汞斧、索引(index)與查詢

在Elasticsearch中存儲數(shù)據(jù)的行為就叫做索引(indexing),不過在索引之前什燕,我們需要明確數(shù)據(jù)應(yīng)該存儲在哪里屋吨。在Elasticsearch中鹦付,文檔歸屬于一種類型(type),而這些類型存在于索引(index)中川蒙,我們可以拿ES和傳統(tǒng)關(guān)系型數(shù)據(jù)庫做一個(gè)對比:

傳統(tǒng)數(shù)據(jù)庫 ES 說明
Databases Indices 數(shù)據(jù)庫
Tables Types
Rows Documents 記錄
Columns Fields 字段

Elasticsearch集群可以包含多個(gè)索引(indices)(數(shù)據(jù)庫)著角,每一個(gè)索引可以包含多個(gè)類型(types)(表)事富,每一個(gè)類型包含多個(gè)文檔(documents)(行),然后每個(gè)文檔包含多個(gè)字段(Fields)(列)乘陪。

在這里要特別說明一下索引(index)在ES中的不同含義统台。
  • 索引(名詞) 如上文所述,一個(gè)索引(index)就像是傳統(tǒng)關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)庫啡邑,它是相關(guān)文檔存儲的地方贱勃,index的復(fù)數(shù)是indices 或indexes。
  • 索引(動(dòng)詞) 「索引一個(gè)文檔」表示把一個(gè)文檔存儲到索引(名詞)里谤逼,以便它可以被檢索或者查詢贵扰。這很像SQL中的INSERT關(guān)鍵字,差別是流部,如果文檔已經(jīng)存在戚绕,新的文檔將覆蓋舊的文檔。
  • 倒排索引 傳統(tǒng)數(shù)據(jù)庫為特定列增加一個(gè)索引枝冀,例如B-Tree索引來加速檢索舞丛。Elasticsearch和Lucene使用一種叫做倒排索引(inverted index)的數(shù)據(jù)結(jié)構(gòu)來達(dá)到相同目的。
索引

接下來我們通過建立一個(gè)員工目錄果漾,并對其進(jìn)行索引和搜索(可以使用Postman發(fā)送請求)球切,首先我們要?jiǎng)?chuàng)建員工目錄,大概有如下操作:

  • 為每個(gè)員工的文檔(document)建立索引跨晴,每個(gè)文檔包含了相應(yīng)員工的所有信息欧聘。
  • 每個(gè)文檔的類型為employee片林。
  • employee類型歸屬于索引megacorp端盆。
  • megacorp索引存儲在Elasticsearch集群中。

我們只需要一個(gè)命令就能完成這些操作:

在Postman中發(fā)送PUT請求:localhost:9200//megacorp/employee/1
在body中加入如下參數(shù)(Json格式):

{
    "first_name" : "John",
    "last_name" :  "Smith",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}
image.png

發(fā)送請求后就會將一條員工記錄加入到ES中费封,在Postman中發(fā)送GET請求:localhost:9200//megacorp/employee/1就會查詢到這一條記錄焕妙。返回信息如下:

{
    "_index": "megacorp",
    "_type": "employee",
    "_id": "1",
    "_version": 1,
    "found": true,
    "_source": {
        "first_name": "John",
        "last_name": "Smith",
        "age": 25,
        "about": "I love to go rock climbing",
        "interests": [
            "sports",
            "music"
        ]
    }
}

接下來,讓我們在目錄中加入更多員工信息:
發(fā)送PUT請求:localhost:9200//megacorp/employee/2弓摘,并設(shè)置body索引第二個(gè)員工文檔焚鹊。

{
    "first_name" :  "Jane",
    "last_name" :   "Smith",
    "age" :         32,
    "about" :       "I like to collect rock albums",
    "interests":  [ "music" ]
}

發(fā)送PUT請求:localhost:9200//megacorp/employee/3,并設(shè)置body索引第三個(gè)員工文檔韧献。

{
    "first_name" :  "Douglas",
    "last_name" :   "Fir",
    "age" :         35,
    "about":        "I like to build cabinets",
    "interests":  [ "forestry" ]
}
搜索

上邊我們錄入了3條員工信息末患,可以通過如下請求搜索全部員工。
發(fā)送GET請求:localhost:9200//megacorp/employee/_search
返回信息如下:

{
    "took": 6,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 3,
        "max_score": 1,
        "hits": [
            {
                "_index": "megacorp",
                "_type": "employee",
                "_id": "2",
                "_score": 1,
                "_source": {
                    "first_name": "Jane",
                    "last_name": "Smith",
                    "age": 32,
                    "about": "I like to collect rock albums",
                    "interests": [
                        "music"
                    ]
                }
            },
            {
                "_index": "megacorp",
                "_type": "employee",
                "_id": "1",
                "_score": 1,
                "_source": {
                    "first_name": "John",
                    "last_name": "Smith",
                    "age": 25,
                    "about": "I love to go rock climbing",
                    "interests": [
                        "sports",
                        "music"
                    ]
                }
            },
            {
                "_index": "megacorp",
                "_type": "employee",
                "_id": "3",
                "_score": 1,
                "_source": {
                    "first_name": "Douglas",
                    "last_name": "Fir",
                    "age": 35,
                    "about": "I like to build cabinets",
                    "interests": [
                        "forestry"
                    ]
                }
            }
        ]
    }
}

可以看到我們使用_search代替原來的文檔id,響應(yīng)內(nèi)容的數(shù)組中包含所有的3個(gè)文檔锤窑,默認(rèn)情況下此搜索會返回前10條結(jié)果璧针。

查詢字符串

查詢字符串就像傳遞URL參數(shù)一樣去傳遞查詢語句,比如查詢last_name為"Smith"的文檔渊啰,可以發(fā)送GET請求:localhost:9200//megacorp/employee/_search?q=last_name:Smith
返回的結(jié)果如下:

{
    "took": 7,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 2,
        "max_score": 0.2876821,
        "hits": [
            {
                "_index": "megacorp",
                "_type": "employee",
                "_id": "2",
                "_score": 0.2876821,
                "_source": {
                    "first_name": "Jane",
                    "last_name": "Smith",
                    "age": 32,
                    "about": "I like to collect rock albums",
                    "interests": [
                        "music"
                    ]
                }
            },
            {
                "_index": "megacorp",
                "_type": "employee",
                "_id": "1",
                "_score": 0.2876821,
                "_source": {
                    "first_name": "John",
                    "last_name": "Smith",
                    "age": 25,
                    "about": "I love to go rock climbing",
                    "interests": [
                        "sports",
                        "music"
                    ]
                }
            }
        ]
    }
}
DSL語句查詢

查詢字符串便于通過命令進(jìn)行特定的查詢探橱,但是也有一定的局限性申屹,ES提供的更加強(qiáng)大的查詢語言(DSL查詢),DSL是以Json作為請求體進(jìn)行查詢隧膏,這樣上面的查詢可以使用如下方法:
發(fā)送POST請求:localhost:9200//megacorp/employee/_search哗讥,并設(shè)置body參數(shù):

{
    "query" : {
        "match" : {
            "last_name" : "Smith"
        }
    }
}

返回的結(jié)果與之前用查詢字符串查詢的結(jié)果一樣,

更復(fù)雜的搜索

eg.查詢last_name為"smith" 并且年齡大于30的員工胞枕,發(fā)送POST請求:localhost:9200//megacorp/employee/_search杆煞,設(shè)置如下body參數(shù):

{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "age": {"gt": 30}
        }
      },
      "must": {
        "match": {"last_name": "Smith"}
      }
    }
  }
}

響應(yīng)的內(nèi)容為:

{
    "took": 3,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 0.2876821,
        "hits": [
            {
                "_index": "megacorp",
                "_type": "employee",
                "_id": "2",
                "_score": 0.2876821,
                "_source": {
                    "first_name": "Jane",
                    "last_name": "Smith",
                    "age": 32,
                    "about": "I like to collect rock albums",
                    "interests": [
                        "music"
                    ]
                }
            }
        ]
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市曲稼,隨后出現(xiàn)的幾起案子索绪,更是在濱河造成了極大的恐慌,老刑警劉巖贫悄,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瑞驱,死亡現(xiàn)場離奇詭異,居然都是意外死亡窄坦,警方通過查閱死者的電腦和手機(jī)唤反,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸭津,“玉大人彤侍,你說我怎么就攤上這事∧媲鳎” “怎么了盏阶?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長闻书。 經(jīng)常有香客問我名斟,道長,這世上最難降的妖魔是什么魄眉? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任砰盐,我火速辦了婚禮,結(jié)果婚禮上坑律,老公的妹妹穿的比我還像新娘岩梳。我一直安慰自己,他們只是感情好晃择,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布冀值。 她就那樣靜靜地躺著,像睡著了一般宫屠。 火紅的嫁衣襯著肌膚如雪列疗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天激况,我揣著相機(jī)與錄音作彤,去河邊找鬼膘魄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛竭讳,可吹牛的內(nèi)容都是我干的创葡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼绢慢,長吁一口氣:“原來是場噩夢啊……” “哼灿渴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胰舆,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤骚露,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后缚窿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棘幸,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年倦零,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了误续。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扫茅,死狀恐怖蹋嵌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情葫隙,我是刑警寧澤栽烂,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站恋脚,受9級特大地震影響腺办,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜慧起,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一菇晃、第九天 我趴在偏房一處隱蔽的房頂上張望册倒。 院中可真熱鬧蚓挤,春花似錦、人聲如沸驻子。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崇呵。三九已至缤剧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間域慷,已是汗流浹背荒辕。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工汗销, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抵窒。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓弛针,卻偏偏與公主長得像,于是被迫代替她去往敵國和親李皇。 傳聞我的和親對象是個(gè)殘疾皇子削茁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容