ElasticSearch學習筆記

本文是對ElasticSearch組件初步學習的一個知識總結(jié)像樊,包括如下章節(jié)的內(nèi)容:

  • 概述
  • 快速上手
  • 邏輯概念
  • 用戶接口
  • 關(guān)于ELKB

預備知識:

1、本文對ElasticSerach的介紹會涉及與關(guān)系數(shù)據(jù)庫的對比,為了更好地學習,可提前對關(guān)系數(shù)據(jù)庫的基本概念有所了解揉燃。
2、ElasticSerach的數(shù)據(jù)存儲采用JSON的數(shù)據(jù)格式筋栋,為了更好地學習炊汤,可提前對JSON的概念有所了解。
3弊攘、ElasticSerach對外提供的是RESTful Api訪問接口抢腐,為了更好地學習,可提前對RESTful的概念有所了解襟交。

一迈倍、概述

ElasticSerach(下面簡稱ES)是一個基于Lucene(一個開源全文搜索引擎)構(gòu)建的開源、分布式可擴展的實時搜索和分析引擎捣域。它還可以作為一個分布式實時文件存儲系統(tǒng)啼染。
ES是目前全文搜索引擎的首選,它可以快速地儲存竟宋、搜索和分析海量數(shù)據(jù)提完。維基百科、Stack Overflow丘侠、Github 等系統(tǒng)都采用它徒欣。
ES采用java語言開發(fā),對外提供了 RESTful API 的操作接口蜗字,開箱即用打肝。

Elasticsearch 于2010年提交到 GitHub。其版本發(fā)布情況如下:
1挪捕、2010年2月8日推出了 V0.4.0 的發(fā)行版本粗梭,2010年2月12日推出 V1.0.0 版本,2016年2月2日推出 V1.7.5 版本级零, 此為 1.X 最終版本断医,不再更新。
2奏纪、2015年10月28日推出 V2.0.0 版本鉴嗤,2017年7月25日推出 V2.4.6 版本,此為 2.X 最終版本序调,不再更新醉锅。
3、2016年10月26日推出 V5.0.0 版本发绢,2018年2月20日推出 V5.6.8 版本硬耍,此并不是 5.X 的最終版本垄琐,還在更新中……
4、2017年11月14日推出 V6.0.0 版本经柴,2018年2月20日推出 V6.2.2 版本狸窘。
……

下一個版本是7.x,已經(jīng)有測試版可以下載坯认。

本文示例所有的版本是elasticsearch-5.6.9朦前。

二、快速上手

ES雖然是一個強大的分布式系統(tǒng)鹃操,但其易用性設(shè)計的非常好,安裝和使用都很簡單春哨,下面我們來快速體驗下荆隘。

(一)安裝

ES需要java環(huán)境,最好是java8赴背,需要設(shè)置JAVA_HOME環(huán)境變量椰拒。ES的安裝非常簡單,開箱即用凰荚,首先我們可以從官網(wǎng)www.elastic.co下載相應(yīng)的二進制版本燃观,對于Windows操作系統(tǒng),可下載zip文件,對于linux操作系統(tǒng)便瑟,可下載tar文件缆毁。

下載二進制包后,解壓到任何一個目錄下到涂。如果不做任何配置脊框,則采用默認的配置啟動ES。運行ES安裝目錄下的bin目錄的elasticsearch腳本(windows下為elasticsearch.bat)則可以以單實例的方式啟動ES践啄。在linux系統(tǒng)中啟動ES有可能會報錯誤浇雹,這在下面會詳細介紹。

我們這里是啟動的ES的單個實例屿讽,ES可以以集群的方式運行(即在多臺機器上啟動多個ES實例)昭灵。因為單節(jié)點模式和集群模式從使用角度看并沒有太多的區(qū)別,所以本文介紹的都是基于ES在單節(jié)點方式運行的伐谈。集群的方式在后續(xù)的文章中介紹烂完。

啟動ES后,下面就可以利用ES提供的RESTful API去使用它衩婚。我們可以在瀏覽器或任何web工具中輸入 http://localhost:9200 地址窜护,得到如下的信息(ES系統(tǒng)的基本信息):

{
  "name" : "H12K5tk",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "2RAwSskjQh6xDxLrDHBTtQ",
  "version" : {
    "number" : "5.6.9",
    "build_hash" : "877a590",
    "build_date" : "2018-04-12T16:25:14.838Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.1"
  },
  "tagline" : "You Know, for Search"
}

返回的是本節(jié)點(ES實例的)name,以及ES集群的一些基本信息非春,如集群名柱徙,版本信息等缓屠。

(二)啟動錯誤

在Linux系統(tǒng)中啟動ES,可能會報一些錯誤护侮,導致啟動失敗敌完。下面是一些常見的錯誤與解決方案(這也是本文在Centos7系統(tǒng)中啟動ES碰到的問題)。

1羊初、錯誤1:max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
錯誤很好理解滨溉,就是指es進程可允許打開的最大文件數(shù)只有4096,太小了长赞,需要提升到65536晦攒。因為ES需要打開很多文件,最大4096個不夠得哆,需要調(diào)整操作系統(tǒng)中的配置脯颜。
在Linux的系統(tǒng)中對于進程(Process)會有一些限制(limit),限制有很多種贩据,常見的如對打開文件(Open Files)最大數(shù)量的限制栋操。在linux中這些限制是分為軟限制(soft limit)和硬限制(hard limit)兩類。它們的區(qū)別就是軟限制可以在程序的進程中自行改變(突破限制)饱亮,而硬限制則不行(除非程序進程有root權(quán)限)矾芙。
使用ulimit 命令可以分別查看軟限制和硬限制,區(qū)別是在查看的參數(shù)前加 S 或 H近上。例如剔宪,查看打開文件數(shù)限制(參數(shù)是n):

#查看軟限制
ulimit -Sn
#查看硬限制
ulimit -Hn

改變這個限制的辦法是修改/etc/security/limits.conf文件,增加配置壹无,如在配置文件中增加如下信息:

*     soft    nofile    65536
*     hard    nofile   65536

注意歼跟,最前面的 * 代表這個設(shè)置對所有進程都有效,如果只對指定進程有效格遭,將*改為具體的進程名哈街。

2、錯誤2:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
這個錯誤是指Linux進程的vma大小不足拒迅,需要提高骚秦。這可以修改/etc/sysctl.conf文件,增加配置vm.max_map_count=262144璧微,如:

vm.max_map_count=262144

修改配置文件后作箍,執(zhí)行 命令sysctl -p 讓生效(注意,一定要執(zhí)行)前硫,如:

[hadoop@master bin]$ sudo sysctl -p
[sudo] password for hadoop:
vm.max_map_count = 262144

另外胞得,在操作系統(tǒng)配置文件被修改后,最好重新登錄屹电,確保新的終端能獲取到修改后的信息阶剑。

(三)訪問ES

因為ES對外提供了RESTful的訪問接口跃巡,所以我們可以用任意一種web client工具來訪問ES,最簡單的如linux下的curl程序牧愁,還可以用如Postman這樣的工具(Postman是一個非常有用的 Http Client 工具素邪,可用來測試 Web 服務(wù)),也可以在瀏覽器上安裝插件,如chrome中的Sense插件(該插件可以很方便的操作ES)猪半。

當然我們可以利用第三方http client庫自己編寫代碼來訪問ES兔朦。不過ES自身也提供了JAVA API來操作ES,這個在后面介紹磨确。

下面我們使用RESTful API來舉例使用ES沽甥。一個完整的REST請求包括如下三部分:
1、操作類型乏奥,如GET,PUT,POST,DELETE等
2安接、URL部分,如http://localhost:9200/blogs/blog/1
3英融、請求正文內(nèi)容。對于GET請求歇式,沒有單獨的請求正文內(nèi)容驶悟,請求信息都包含在URL中。對于PUT,POST等操作材失,可以帶正文內(nèi)容痕鳍,正文內(nèi)容采用josn的格式,具體下面例子會看到龙巨。

ES的REST請求的返回內(nèi)容的格式絕大部分都是JOSN格式的笼呆。也就是說請求和響應(yīng)的內(nèi)容都是JSON格式,這樣有較好的一致性旨别。

下面來看具體的例子:

1诗赌、插入數(shù)據(jù)
往ES中插入數(shù)據(jù),可以執(zhí)行如下的操作:

PUT  http://localhost:9200/blogs/blog/1
{
    "title": "es info",
    "content": "about elasticsearch",
    "author": "jack",
    "year":2018
}

這里執(zhí)行的是http的PUT操作秸弛,url后面跟著的json格式內(nèi)容是請求的正文铭若,即保存到ES中的數(shù)據(jù)。關(guān)于該url和json內(nèi)容的含義我們在后面介紹递览,這里只需知道這樣一個簡單的http的PUT請求就把一條json數(shù)據(jù)保存到ES中叼屠。上述操作我們可以在如Postman這樣的工具中進行。
該請求成功后服務(wù)器返回的信息如下:

{
  "_index": "blogs",
  "_type": "blog",
  "_id": "1",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": true
}

上面響應(yīng)信息的格式也是josn格式绞铃,其中字段的含義我們后面再介紹镜雨。

2、查詢數(shù)據(jù)
上面往ES中插入了一條數(shù)據(jù)儿捧,下面我們可以利用http的GET操作來獲取剛才插入的數(shù)據(jù)荚坞。http請求如下:

GET  http://localhost:9200/blogs/blog/1

該請求成功后服務(wù)器返回的信息如下:

{
  "_index": "blogs",
  "_type": "blog",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {
    "title": "es info",
    "content": "about elasticsearch",
    "author": "jack",
    "year": 2018
  }
}

3挑宠、修改數(shù)據(jù)
當文檔已經(jīng)存在時,如果要修改文檔的內(nèi)容西剥,可執(zhí)行與插入數(shù)據(jù)一樣的PUT操作痹栖,如:

PUT  http://localhost:9200/blogs/blog/1
{
    "title": "es info",
    "content": "about elasticsearch",
    "author": "tom",
    "year":2018
}

該請求成功后服務(wù)器返回的信息如下:

{
  "_index": "blogs",
  "_type": "blog",
  "_id": "1",
  "_version": 2,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": false
}

可以看出,返回的josn內(nèi)容中瞭空,相比插入操作揪阿,有這幾個字段的內(nèi)容發(fā)生了變化:

"_version" : 2,
"result" : "updated",
"created" : false

可以看到,記錄的 Id 沒變咆畏,但是版本(version)從1變成2南捂,操作類型(result)從created變成updated,created字段變成false旧找,因為這次不是新建記錄溺健,而是修改操作。

這時如果我們執(zhí)行

GET  http://localhost:9200/blogs/blog/1

查詢操作钮蛛,會看到返回的Document數(shù)據(jù)是修改后的數(shù)據(jù)鞭缭。

ES文檔的版本號是有用的,我們在修改數(shù)據(jù)時魏颓,可以傳入一個版本號岭辣。這樣當在一個客戶端讀取和更新文檔的間隔中,有另外客戶端更新了數(shù)據(jù)甸饱。如果這個客戶端的更新操作傳入了版本號(前面讀取的版本號)沦童,這時因為傳入的版本號和當期實際的版本號不一致,就會操作失敗叹话。這樣就防止可能的數(shù)據(jù)沖突偷遗。這也是ES采用樂觀并發(fā)控制(OCC)機制的體現(xiàn)。

加入版本號進行更新驼壶,只需在url后面加上version參數(shù)氏豌,如:

PUT http://localhost:9200/blogs/blog/1?version=2

4、刪除操作
通過DELETE操作热凹,可以刪除ES中的數(shù)據(jù)箩溃。HTTP請求如下:

DELETE  http://localhost:9200/blogs/blog/1

該請求成功后服務(wù)器返回的信息如下:

{
  "found": true,
  "_index": "blogs",
  "_type": "blog",
  "_id": "1",
  "_version": 2,
  "result": "deleted",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  }
}

如果我們這時去執(zhí)行GET操作,如

GET http://localhost:9200/blogs/blog/1

該請求成功后服務(wù)器返回的信息如下:

{
  "_index": "blogs",
  "_type": "blog",
  "_id": "1",
  "found": false
}

從響應(yīng)的結(jié)果可以看出碌嘀,沒有查到數(shù)據(jù)涣旨。

5、搜索操作
下面我們來看下ES最強大的搜索操作股冗,首先我們來先插入2條數(shù)據(jù)霹陡,包括前面插入和被刪除的數(shù)據(jù)。

PUT  http://localhost:9200/blogs/blog/1
{
    "title": "es info",
    "content": "about elasticsearch",
    "author": "jack",
    "year":2018
}

PUT  http://localhost:9200/blogs/blog/2
{
    "title": "zk info",
    "content": "about zookeeper",
    "author": "jack",
    "year":2018
}

下面我們來執(zhí)行根據(jù)給定的字符串進行查找,只要數(shù)據(jù)中有包含給定字符串的內(nèi)容就認為匹配上烹棉,查詢命令如下:

POST http://localhost:9200/_search
{
    "query": {
        "query_string": {
            "query": "elasticsearch"
        }
    }
}

返回的結(jié)果如下:

{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 10,
    "successful": 10,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.26742277,
    "hits": [
      {
        "_index": "blogs",
        "_type": "blog",
        "_id": "1",
        "_score": 0.26742277,
        "_source": {
          "title": "es info",
          "content": "about elasticsearch",
          "author": "jack",
          "year": 2018
        }
      }
    ]
  }
}

可以看出攒霹,搜索到了數(shù)據(jù)。我們可以試著改變上面查詢條件中"query"參數(shù)的值浆洗,來觀察結(jié)果的變化催束。

上面的搜索是搜索整個json數(shù)據(jù)中的信息,我們也可以只搜索指定json字段中的內(nèi)容伏社。如:

POST http://localhost:9200/_search
{
    "query": {
        "query_string": {
            "query": "jack",
            "fields": ["author"]
        }
    }
}

上面的REST語句表示只在字段author中查找存在jack字符串的數(shù)據(jù)抠刺。字段通過查詢條件中的filelds參數(shù)指定,可以看出摘昌,同時可指定多個字段速妖。 對比關(guān)系數(shù)據(jù)庫,ES的搜索操作有點類似關(guān)系數(shù)據(jù)庫中帶like子句的select語句聪黎。

可以看出罕容,利用ES的RESTful Api進行操作還是比較簡單的,當然我們只是列舉了幾個最基本的操作稿饰。上面通過舉例讓我們站在用戶的角度對ES有了個初步的認識锦秒,下面章節(jié)繼續(xù)展開更為詳細的介紹。

(四)遠程訪問

上面例子中我們都是在本地利用REST接口訪問ES的喉镰,即web客戶端運行在ES實例所在的機器上旅择,所以url中用的是localhost。 如果需要支持對ES的遠程訪問梧喷,可以修改ES安裝目錄的config/elasticsearch.yml文件,去掉network.host的注釋脖咐,將它的值改成0.0.0.0铺敌,然后重新啟動 ES。配置文件中信息如:

network.host: 0.0.0.0

上面配置屁擅,設(shè)成0.0.0.0讓任何一臺機器都可以訪問偿凭。線上服務(wù)不要這樣設(shè)置,要設(shè)成具體的 IP派歌,如:

network.host: 192.168.0.1

三弯囊、邏輯概念

我們上面的例子使用了 http://localhost:9200/blogs/blog/1 這樣的ulr來進行數(shù)據(jù)的插入、查詢及搜索和刪除操作胶果。拋開操作的方式匾嘱,感覺和關(guān)系數(shù)據(jù)庫的操作有類似的地方。這其實也是正常的早抠,因為數(shù)據(jù)庫也是用來進行數(shù)據(jù)存儲和分析(查找)的霎烙,所以從功能上說肯定有很多類似的地方。我們知道關(guān)系數(shù)據(jù)庫有數(shù)據(jù)庫、表悬垃、記錄游昼、字段等概念,為了更好地理解ES的邏輯架構(gòu)尝蠕,我們在介紹ES的一些重要概念的時候會對比關(guān)系數(shù)據(jù)庫中的一些概念烘豌。

(一)索引(Index)

ES數(shù)據(jù)管理的頂層單位就叫做 Index(索引)。它不是關(guān)系數(shù)據(jù)庫中索引的概念看彼,是單個數(shù)據(jù)庫的同義詞廊佩,即可以把它等價于關(guān)系數(shù)據(jù)庫中的單個數(shù)據(jù)庫。Index的名稱必須小寫闲昭。

既然Index是ES管理數(shù)據(jù)的頂層單位罐寨,肯定先需要有索引,才能進行后續(xù)的數(shù)據(jù)存儲等操作序矩,類似關(guān)系數(shù)據(jù)庫中得首先有數(shù)據(jù)庫一樣鸯绿。可前面的操作我們并沒有看到創(chuàng)建Index的操作簸淀。是不是ES啟動后有一個默認的Index呢瓶蝴?

其實情況是這樣的,上面的REST請求 http://localhost:9200/blogs/blog/1 中的 blogs就是一個索引名租幕,當我們執(zhí)行數(shù)據(jù)插入操作時舷手,如果url中指定的索引不存在,則ES會自動創(chuàng)建該索引劲绪。就如我們前面的例子男窟,我們插入數(shù)據(jù)時,索引blogs并不存在贾富,所以ES按照默認的設(shè)置自動創(chuàng)建了blogs索引歉眷。

我們可以單獨創(chuàng)建一個索引,操作如下:

PUT  http://localhost:9200/topics

上面操作通過http的PUT操作颤枪,創(chuàng)建了一個名稱為topics的索引汗捡。
操作成功后的響應(yīng)信息如下:

{
  "acknowledged": true,
  "shards_acknowledged": true,
  "index": "topics"
}

我們可以查看到ES中的所有索引,操作如下:

GET  http://localhost:9200/_cat/indices?v

響應(yīng)結(jié)果如下:

health  status  index  uuid  pri  rep  docs.count  docs.deleted  store.size   pri.store.size
yellow  open   blogs  hM...  5    1      2          0         10.2kb      10.2kb
yellow  open   topics  hV...  5    1      0          0         810b        810b

結(jié)果以表格的形式顯示畏纲,第一行為表頭扇住。因為前面的操作我們已經(jīng)創(chuàng)建了blogs索引,加上剛創(chuàng)建的topics索引盗胀,所以我們看到結(jié)果有2條記錄艘蹋。

通過DELETE操作,我們可以刪除指定的索引票灰,如下面操作:

DELETE  http://localhost:9200/topics

操作成功的響應(yīng)結(jié)果如下:

{
  "acknowledged": true
}

這表示刪除索引成功簿训,如果我們這時再去查找所有索引咱娶,會發(fā)現(xiàn)topics索引沒有了。

(二)類型(Type)

在索引中强品,可以定義一個或多個類型(type)膘侮,類型是索引的邏輯分區(qū),是同一索引中有公共字段的文檔的集合的榛。比如在一個博客系統(tǒng)中琼了,我們可以將用戶數(shù)據(jù)放到一種類型中,將文章數(shù)據(jù)放到一種類型中夫晌,將對文章的評論信息放到一種類型中雕薪。

類型不需要單獨創(chuàng)建,在插入數(shù)據(jù)(如上面的例子)會自動創(chuàng)建晓淀。對于 http://localhost:9200/blogs/blog/1 這個url所袁,其中的blog就是類型(type)名。

相對關(guān)系數(shù)據(jù)庫來說凶掰,類型可以類比成關(guān)系數(shù)據(jù)庫中的表燥爷。
需要注意的是,根據(jù)規(guī)劃懦窘,Elastic 6.x 版只允許每個 Index 包含一個 Type前翎,7.x 版將會徹底移除 Type。

所以我們在實際使用中畅涂,不用過多考慮Type的作用港华。

(三)文檔(Document)

Document是Index中的單條記錄,它就像關(guān)系數(shù)據(jù)庫中表中的記錄(行)午衰。Document 使用 JSON 格式表示立宜,如上面插入數(shù)據(jù)時的url后面跟的請求數(shù)據(jù):

PUT http://localhost:9200/blogs/blog/1
{
    "title": "es info",
    "content": "about elasticsearch",
    "author": "jack",
    "year":2018
}

ES的每個存儲在Index中的Document都有一個類型(type)和一個唯一的ID。這個ID可以用戶在創(chuàng)建文檔時顯示指定臊岸,如上面url最后的1,也可以由ES自動生成(后面會介紹)橙数。

JSON數(shù)據(jù)是一種半結(jié)構(gòu)化的數(shù)據(jù)格式,它由一個個的字段組成扇单,字段有字段名商模、字段的值奠旺,和字段類型蜘澜,比如上面的title字段就是一個字符串類型,year字段就是一個整數(shù)類型响疚。JSON數(shù)據(jù)的字段類型不需要顯示定義鄙信,由字段的內(nèi)容推斷出來,比如字符串是要放到引號中忿晕,整數(shù)則不能装诡。

同一個 Index 里面的 Document(即使是位于同一個Type下),不要求有相同的結(jié)構(gòu)(即相同的字段和字段類型),但是最好保持相同鸦采,這樣有利于提高搜索效率宾巍。需要注意的是,同一個字段名的字段渔伯,不能在這個文檔中是字符串類型顶霞,而在另外一個字符串中是數(shù)組類型。舉個例子锣吼,上面舉例中我們插入了如下的數(shù)據(jù):

PUT http://localhost:9200/blogs/blog/1
{
    "title": "es info",
    "content": "about elasticsearch",
    "author": "jack",
    "year":2018
}

這時如果插入如下數(shù)據(jù):

PUT http://localhost:9200/blogs/blog/2
{
    "title": "es info",
    "content": "about elasticsearch",
    "author": "jack",
    "year": "2018年"
}

也就是這里插入的year字段值是個字符串选浑,則時ES的響應(yīng)就會報錯,報類型不一致的錯誤玄叠,因為前面插入的數(shù)據(jù)已經(jīng)讓ES把year字段認作為整型數(shù)據(jù)古徒。但如果我們寫成 "year": "2018" 這樣的格式,雖然看上去year字段是字符串類型读恃,但因為實際數(shù)據(jù)是整數(shù)隧膘,則不會報錯。

因為即使是同一個Type下的Docuemnt也不要求有相同的數(shù)據(jù)模型狐粱,所以邏輯上Type與關(guān)系數(shù)據(jù)庫的表對應(yīng)舀寓,實際意義差別還是挺大的。在關(guān)系數(shù)據(jù)庫下肌蜻,表中的每條記錄數(shù)據(jù)模型都是嚴格相同的互墓。

(四)字段(Field)

上面已經(jīng)提到了字段,字段就是Docuemnt對應(yīng)的json內(nèi)容的字段蒋搜。一個Docuemnt可以包括零個或多個字段篡撵,字段可以是一個簡單的值(如字符串、整數(shù)豆挽、日期)育谬,也可以是一個數(shù)組或?qū)ο蟮那短捉Y(jié)構(gòu)。每個字段都對應(yīng)一個數(shù)據(jù)類型,如整數(shù)仓犬、字符串盈蛮、數(shù)組、對象等咖刃。

(五)映射(mapping)

mapping是類似于數(shù)據(jù)庫中的表結(jié)構(gòu)定義,主要作用如下:

  • 定義index下的字段名
  • 定義字段類型憾筏,比如數(shù)值型嚎杨、浮點型、布爾型等
  • 定義倒排索引相關(guān)的設(shè)置氧腰,比如是否索引枫浙、記錄position等刨肃。
  • 設(shè)置分詞器等

與表結(jié)構(gòu)不同的是,關(guān)系數(shù)據(jù)庫的表的結(jié)構(gòu)必須事先通過create table語句來明確箩帚。而映射既可以顯示的通過命令來事先定義真友,也可以在存儲文檔(插入數(shù)據(jù))時由ES來自動識別。如我們上面的例子紧帕,并沒有顯示的去定義Index的mapping信息锻狗。

可以通過 GET http://localhost:9200/_mapping 來查看Index的mapping信息。

(六)主鍵(ID)

ES中的每個Document都有一個唯一的ID(在type下唯一)焕参,也就是說 index/type/id必須是唯一的轻纪。
我們可以插入數(shù)據(jù)時顯示的指定ID,如前面的操作:

PUT  http://localhost:9200/blogs/blog/1

也可以也ES系統(tǒng)自動生成叠纷,注意這時就不能用PUT操作刻帚,要用POST操作,如下面操作:

POST  http://localhost:9200/blogs/blog
{
    "title": "es info",
    "content": "about elasticsearch",
    "author": "jack",
    "year":"2018"
}

上面請求中url的最后沒有指定要插入的Document的ID涩嚣,操作成功后的響應(yīng)信息如下:

{
  "_index": "blogs",
  "_type": "blog",
  "_id": "AWeXZiyTS_34KbUEtT3A",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": true
}

可以看出崇众,響應(yīng)信息中帶回來了ES自動生成的ID值。

(七)與關(guān)系數(shù)據(jù)庫對比

為了更好的理解ES的一些概念航厚,結(jié)合上面的介紹顷歌,下表將ES中的一些概念與關(guān)系數(shù)據(jù)庫(如MYSQL)中的一些概念做了對比。

ElasticSerach Mysql
Index Database
Type Table
Document Row
Field Column
Mapping Schema
Everything is indexed Index(表的索引)
ID Primary Key
Query DSL SQL
PUT/POST http://.... insert into ....
GET http://.... select * from ...
POST http://... (搜索操作) selcct * from... like ...
PUT http://.... update .....
DELETE http://.... delete from...

四幔睬、用戶接口

ES提供了多種客戶端(API)方式來讓用戶操作ES眯漩,下面我們來分別做下概要的介紹。

(一)監(jiān)聽端口信息

ES實例啟動后麻顶,默認會啟動兩個監(jiān)聽端口赦抖,默認端口號分別是9200和9300。在windows下辅肾,可以用 netstat -an | findstr "LISTENING" 命令去顯示當前系統(tǒng)所有正在監(jiān)聽的端口队萤。在linux下,可用執(zhí)行命令netstat -nlp來查看矫钓,另外可以執(zhí)行命令netstat -nlp|grep :9200 查看監(jiān)聽指定端口的進程信息要尔。

其中9200是為http服務(wù)所提供的端口,我們上面所有例子的REST請求中都帶了9200這個值新娜。

其中9300是ES集群中各個節(jié)點相互通訊使用赵辕,節(jié)點之間的交互采用其原生的傳輸 協(xié)議(基于TCP協(xié)議)。

(二)RESTful API

ES對外提供了RESTful API杯活,這是基于http的匆帚。所以熬词,包含java在內(nèi)的旁钧,所有其他編程語言都可以使用 RESTful API 接口編寫自己的web客戶端程序通過端口 9200 和 Elasticsearch 進行通信吸重。你可以用你喜愛的一些現(xiàn)成的 web 客戶端工具訪問 Elasticsearch,如curl工具歪今,Postman工具等嚎幸。

(三)Java REST API

ES提供了兩個Java RESTful client版本,分別是:

1寄猩、低級別的Rest Api(Java Low Level REST Client)
用戶需要自己編寫代碼來處理請求JSON串嫉晶,以及解析響應(yīng)JSON串。這類Api的好處是兼容所有的ES版本田篇。該API是從ES5.0開始提供的替废。

2、高級別的Rest Api(Java High Level REST Client)
基于低級別的Api泊柬,增加了編寫請求JSON串椎镣、解析響應(yīng)JSON串等相關(guān)Api,目的是以java面向?qū)ο蟮姆绞絹磉M行請求和響應(yīng)的處理兽赁。這類Api要求使用的版本與ES服務(wù)端版本保持一致状答。

Java High Level REST Client是在ES6.0版本才開始提供的。

(四)非Java REST API

Elasticsearch 為以下語言提供了官的REST Api --Groovy刀崖、JavaScript惊科、.NET、 PHP亮钦、 Perl馆截、 Python 和 Ruby。

(五)Java API for傳輸協(xié)議(不推薦使用)

上面提到蜂莉,ES的實例(節(jié)點)之間通訊采用原生的傳輸 協(xié)議(基于TCP協(xié)議)孙咪,默認的端口是9300。ES提供了基于傳輸協(xié)議的Java Api來訪問ES巡语,有兩種Api:

一種稱為節(jié)點客戶端(Node client)翎蹈,這種api編寫的java程序會以集群中的一個節(jié)點(不保存數(shù)據(jù)的節(jié)點)加入到集群中,因集群對它是感知的男公,它的運行可能會對集群造成影響荤堪。

另一種稱為傳輸客戶端(Transport client),這種api編寫的程序以遠程連接的方式連接到ES集群枢赔,不會加入到集群澄阳,類似傳統(tǒng)的C/S架構(gòu)。

這兩種Api編寫的Java客戶端都是通過 9300 端口并使用Elasticsearch 的原生傳輸 協(xié)議和集群交互踏拜。
需要說明的是碎赢,Node client方式從ES5.0版本開始就不再支持。Transport client也不推薦使用速梗。

ES官方推薦用戶使用REST API來操作ES肮塞。

五襟齿、關(guān)于ELKB

先說下ELK,ELK是一個流行的日志系統(tǒng)解決方案枕赵,注意猜欺,ELK不是一個軟件名,而是一個解決方案的縮寫拷窜,即Elasticsearch+Logstash+Kibana(ELK Stack)這三個軟件的集合开皿。

這幾個都是開源的java產(chǎn)品,但是眾所周知篮昧,java的東西很吃內(nèi)存和CPU赋荆,Logstash在作為收集日志的Agent時,就顯得太過臃腫了懊昨。后來官方在logstash-forwarder的基礎(chǔ)上推出了beat系列糠睡,里面包括四個系統(tǒng),分別是:

1疚颊、Packetbeat(搜集網(wǎng)絡(luò)流量數(shù)據(jù))狈孔;
2、Topbeat(搜集系統(tǒng)材义、進程和文件系統(tǒng)級別的 CPU 和內(nèi)存使用情況等數(shù)據(jù))均抽;
3、Filebeat(搜集文件數(shù)據(jù))其掂,F(xiàn)ilebeat占用資源少油挥,適合于在各個服務(wù)器上搜集日志后傳輸給Logstash;
4款熬、Winlogbeat(搜集 Windows 事件日志數(shù)據(jù))深寥。

所以Filebeat也就這樣加入了“日志收集分析”的團隊里,所以雖然大家還是習慣性的叫ELK贤牛,其實準確的說法已經(jīng)是ELKB了惋鹅。

ELKB中的幾個軟件的分工如下:

1、Elasticsearch:分布式搜索和分析引擎殉簸,具有高可伸縮闰集、高可靠和易管理等特點“惚埃基于 Apache Lucene 構(gòu)建武鲁,能對大容量的數(shù)據(jù)進行接近實時的存儲、搜索和分析操作蝠检。通常被用作某些應(yīng)用的基礎(chǔ)搜索引擎沐鼠,使其具有復雜的搜索功能。

2、Logstash:數(shù)據(jù)收集額外處理和數(shù)據(jù)引擎饲梭。它支持動態(tài)的從各種數(shù)據(jù)源搜集數(shù)據(jù)乘盖,并對數(shù)據(jù)進行過濾、分析排拷、豐富、統(tǒng)一格式等操作锅尘,然后存儲到用戶指定的位置监氢。

3、Kibana:數(shù)據(jù)分析和可視化平臺藤违。通常與 Elasticsearch 配合使用浪腐,對其中數(shù)據(jù)進行搜索、分析和以統(tǒng)計圖表的方式展示顿乒。

4议街、Filebeat:ELK 協(xié)議棧的新成員,在需要采集日志數(shù)據(jù)的服務(wù)器上安裝 Filebeat璧榄,并指定日志目錄或日志文件后特漩,F(xiàn)ilebeat 就能讀取數(shù)據(jù),迅速發(fā)送到 Logstash 進行解析骨杂,亦或直接發(fā)送到 Elasticsearch 進行集中式存儲和分析涂身。

本文只是對ELKB的基本概念做個介紹,關(guān)于LKB這幾個軟件的詳細信息及ELKB四個軟件之間如何配合來解決日志問題本文不做介紹搓蚪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛤售,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子妒潭,更是在濱河造成了極大的恐慌悴能,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雳灾,死亡現(xiàn)場離奇詭異漠酿,居然都是意外死亡,警方通過查閱死者的電腦和手機谎亩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門记靡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人团驱,你說我怎么就攤上這事摸吠。” “怎么了嚎花?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵寸痢,是天一觀的道長。 經(jīng)常有香客問我紊选,道長啼止,這世上最難降的妖魔是什么道逗? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮献烦,結(jié)果婚禮上滓窍,老公的妹妹穿的比我還像新娘。我一直安慰自己巩那,他們只是感情好吏夯,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著即横,像睡著了一般噪生。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上东囚,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天跺嗽,我揣著相機與錄音,去河邊找鬼页藻。 笑死桨嫁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的份帐。 我是一名探鬼主播瞧甩,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弥鹦!你這毒婦竟也來了肚逸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤彬坏,失蹤者是張志新(化名)和其女友劉穎朦促,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栓始,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡务冕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了幻赚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片禀忆。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖落恼,靈堂內(nèi)的尸體忽然破棺而出箩退,到底是詐尸還是另有隱情,我是刑警寧澤佳谦,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布戴涝,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏啥刻。R本人自食惡果不足惜奸鸯,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望可帽。 院中可真熱鬧娄涩,春花似錦、人聲如沸映跟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽申窘。三九已至弯蚜,卻和暖如春孔轴,著一層夾襖步出監(jiān)牢的瞬間剃法,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工路鹰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贷洲,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓晋柱,卻偏偏與公主長得像优构,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子雁竞,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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