日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Elasticsearch 简介

發(fā)布時間:2025/3/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Elasticsearch 简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Elasticsearch 是一款穩(wěn)定高效的分布式搜索和分析引擎,它的底層基于 Lucene,并提供了友好的 RESTful API 來對數(shù)據(jù)進(jìn)行操作,還有比較重要的一點(diǎn)是, Elasticsearch 開箱即可用,上手也比較容易。

目前 Elasticsearch 在搭建企業(yè)級搜索(如日志搜索、商品搜索等)平臺中很廣泛,官網(wǎng)也提供了不少案例,比如:

  • GitHub 使用 Elasticsearch 檢索超過 800 萬的代碼庫

  • eBay 使用 Elasticsearch 搜索海量的商品數(shù)據(jù)

  • Netflix 使用 Elasticsearch 來實(shí)現(xiàn)高效的消息傳遞系統(tǒng)

本文主要介紹 Elasticsearch 的基本概念及入門使用。

<!-- more -->

安裝

在安裝 Elasticsearch 之前,請確保你的計(jì)算機(jī)已經(jīng)安裝了 Java。目前 Elasticsearch 的最新版是 5.2,需要安裝 Java 8,如果你用的是老版本的 Elasticsearch,如 2.x 版,可用 Java 7,但還是推薦使用 Java 8。

可以使用如下的命令檢查 Java 的版本:

$ java -version

接著,我們可以從這里下載最新版本的 Elasticsearch,也可使用 wget 下載,如下:

$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.2.tar.gz

Windows 用戶也可以下載 .zip 格式的安裝包。

下載完后進(jìn)行解壓:

$ tar -zxvf elasticsearch-5.2.2.tar.gz

運(yùn)行

首先,我們進(jìn)入到剛剛解壓出來的目錄中:

$ cd elasticsearch-5.2.2

接著,使用如下命令啟動 Elasticsearch:

$ bin/elasticsearch

此時,如果正常的話,你可以在終端看到類似如下的輸出:

[2017-03-04T23:25:09,961][INFO ][o.e.n.Node ] [] initializing ... [2017-03-04T23:25:10,073][INFO ][o.e.e.NodeEnvironment ] [yO11WLM] using [1] data paths, mounts [[/ (/dev/disk0s2)]], net usable_space [141.1gb], net total_space [232.9gb], spins? [unknown], types [hfs] [2017-03-04T23:25:10,074][INFO ][o.e.e.NodeEnvironment ] [yO11WLM] heap size [1.9gb], compressed ordinary object pointers [true] [2017-03-04T23:25:10,095][INFO ][o.e.n.Node ] node name [yO11WLM] derived from node ID [yO11WLMOQDuAOpZbYZYjzw]; set [node.name] to override [2017-03-04T23:25:10,100][INFO ][o.e.n.Node ] version[5.2.2], pid[7607], build[db0d481/2017-02-09T22:05:32.386Z], OS[Mac OS X/10.11.5/x86_64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_102/25.102-b14] [2017-03-04T23:25:11,363][INFO ][o.e.p.PluginsService ] [yO11WLM] loaded module [aggs-matrix-stats] ...

上面的命令是在前臺運(yùn)行的,如果想在后臺以守護(hù)進(jìn)程模式運(yùn)行,可以加 -d 參數(shù)。

Elasticsearch 啟動后,也啟動了兩個端口 9200 和 9300:

  • 9200 端口:HTTP RESTful 接口的通訊端口

  • 9300 端口:TCP 通訊端口,用于集群間節(jié)點(diǎn)通信和與 Java 客戶端通信的端口

現(xiàn)在,讓我們做一些測試。在瀏覽器訪問鏈接 http://localhost:9200/ ,或使用 curl 命令:

$ curl 'http://localhost:9200/?pretty'

我們可以看到類似如下的輸出:

{"name" : "yO11WLM","cluster_name" : "elasticsearch","cluster_uuid" : "yC8BGwzlSnu_zGbKL918Xg","version" : {"number" : "5.2.1","build_hash" : "db0d481","build_date" : "2017-02-09T22:05:32.386Z","build_snapshot" : false,"lucene_version" : "6.4.1"},"tagline" : "You Know, for Search" }

概念

在進(jìn)一步使用 Elasticsearch 之前,讓我們先了解幾個關(guān)鍵概念。

在邏輯層面:

  • Index (索引):這里的 Index 是名詞,一個 Index 就像是傳統(tǒng)關(guān)系數(shù)據(jù)庫的 Database,它是 Elasticsearch 用來存儲數(shù)據(jù)的邏輯區(qū)域

  • Document (文檔):Elasticsearch 使用 JSON 文檔來表示一個對象,就像是關(guān)系數(shù)據(jù)庫中一個 Table 中的一行數(shù)據(jù)

  • Type (類型):文檔歸屬于一種 Type,就像是關(guān)系數(shù)據(jù)庫中的一個 Table

  • Field (字段):每個文檔包含多個字段,類似關(guān)系數(shù)據(jù)庫中一個 Table 的列

我們用一個表格來做類比,如下:

ElasticsearchMySQL
IndexDatabase
TypeTable
DocumentRow
FieldColumn

在物理層面:

  • Node (節(jié)點(diǎn)):node 是一個運(yùn)行著的 Elasticsearch 實(shí)例,一個 node 就是一個單獨(dú)的 server

  • Cluster (集群):cluster 是多個 node 的集合

  • Shard (分片):數(shù)據(jù)分片,一個 index 可能會存在于多個 shard

使用

接下來,我們看看如何建立索引、創(chuàng)建文檔等,就好比在 MySQL 中進(jìn)行諸如創(chuàng)建數(shù)據(jù)庫,插入數(shù)據(jù)等操作。

添加文檔

下面,我們將創(chuàng)建一個存儲電影信息的 Document:

  • Index 的名稱為 movie

  • Type 為 adventure

  • Document 有兩個字段:name 和 actors

我們使用 Elasticsearch 提供的 RESTful API 來執(zhí)行上述操作,如圖所示:

  • 用 url 表示一個資源,比如 /movie/adventure/1 就表示一個 index 為 movie,type 為 adventure,id 為 1 的 document

  • 用 http 方法操作資源,如使用 GET 獲取資源,使用 POST、PUT 新增或更新資源,使用 DELETE 刪除資源等

我們可以使用 curl 命令來執(zhí)行上述操作:

$ curl -i -X PUT "localhost:9200/movie/adventure/1" -d '{"name": "Life of Pi", "actors": ["Suraj", "Irrfan"]}'

不過,本文推薦使用 httpie,類似 curl,但比 curl 更好用,將上面的命令換成 httpie,如下:

$ http put :9200/movie/adventure/1 name="Life of Pi" actors:='["Suraj", "Irrfan"]'

上面的命令結(jié)果如下:

HTTP/1.1 201 Created Location: /movie/adventure/1 content-encoding: gzip content-type: application/json; charset=UTF-8 transfer-encoding: chunked{"_id": "1","_index": "movie","_shards": {"failed": 0,"successful": 1,"total": 2},"_type": "adventure","_version": 1,"created": true,"result": "created" }

可以看到,我們已經(jīng)成功創(chuàng)建了一個 _index 為 movie,_type 為 adventure,_id 為 1 的文檔。

我們通過 GET 請求來查看這個文檔的信息:

$ http :9200/movie/adventure/1

結(jié)果如下:

HTTP/1.1 200 OK content-encoding: gzip content-type: application/json; charset=UTF-8 transfer-encoding: chunked{"_id": "1","_index": "movie","_source": {"actors": ["Suraj","Irrfan"],"name": "Life of Pi"},"_type": "adventure","_version": 1,"found": true }

可以看到,原始的文檔數(shù)據(jù)存在了 _source 字段中。

如果我們的數(shù)據(jù)沒有 id,也可以讓 Elasticsearch 自動為我們生成,此時要使用 POST 請求,形式如下:

POST /movie/adventure/ {"name": "Life of Pi" }

更新整個文檔

當(dāng)我們使用 PUT 方法指明文檔的 _index, _type 和 _id時,如果 _id 已存在,則新文檔會替換舊文檔,此時文檔的 _version 會增加 1,并且 _created 字段為 false。比如:

$ http put :9200/movie/adventure/1 name="Life of Pi"

結(jié)果如下:

HTTP/1.1 200 OK content-encoding: gzip content-type: application/json; charset=UTF-8 transfer-encoding: chunked{"_id": "1","_index": "movie","_shards": {"failed": 0,"successful": 1,"total": 2},"_type": "adventure","_version": 2,"created": false,"result": "updated" }

使用 GET 請求查看新文檔的數(shù)據(jù):

$ http :9200/movie/adventure/1

結(jié)果如下:

HTTP/1.1 200 OK content-encoding: gzip content-type: application/json; charset=UTF-8 transfer-encoding: chunked{"_id": "1","_index": "movie","_source": {"name": "Life of Pi"},"_type": "adventure","_version": 2,"found": true }

可以看到,actors 這個字段已經(jīng)不存在了,文檔的 _version 變成了 2。

因此,為了避免在誤操作的情況下,原文檔被替換,我們可以使用 _create 這個 API,表示只在文檔不存在的情況下才創(chuàng)建新文檔(返回 201 Created),如果文檔存在則不做任何操作(返回 409 Conflict),命令如下:

$ http put :9200/movie/adventure/1/_create name="Life of Pi"

由于文檔 id 存在,會返回 409 Conflict。

局部更新

在有些情況下,我們只想更新文檔的局部,而不是整個文檔,這時我們可以使用 _update 這個 API。

現(xiàn)在,待更新的文檔信息如下:

{"_id": "1","_index": "movie","_source": {"name": "Life of Pi"},"_type": "adventure","_version": 2,"found": true }

最簡單的 update 請求接受一個局部文檔參數(shù) doc,它會合并到現(xiàn)有文檔中:將對象合并在一起,存在的標(biāo)量字段被覆蓋,新字段被添加。

形式如下:

POST /movie/adventure/1/_update {"doc": {"name": "life of pi"} }

由于有嵌套字段,我們可以這樣使用 http(這里需要注意使用 POST 方法):

$ echo '{"doc": {"actors": ["Suraj", "Irrfan"]}}' | http post :9200/movie/adventure/1/_update

上面的命令中,我們添加了一個新的字段:actors,結(jié)果如下:

HTTP/1.1 200 OK content-encoding: gzip content-type: application/json; charset=UTF-8 transfer-encoding: chunked{"_id": "1","_index": "movie","_shards": {"failed": 0,"successful": 1,"total": 2},"_type": "adventure","_version": 3,"result": "updated" }

可以看到,_version 增加了 1,result 的結(jié)果是 updated。

檢索文檔

檢索某個文檔

要檢索某個文檔很簡單,我們只需使用 GET 請求并指出文檔的 index, type, id 就可以了,比如:

$ http :9200/movie/adventure/1/

響應(yīng)內(nèi)容會包含文檔的元信息,文檔的原始數(shù)據(jù)存在 _source 字段中。

我們也可以直接檢索出文檔的 _source 字段,如下:

$ http :9200/movie/adventure/1/_source

檢索所有文檔

我們可以使用 _search 這個 API 檢索出所有的文檔,命令如下:

$ http :9200/movie/adventure/_search

返回結(jié)果如下:

{"_shards": {"failed": 0,"successful": 5,"total": 5},"hits": {"hits": [{"_id": "1","_index": "movie","_score": 1.0,"_source": {"actors": ["Suraj","Irrfan"],"name": "Life of Pi"},"_type": "adventure"}],"max_score": 1.0,"total": 1},"timed_out": false,"took": 299 }

可以看到,hits 這個 object 包含了 hits 數(shù)組,total 等字段,其中,hits 數(shù)組包含了所有的文檔,這里只有一個文檔,total 表明了文檔的數(shù)量,默認(rèn)情況下會返回前 10 個結(jié)果。我們也可以設(shè)定 From/Size 參數(shù)來獲取某一范圍的文檔,可參考這里,比如:

$ http :9200/movie/adventure/_search?from=1&size=5

當(dāng)不指定 from 和 size 時,會使用默認(rèn)值,其中 from 的默認(rèn)值是 0,size 的默認(rèn)值是 10。

檢索某些字段

有時候,我們只需檢索文檔的個別字段,這時可以使用 _source 參數(shù),多個字段可以使用逗號分隔,如下所示:

$ http :9200/movie/adventure/1?_source=name $ http :9200/movie/adventure/1?_source=name,actors

query string 搜索

query string 搜索以 q=field:value 的形式進(jìn)行查詢,比如查詢 name 字段含有 life 的電影:

$ http :9200/movie/adventure/_search?q=name:life

DSL 搜索

上面的 query string 搜索比較輕量級,只適用于簡單的場合。Elasticsearch 提供了更為強(qiáng)大的 DSL(Domain Specific Language)查詢語言,適用于復(fù)雜的搜索場景,比如全文搜索。我們可以將上面的 query string 搜索轉(zhuǎn)換為 DSL 搜索,如下:

GET /movie/adventure/_search {"query" : {"match" : {"name" : "life"}} }

如果使用 httpie,可以這樣:

$ echo '{"query": {"match": {"name": "life"}}}' | http get :9200/movie/adventure/_search

如果使用 curl,可以這樣:

$ curl -X GET "127.0.0.1:9200/movie/adventure/_search" -d '{"query": {"match": {"name": "life"}}}'

文檔是否存在

使用 HEAD 方法查看文檔是否存在:

$ http head :9200/movie/adventure/1

如果文檔存在則返回 200,否則返回 404。

刪除文檔

使用 DELETE 方法刪除文檔:

$ http delete :9200/movie/adventure/1

小結(jié)

  • Elasticsearch 通過簡單的 RESTful API 來隱藏 Lucene 的復(fù)雜性,從而讓全文搜索變得簡單

  • 在創(chuàng)建文檔時,我們可以用 POST 方法指定將文檔添加到某個 _index/_type 下,來讓 Elasticsearch自動生成唯一的 _id;而用 PUT 方法指定將文檔的 _index/_type/_id

本文由 funhacks 發(fā)表于個人博客,采用 Creative Commons BY-NC-ND 4.0(自由轉(zhuǎn)載-保持署名-非商用-禁止演繹)協(xié)議發(fā)布。
非商業(yè)轉(zhuǎn)載請注明作者及出處。商業(yè)轉(zhuǎn)載請聯(lián)系作者本人。
本文標(biāo)題為: Elasticsearch 簡介
本文鏈接為: http://funhacks.net/2017/03/2...

參考資料

  • Elasticsearch Reference

  • Elasticsearch 權(quán)威指南

總結(jié)

以上是生活随笔為你收集整理的Elasticsearch 简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。