elasticsearch java对象 驼峰原则_Elasticsearch简介与实战
什么是Elasticsearch?
??Elasticsearch是一個(gè)開源的分布式、RESTful 風(fēng)格的搜索和數(shù)據(jù)分析引擎,它的底層是開源庫(kù)Apache Lucene。
??Lucene 可以說是當(dāng)下最先進(jìn)、高性能、全功能的搜索引擎庫(kù)——無論是開源還是私有,但它也僅僅只是一個(gè)庫(kù)。為了充分發(fā)揮其功能,你需要使用 Java 并將 Lucene 直接集成到應(yīng)用程序中。 更糟糕的是,您可能需要獲得信息檢索學(xué)位才能了解其工作原理,因?yàn)長(zhǎng)ucene 非常復(fù)雜。
??為了解決Lucene使用時(shí)的繁復(fù)性,于是Elasticsearch便應(yīng)運(yùn)而生。它使用 Java 編寫,內(nèi)部采用 Lucene 做索引與搜索,但是它的目標(biāo)是使全文檢索變得更簡(jiǎn)單,簡(jiǎn)單來說,就是對(duì)Lucene 做了一層封裝,它提供了一套簡(jiǎn)單一致的 RESTful API 來幫助我們實(shí)現(xiàn)存儲(chǔ)和檢索。
??當(dāng)然,Elasticsearch 不僅僅是 Lucene,并且也不僅僅只是一個(gè)全文搜索引擎。 它可以被下面這樣準(zhǔn)確地形容:
- 一個(gè)分布式的實(shí)時(shí)文檔存儲(chǔ),每個(gè)字段可以被索引與搜索;
- 一個(gè)分布式實(shí)時(shí)分析搜索引擎;
- 能勝任上百個(gè)服務(wù)節(jié)點(diǎn)的擴(kuò)展,并支持 PB 級(jí)別的結(jié)構(gòu)化或者非結(jié)構(gòu)化數(shù)據(jù)。
由于Elasticsearch的功能強(qiáng)大和使用簡(jiǎn)單,維基百科、衛(wèi)報(bào)、Stack Overflow、GitHub等都紛紛采用它來做搜索。現(xiàn)在,Elasticsearch已成為全文搜索領(lǐng)域的主流軟件之一。
??下面將介紹Elasticsearch的安裝與簡(jiǎn)單使用。
安裝并運(yùn)行Elasticsearch
??安裝 Elasticsearch 之前,你需要先安裝一個(gè)較新版本的 Java,最好的選擇是,你可以從 www.java.com 獲得官方提供的最新版本的Java。
??你可以從 elastic 的官網(wǎng) elastic.co/downloads/elasticsearch 獲取最新版本的Elasticsearch。解壓文檔后,按照下面的操作,即可在前臺(tái)(foregroud)啟動(dòng) Elasticsearch:
此時(shí),Elasticsearch運(yùn)行在本地的9200端口,在瀏覽器中輸入網(wǎng)址“http://localhost:9200/”,如果看到以下信息就說明你的電腦已成功安裝Elasticsearch:
{ "name" : "YTK8L4q", "cluster_name" : "elasticsearch", "cluster_uuid" : "hB2CZPlvSJavhJxx85fUqQ", "version" : { "number" : "6.5.4", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "d2ef93d", "build_date" : "2018-12-17T21:17:40.758843Z", "build_snapshot" : false, "lucene_version" : "7.5.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search"}在這里,我們安裝的Elasticsearch版本號(hào)為6.5.4。
??Kibana 是一個(gè)開源的分析和可視化平臺(tái),旨在與 Elasticsearch 合作。Kibana 提供搜索、查看和與存儲(chǔ)在 Elasticsearch 索引中的數(shù)據(jù)進(jìn)行交互的功能。開發(fā)者或運(yùn)維人員可以輕松地執(zhí)行高級(jí)數(shù)據(jù)分析,并在各種圖表、表格和地圖中可視化數(shù)據(jù)。
??你可以從 elastic 的官網(wǎng) https://www.elastic.co/downloads/kibana 獲取最新版本的Kibana。解壓文檔后,按照下面的操作,即可在前臺(tái)(foregroud)啟動(dòng)Kibana:
此時(shí),Kibana運(yùn)行在本地的5601端口,在瀏覽器中輸入網(wǎng)址“http://localhost:5601”,即可看到以下界面:
Kibana啟動(dòng)界面
??下面,讓我們來了解Elasticsearch的一些基本概念,這有助于我們更好地理解和使用Elasticsearch。
Elasticsearch基本概念
全文搜索(Full-text Search)
??全文檢索是指計(jì)算機(jī)索引程序通過掃描文章中的每一個(gè)詞,對(duì)每一個(gè)詞建立一個(gè)索引,指明該詞在文章中出現(xiàn)的次數(shù)和位置,當(dāng)用戶查詢時(shí),檢索程序就根據(jù)事先建立的索引進(jìn)行查找,并將查找的結(jié)果反饋給用戶的檢索方式。
??在全文搜索的世界中,存在著幾個(gè)龐大的帝國(guó),也就是主流工具,主要有:
- Apache Lucene
- Elasticsearch
- Solr
- Ferret
倒排索引(Inverted Index)
??該索引表中的每一項(xiàng)都包括一個(gè)屬性值和具有該屬性值的各記錄的地址。由于不是由記錄來確定屬性值,而是由屬性值來確定記錄的位置,因而稱為倒排索引(inverted index)。Elasticsearch能夠?qū)崿F(xiàn)快速、高效的搜索功能,正是基于倒排索引原理。
節(jié)點(diǎn) & 集群(Node & Cluster)
??Elasticsearch 本質(zhì)上是一個(gè)分布式數(shù)據(jù)庫(kù),允許多臺(tái)服務(wù)器協(xié)同工作,每臺(tái)服務(wù)器可以運(yùn)行多個(gè)Elasticsearch實(shí)例。單個(gè)Elasticsearch實(shí)例稱為一個(gè)節(jié)點(diǎn)(Node),一組節(jié)點(diǎn)構(gòu)成一個(gè)集群(Cluster)。
索引(Index)
??Elasticsearch 數(shù)據(jù)管理的頂層單位就叫做 Index(索引),相當(dāng)于關(guān)系型數(shù)據(jù)庫(kù)里的數(shù)據(jù)庫(kù)的概念。另外,每個(gè)Index的名字必須是小寫。
文檔(Document)
??Index里面單條的記錄稱為 Document(文檔)。許多條 Document 構(gòu)成了一個(gè) Index。Document 使用 JSON 格式表示。同一個(gè) Index 里面的 Document,不要求有相同的結(jié)構(gòu)(scheme),但是最好保持相同,這樣有利于提高搜索效率。
類型(Type)
??Document 可以分組,比如employee這個(gè) Index 里面,可以按部門分組,也可以按職級(jí)分組。這種分組就叫做 Type,它是虛擬的邏輯分組,用來過濾 Document,類似關(guān)系型數(shù)據(jù)庫(kù)中的數(shù)據(jù)表。
??不同的 Type 應(yīng)該有相似的結(jié)構(gòu)(Schema),性質(zhì)完全不同的數(shù)據(jù)(比如 products 和 logs)應(yīng)該存成兩個(gè) Index,而不是一個(gè) Index 里面的兩個(gè) Type(雖然可以做到)。
文檔元數(shù)據(jù)(Document metadata)
??文檔元數(shù)據(jù)為_index, _type, _id, 這三者可以唯一表示一個(gè)文檔,_index表示文檔在哪存放,_type表示文檔的對(duì)象類別,_id為文檔的唯一標(biāo)識(shí)。
字段(Fields)
??每個(gè)Document都類似一個(gè)JSON結(jié)構(gòu),它包含了許多字段,每個(gè)字段都有其對(duì)應(yīng)的值,多個(gè)字段組成了一個(gè) Document,可以類比關(guān)系型數(shù)據(jù)庫(kù)數(shù)據(jù)表中的字段。
??在 Elasticsearch 中,文檔(Document)歸屬于一種類型(Type),而這些類型存在于索引(Index)中,下圖展示了Elasticsearch與傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)的類比:
Elasticsearch入門
??Elasticsearch提供了多種交互使用方式,包括Java API和RESTful API ,本文主要介紹RESTful API 。所有其他語言可以使用RESTful API 通過端口 9200 和 Elasticsearch 進(jìn)行通信,你可以用你最喜愛的 web 客戶端訪問 Elasticsearch 。甚至,你還可以使用 curl 命令來和 Elasticsearch 交互。
??一個(gè)Elasticsearch請(qǐng)求和任何 HTTP 請(qǐng)求一樣,都由若干相同的部件組成:
返回的數(shù)據(jù)格式為JSON,因?yàn)镋lasticsearch中的文檔以JSON格式儲(chǔ)存。其中,被 < > 標(biāo)記的部件:
部件 說明 VERB 適當(dāng)?shù)?HTTP 方法 或 謂詞 : GET、 POST、 PUT、 HEAD 或者 DELETE。 PROTOCOL http 或者 https(如果你在 Elasticsearch 前面有一個(gè) https 代理) HOST Elasticsearch 集群中任意節(jié)點(diǎn)的主機(jī)名,或者用 localhost 代表本地機(jī)器上的節(jié)點(diǎn)。 PORT 運(yùn)行 Elasticsearch HTTP 服務(wù)的端口號(hào),默認(rèn)是 9200 。 PATH API 的終端路徑(例如 _count 將返回集群中文檔數(shù)量)。Path 可能包含多個(gè)組件,例如:_cluster/stats 和 _nodes/stats/jvm 。 QUERY_STRING 任意可選的查詢字符串參數(shù) (例如 ?pretty 將格式化地輸出 JSON 返回值,使其更容易閱讀) BODY 一個(gè) JSON 格式的請(qǐng)求體 (如果請(qǐng)求需要的話)
對(duì)于HTTP方法,它們的具體作用為:
HTTP方法 說明 GET 獲取請(qǐng)求對(duì)象的當(dāng)前狀態(tài) POST 改變對(duì)象的當(dāng)前狀態(tài) PUT 創(chuàng)建一個(gè)對(duì)象 DELETE 銷毀對(duì)象 HEAD 請(qǐng)求獲取對(duì)象的基礎(chǔ)信息
??我們以下面的數(shù)據(jù)為例,來展示Elasticsearch的用法。
以下全部的操作都在Kibana中完成,創(chuàng)建的index為conference, type為event .
插入數(shù)據(jù)
??首先創(chuàng)建index為conference, 創(chuàng)建type為event, 插入id為1的第一條數(shù)據(jù),只需運(yùn)行下面命令就行:
PUT /conference/event/1{ "host": "Dave", "title": "Elasticsearch at Rangespan and Exonar", "description": "Representatives from Rangespan and Exonar will come and discuss how they use Elasticsearch", "attendees": ["Dave", "Andrew", "David", "Clint"], "date": "2013-06-24T18:30", "reviews": 3}在上面的命令中,路徑/conference/event/1表示文檔的index為conference, type為event, id為1. 類似于上面的操作,依次插入剩余的4條數(shù)據(jù),完成插入后,查看數(shù)據(jù)如下:
插入數(shù)據(jù)
刪除數(shù)據(jù)
??比如我們想要?jiǎng)h除conference中event里面id為5的數(shù)據(jù),只需運(yùn)行下面命令即可:
DELETE /conference/event/5返回結(jié)果如下:
{ "_index" : "conference", "_type" : "event", "_id" : "5", "_version" : 2, "result" : "deleted", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, "_primary_term" : 1}表示該文檔已成功刪除。如果想刪除整個(gè)event類型,可輸入命令:
DELETE /conference/event如果想刪除整個(gè)conference索引,可輸入命令:
DELETE /conference修改數(shù)據(jù)
??修改數(shù)據(jù)的命令為POST, 比如我們想要將conference中event里面id為4的文檔的作者改為Bob,那么需要運(yùn)行命令如下:
POST /conference/event/4/_update{ "doc": {"host": "Bob"}}返回的信息如下:(表示修改數(shù)據(jù)成功)
{ "_index" : "conference", "_type" : "event", "_id" : "4", "_version" : 7, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 7, "_primary_term" : 1}查看修改后的數(shù)據(jù)如下:
修改數(shù)據(jù)
查詢數(shù)據(jù)
??查詢數(shù)據(jù)的命令為GET,查詢命令也是Elasticsearch最為重要的功能之一。比如我們想查詢conference中event里面id為1的數(shù)據(jù),運(yùn)行命令如下:
GET /conference/event/1返回的結(jié)果如下:
{ "_index" : "conference", "_type" : "event", "_id" : "1", "_version" : 2, "found" : true, "_source" : { "host" : "Dave", "title" : "Elasticsearch at Rangespan and Exonar", "description" : "Representatives from Rangespan and Exonar will come and discuss how they use Elasticsearch", "attendees" : [ "Dave", "Andrew", "David", "Clint" ], "date" : "2013-06-24T18:30", "reviews" : 3 }}在_source 屬性中,內(nèi)容是原始的 JSON 文檔,還包含有其它屬性,比如_index, _type, _id, _found等。
??如果想要搜索conference中event里面所有的文檔,運(yùn)行命令如下:
返回結(jié)果包括了所有四個(gè)文檔,放在數(shù)組 hits 中。
??當(dāng)然,Elasticsearch 提供更加豐富靈活的查詢語言叫做 查詢表達(dá)式 , 它支持構(gòu)建更加復(fù)雜和健壯的查詢。利用查詢表達(dá)式,我們可以檢索出conference中event里面所有host為Bob的文檔,命令如下:
返回的結(jié)果只包括了一個(gè)文檔,放在數(shù)組 hits 中。
??接著,讓我們嘗試稍微高級(jí)點(diǎn)兒的全文搜索——一項(xiàng)傳統(tǒng)數(shù)據(jù)庫(kù)確實(shí)很難搞定的任務(wù)。搜索下所有description中含有"use Elasticsearch"的event:
返回的結(jié)果(部分)如下:
{ ... "hits" : { "total" : 2, "max_score" : 0.65109104, "hits" : [ { ... "_score" : 0.65109104, "_source" : { "host" : "Dave Nolan", "title" : "real-time Elasticsearch", "description" : "We will discuss using Elasticsearch to index data in real time", ... } }, { ... "_score" : 0.5753642, "_source" : { "host" : "Dave", "title" : "Elasticsearch at Rangespan and Exonar", "description" : "Representatives from Rangespan and Exonar will come and discuss how they use Elasticsearch", ... } } ] }}返回的結(jié)果包含了兩個(gè)文檔,放在數(shù)組 hits 中。讓我們對(duì)這個(gè)結(jié)果做一些分析,第一個(gè)文檔的description里面含有“using Elasticsearch”,這個(gè)能匹配“use Elasticsearch”是因?yàn)镋lasticsearch含有內(nèi)置的詞干提取算法,之后兩個(gè)文檔按_score進(jìn)行排序,_score字段表示文檔的相似度(默認(rèn)的相似度算法為BM25)。
??如果想搜索下所有description中嚴(yán)格含有"use Elasticsearch"這個(gè)短語的event,可以使用下面的命令:
這時(shí)候返回的結(jié)果只有一個(gè)文檔,就是上面輸出的第二個(gè)文檔。
總結(jié)
以上是生活随笔為你收集整理的elasticsearch java对象 驼峰原则_Elasticsearch简介与实战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gbd 分析core文件_Go 性能分析
- 下一篇: 前驱和后驱什么意思_14.98万!造型酷