适用于Java开发人员的Elasticsearch:简介
本文是我們學院課程的一部分,該課程的標題為Java開發人員的Elasticsearch教程 。
在本課程中,我們提供了一系列教程,以便您可以開發自己的基于Elasticsearch的應用程序。 我們涵蓋了從安裝和操作到Java API集成和報告的廣泛主題。 通過我們簡單易懂的教程,您將能夠在最短的時間內啟動并運行自己的項目。 在這里查看 !
1.簡介
有效,快速和準確的搜索功能是絕大多數現代應用程序和軟件平臺的組成部分。 您正在運行的是小型電子商務網站,需要為客戶提供產品目錄搜索,或者您是服務提供商,需要公開API以使開發人員可以過濾用戶和公司,或者您正在構建任何這類消息傳遞應用程序從一開始就必須在歷史中查找對話……真正重要的是,盡可能快地提供相關結果可能是您正在開發的產品或平臺的另一個競爭優勢。 。
目錄
1.簡介 2. Elasticsearch基礎確實,搜索可能具有許多面Kong,目的,目標和不同的規模。 它可能像通過精確的單詞匹配查找一樣簡單,也可能像試圖理解一個人正在尋找的單詞的意圖和上下文含義一樣復雜( 語義搜索引擎)。 就規模而言,它可能像查詢單個數據庫表一樣瑣碎,也可能像處理數十億個網頁一樣復雜以提供所需的結果。 這是一個非常有趣且蓬勃發展的研究領域,多年來發表了許多算法和論文。
如果您是Java / JVM開發人員,則可能聽說過Apache Lucene項目,這是一個高性能,功能齊全的索引和搜索庫。 這是釋放全文搜索功能并將其嵌入到您的應用程序中的第一個也是最好的選擇。 盡管它絕對是一個了不起的庫,但是許多開發人員發現Apache Lucene的級別太低并且不易于使用。 這就是另外兩個偉大的項目Elasticsearch和Apache Solr誕生的原因之一。
在本教程中,我們將討論Elasticsearch ,重點放在事物的開發方面而不是操作方面。 我們將學習Elasticsearch的基礎知識,熟悉術語,并討論在Java / JVM應用程序或命令行中運行它以及與之通信的不同方法。 在本教程的最后,我們將討論Elastic Stack,以展示Elasticsearch周圍的生態系統及其驚人的功能。
如果您是初級或經驗豐富的Java / JVM開發人員,并且對學習Elasticsearch感興趣,那么本教程絕對適合您。
2. Elasticsearch基礎
首先,很高興回答這個問題:那么, Elasticsearch是什么,它如何幫助我以及為什么要使用它?
Elasticsearch是一個高度可擴展的開源全文本搜索和分析引擎。 它使您可以快速,近乎實時地存儲,搜索和分析大量數據。 它通常用作支持具有復雜搜索功能和要求的應用程序的基礎引擎/技術。 – https://www.elastic.co/
Elasticsearch是基于Apache Lucene構建的,但是更傾向于通過RESTful API和高級深度分析功能進行通信。 RESTful部分使Elasticsearch特別易于學習和使用。 在撰寫本文時, Elasticsearch的最新穩定發行版是5.2 ,而最新發行版本是5.2.0 。 我們絕對應該讓Elasticsearch家伙保持如此頻繁地發布新版本的步伐,因為5.0.x / 5.1.x分支僅僅成立了幾個月……。
從Elasticsearch的角度來看,作為RESTful API的另一個優勢是:發送到Elasticsearch或從Elasticsearch接收的每條數據本身都是人類可讀的JSON文檔(盡管這不是Elasticsearch支持的唯一協議,我們稍后將看到) 。
為了使討論更切合實際,我們將假裝我們正在開發用于管理書籍目錄的應用程序。 數據模型將包括類別,作者,出版商,書籍詳細信息(例如出版日期,ISBN,等級)和簡要說明。
書籍目錄
讓我們看看如何利用Elasticsearch使我們的書籍目錄易于搜索,但是在此之前我們需要對術語有所了解。 盡管在接下來的幾節中,我們將討論Elasticsearch背后的大多數概念,但請隨時隨時查閱Elasticsearch的官方文檔 。
文件資料
簡而言之,在Elasticsearch文檔的上下文中,它只是任意數據(通常是結構化的)。 它絕對是對您的應用程序有意義的任何事物(例如用戶,日志,博客文章,文章,產品等),但這是Elasticsearch可以操縱的基本信息單元。
指標
Elasticsearch將文檔存儲在索引中,因此,索引只是文檔的集合。 公平地講,將完全不同種類的文檔保留在同一索引中會比較方便,但是卻很難使用,因此每個索引都可以具有一個或多個類型。 這些類型通過定義每個此類文檔應具有的一組公共屬性(或字段)來對文檔進行邏輯分組。 類型用作有關文檔的元數據,對于探索數據的結構以及構建有意義的查詢和聚合非常有用。
索引設定
Elasticsearch中的每個索引在創建時都可以具有與之關聯的特定設置。 最重要的是分片數和復制因子。 讓我們談論一下。
Elasticsearch是從頭開始構建的,可以處理大量索引數據,這些數據很可能會超出單個物理(或虛擬)計算機實例的內存和/或存儲能力。 因此, Elasticsearch使用分片作為一種機制,將索引分為幾個較小的部分(稱為分片),并將其分配到許多節點中。 請注意,一旦設置了分片的數量就無法更改(盡管這不再是完全正確的,但索引可以縮減為更少的分片 )。
確實,分片解決了一個實際的問題,但是由于單個節點故障,它很容易遭受數據丟失問題的困擾。 為了解決此問題, Elasticsearch通過利用復制來支持高可用性。 在這種情況下,根據復制因素, Elasticsearch會維護每個分片的一個或多個副本,并確保每個分片的副本位于不同的節點上。
對應
定義文檔類型并將其分配給特定索引的過程稱為索引映射,映射類型或僅稱為映射。 為了充分利用Elasticsearch ,正確的類型映射可能是您必須進行的最重要的設計練習之一。 讓我們花一些時間詳細討論映射。
每個映射都包含可選的元字段(它們通常從下劃線'_'字符開始,例如_index , _id , _parent )和常規文檔字段(或屬性)。 每個字段(或屬性)都有一個數據 類型 ,在Elasticsearch中它可以屬于以下類別之一:
- 簡單數據類型
- 文本 –索引全文值
- 復合數據類型
- 對象 –索引內部對象,這些對象又可能包含內部對象本身
- 專用數據類型
- geo_point –索引緯度-經度對
- 范圍數據類型:
- integer_range –索引有符號的32位整數范圍
壓力不夠大,為文檔的字段(屬性)選擇適當的數據類型是快速有效搜索(提供真正相關結果)的關鍵。 但是有一個問題:每種映射類型中的字段并不完全相互獨立。 具有相同名稱和相同索引但具有 不同映射類型的字段必須具有相同的映射定義 。 原因是內部將這些字段映射到同一字段 。
回到我們的應用程序數據模型,讓我們嘗試利用我們剛剛獲得的有關數據類型的知識,為books收藏定義最簡單的映射類型。
映射圖書目錄:首次嘗試
對于大多數書籍屬性,映射數據類型非常簡單,但是作者和categories如何呢? 這些屬性本質上包含Elasticsearch尚無直接數據類型的值的集合,…還是有?
高級映射
有趣的是, Elasticsearch實際上沒有專用的數組或集合類型,但是默認情況下,任何字段都可以包含零個或多個(其數據類型)值。
對于復雜的數據結構, Elasticsearch支持使用對象和嵌套數據類型進行映射,以及在同一索引內的文檔之間建立父子關系。 每種方法都有優點和缺點,但是為了學習如何使用這些技術,讓我們將categories存儲為books映射類型的嵌套屬性,而authors將被表示為將books作為父對象的專用映射。
映射圖書目錄:第二次(也是最后一次)
這些是我們接近catalog索引的最終映射類型。 眾所周知, JSON是Elasticsearch的一等公民,因此讓我們了解一下典型索引映射在Elasticsearch實際理解的格式中的樣子。
{"mappings": {"books": {"_source" : {"enabled": true},"properties": {"title": { "type": "text" },"categories" : {"type": "nested","properties" : {"name": { "type": "text" }}},"publisher": { "type": "keyword" },"description": { "type": "text" },"published_date": { "type": "date" },"isbn": { "type": "keyword" },"rating": { "type": "byte" }}},"authors": {"properties": {"first_name": { "type": "keyword" },"last_name": { "type": "keyword" }},"_parent": {"type": "books"}}} }您可能會感到驚訝,但是可能會省略字段和映射類型的明確定義。 Elasticsearch支持動態映射,因此在為文檔建立索引時會自動添加新的映射類型和新的字段名稱(在這種情況下, Elasticsearch決定應使用的字段數據類型)。
要提及的另一個重要細節是,通過使用特殊的_meta屬性,每個映射類型都可以具有與之關聯的自定義元數據 。 這是一種非常有用的技術,稍后我們將在本教程中使用。
索引編制
一旦Elasticsearch定義了所有索引及其映射類型(或使用dynamic mapping推斷),即可開始分析和索引文檔。 這是一個非常復雜但有趣的過程 ,至少涉及分析器 , 令牌生成 器 , 令牌過濾器和字符過濾器 。
Elasticsearch支持大量映射參數 ,可讓您精確地根據需要定制索引,分析和搜索階段。 例如,每個字段(或屬性)都可以配置為使用自己的索引時間和搜索時間分析器 ,支持同義詞 ,應用詞干分析 ,過濾停用詞等等。 通過精心設計這些參數,您最終可能會擁有出色的搜索功能,但是相反的情況也是如此,使它們變得松散,并且每次都可能返回許多無關緊要的結果。
如果您不需要所有這些,那么最好使用上一部分中的默認設置,而完全省略這些參數。 但是,這種情況很少發生。 舉一個現實的例子,大多數時候我們的應用程序必須支持多種語言(和語言環境)。 幸運的是, Elasticsearch也在這里閃耀。
在繼續討論下一個主題之前,您需要了解一個重要的約束。 一旦配置了映射類型,在大多數情況下, 它們將無法更新,因為它會自動假定相應集合中的所有文檔都不再是最新的,應該重新編制索引。
內部化(i18n)
索引和分析文檔的過程對文檔的本地語言非常敏感。 默認情況下,如果在映射類型中未指定標準分析器 ,則Elasticsearch使用標準分析器 。 它適用于大多數語言,但是Elasticsearch為阿拉伯語,亞美尼亞語,巴斯克語,巴西語,保加利亞語,捷克語,丹麥語,荷蘭語,英語,芬蘭語,法語,德語,希臘語,印地語,匈牙利語,印度尼西亞語,愛爾蘭語,意大利語提供專用的分析器 ,拉脫維亞語,立陶宛語,挪威語,波斯語,葡萄牙語,羅馬尼亞語,俄語,西班牙語,瑞典語,土耳其語,泰語等等 。
根據數據模型和業務案例,有幾種方法可以用多種語言對同一文檔建立索引。 例如,如果文檔實例實際上以多種語言存在(翻譯),則每種語言都具有一個索引可能是有意義的。
萬一文檔被部分翻譯, Elasticsearch在袖子中還有一個有趣的選項,稱為multi-fields 。 多字段允許以不同方式索引同一文檔字段(屬性)以用于不同目的(例如,支持多種語言)。 回到我們的books映射類型,我們可能已經將title屬性定義為一個多字段屬性,例如:
"title": {"type": "text","fields": {"en": { "type": "text", "analyzer": "english" },"fr": { "type": "text", "analyzer": "french" },"de": { "type": "text", "analyzer": "german" },...} }這些不是唯一可用的選項,但是它們充分說明了Elasticsearch在滿足相當復雜的需求方面的靈活性和成熟度。
3.運行Elasticsearch
Elasticsearch在許多方面都包含了簡單性,其中之一是通過任何兩個步驟即可在幾乎任何平臺上入門的非常簡單的方法: 下載并運行 。 在接下來的兩節中,我們將討論啟動和運行Elasticsearch的許多不同方法。
獨立實例
將Elasticsearch作為獨立應用程序(或實例)運行是采取最快和最簡單的方法。 只需下載您選擇的軟件包并在Linux / Unix / Mac操作系統上運行shell腳本即可:
bin/elasticsearch或從Windows操作系統上的批處理文件中:
bin\elasticsearch.bat就是這樣,很簡單,不是嗎? 但是,在繼續討論更高級的選項之前,了解一下運行Elasticsearch實例的實際含義將很有用。 更確切地說,每次我們說要啟動Elasticsearch實例時,實際上是在啟動node實例。 這樣,根據提供的配置(默認情況下,它存儲在conf/elastisearch.yml文件中), Elasticsearch目前支持多種節點類型 。 在這方面,可以將每個正在運行的Elasticsearch獨立實例配置為作為以下??節點類型之一(或組合)運行:
- 數據節點 :此類節點正在維護數據并對該數據執行操作(由node.data配置設置控制,默認情況下設置為true )
- 接收節點 :這些是特殊類型的節點,它們能夠應用接收管道以便在對文檔建立索引之前對其進行轉換和豐富(它由node.ingest配置設置控制,默認情況下設置為true )
請注意,這還不是一個完整的節點類型列表,我們將在稍后學習更多。
聚類
將Elasticsearch作為獨立實例運行對于開發,學習或測試目的是有好處的,但是肯定不是生產系統的選擇。 通常,在大多數實際部署中, Elasticsearch配置為在集群中運行:一個或多個節點的集合最好拆分為多個物理實例。 Elasticsearch集群管理所有數據,并在其所有節點上提供聯合索引,聚合和搜索功能。
每個Elasticsearch群集均由一個唯一的名稱標識,該名稱由cluster.name配置設置控制(默認設置為"elasticsearch" )。 節點通過引用其名稱加入群集,因此這是非常重要的配置。 最后但并非最不重要的一點是,每個集群都有一個專用的主節點,該主節點負責執行集群范圍的動作和操作。
除適用于集群配置外, Elasticsearch還支持其他幾種節點類型,除了我們已經知道的那些類型:
- 符合資格的主節點 :這些類型的節點被標記為有資格被選舉為主節點 (它由node.master配置設置控制,默認情況下設置為true )
- 僅協調節點 :這是一種特殊類型的節點,僅能路由請求,處理某些搜索階段并分配批量索引,本質上表現為負載均衡器(當node.master , node.data時,該節點自動成為僅協調節點和node.ingest設置都設置為false )
- 部落節點 :這是一種特殊的僅協調節點 ,可以連接到多個集群并在所有集群中執行搜索或其他操作(由tribe.*控制tribe.*配置設置)
默認情況下,如果未指定configuration,則每個Elasticsearch節點均配置為符合master資格 , data節點和ingest節點 。 與獨立實例類似, Elasticsearch群集實例可以從命令行快速啟動:
bin/elasticsearch -Ecluster.name=<cluster-name> -Enode.name=<node-name>或在Windows平臺上:
bin\elasticsearch.bat -Ecluster.name=<cluster-name> -Enode.name=<node-name>除了分片和復制外, Elasticsearch集群還具有高可用性和可擴展系統的所有屬性,這些系統將有機地發展以滿足您的應用程序需求。 需要注意的是,盡管投入了大量精力來穩定Elasticsearch集群的實現并涵蓋了與不同類型的故障場景相關的許多極端情況,但到目前為止,仍不建議將Elasticsearch用作記錄系統(或主要存儲引擎)。您的數據)。
嵌入應用
不久之前(直到5.0版本分支), Elasticsearch完全支持在同一JVM進程(通常稱為嵌入)中作為應用程序的一部分運行的選項。 盡管當然不建議這樣做,但有時它非常有用,并且可以節省很多精力,例如在集成/系統/組件測試運行期間。
這種情況最近有所改變,Elasticsearch的嵌入式版本不再得到正式支持,也不再推薦使用。 幸運的是,如果您確實需要嵌入式實例,例如在從較早的Elasticsearch版本緩慢遷移的同時, 仍然可以 。
@Configuration public class ElasticsearchEmbeddedConfiguration {private static class EmbeddedNode extends Node {public EmbeddedNode(Settings preparedSettings) {super(InternalSettingsPreparer.prepareEnvironment(preparedSettings, null), Collections.singletonList(Netty4Plugin.class));}}@Bean(initMethod = "start", destroyMethod = "stop")Node elasticSearchTestNode() throws NodeValidationException, IOException {return new EmbeddedNode(Settings.builder().put(NetworkModule.TRANSPORT_TYPE_KEY, "netty4").put(NetworkModule.HTTP_TYPE_KEY, "netty4").put(NetworkModule.HTTP_ENABLED.getKey(), "true") .put(Environment.PATH_HOME_SETTING.getKey(), home().getAbsolutePath()).put(Environment.PATH_DATA_SETTING.getKey(), data().getAbsolutePath()).build());}@BeanFile home() throws IOException {return Files.createTempDirectory("elasticsearch-home-").toFile();}@BeanFile data() throws IOException {return Files.createTempDirectory("elasticsearch-data-").toFile();}@PreDestroyvoid destroy() throws IOException {FileSystemUtils.deleteRecursively(home());FileSystemUtils.deleteRecursively(data());} }盡管此代碼段基于出色的Spring框架 ,但該想法非常簡單,可以在任何基于JVM的應用程序中使用。 話雖如此,但請注意并重新考慮長期解決方案,而無需嵌入Elasticsearch 。
作為容器運行
諸如Docker , CoreOS之類的工具的興起以及容器的巨大普及以及基于容器的部署大大改變了我們對基礎架構的看法,在許多情況下,也改變了我們的開發方法。
換句話說,無需下載Elasticsearch并使用shell腳本或批處理文件運行它。 一切都是容器,可以使用單個docker命令將其拉出,配置和運行(很幸運,這里有一個官方的Elasticseach Dockerhub存儲庫 )。
假設您的機器上已安裝Docker ,讓我們依靠默認配置運行單個Elasticsearch實例:
docker run -d -p 9200:9200 -p 9300:9300 elasticsearch:5.2.0旋轉Elasticsearch集群比使用shell腳本手動完成要復雜一些,但肯定要容易得多。 總的來說, Elasticsearch集群需要多播支持才能使節點彼此自動發現,但是不幸的是,使用Docker,您將需要退回到單播發現 (除非您已訂閱以解鎖商業功能 )。
docker run -d -p 9200:9200 -p 9300:9300 --name es1 elasticsearch:5.2.0 -E cluster.name=es-catalog -E node.name=es1 -E transport.host=0.0.0.0docker run -d --name es2 --link=es1 elasticsearch:5.2.0 -E cluster.name=es-catalog -E node.name=es2 -E transport.host=0.0.0.0 -E discovery.zen.ping.unicast.hosts=es1docker run -d --name es3 --link=es1 elasticsearch:5.2.0 -E cluster.name=es-catalog -E node.name=es3 -E transport.host=0.0.0.0 -E discovery.zen.ping.unicast.hosts=es1啟動容器后,應創建三個Elasticsearch節點的集群,并可以從http://localhost:9200訪問主節點(如果支持本機Docker )。 如果由于某些原因您仍在Docker Machine上 (甚至是較舊的boot2docker ),則主節點將分別在http://<docker-machine-ip>:9200處公開。
如果您正在積極使用Docker Compose ,那么某些限制將使您的生活變得復雜。 目前, Elasticsearch映像需要將一些參數傳遞到入口點(在命令行末尾看到的所有內容都是-E選項),但是Docker Compose還不支持這種功能(盡管您可以將自己的映像構建為解決方法)。
在本教程中,我們將僅使用從Docker容器開始的Elasticsearch ,希望這是您早已采用的方法。
4. Elasticsearch適合的地方
搜索是Elasticsearch的關鍵功能之一,并且做得非常好。 但是, Elasticsearch不僅限于搜索,還提供了豐富的分析功能,其形狀被稱為聚合框架 ,該框架基于搜索查詢進行數據聚合。 萬一您需要對數據進行一些分析, Elasticsearch在這里也非常適合。
盡管可能不會立即顯現出來,但Elasticsearch可用于管理時間序列數據 (例如,指標,股票價格),甚至可以反向搜索圖像 。 關于Elasticsearch的誤解之一是它可以用作數據存儲。 從某種程度上講,它確實存儲了數據,但是它沒有提供與典型數據存儲相同的保證。
5.結論
盡管我們在這里談論了很多事情,但是Elasticsearch的大量有趣細節和有用功能還沒有被涵蓋。 我們的重點一直放在事物的開發方面,因此,重點一直放在理解Elasticsearch的基礎上并Swift開始。 希望您已經感到興奮和興奮,可以馬上開始閱讀官方文檔參考 ,因為還有更多有趣的話題正在討論中。
6.接下來
在下一部分中,我們將通過探索和使用Elasticsearch公開的無數RESTful API (僅使用命令行和出色的curl / http工具進行武裝)來從討論進入操作。
這篇文章的源代碼可以在這里下載。
翻譯自: https://www.javacodegeeks.com/2017/02/elasticsearch-java-developers-introduction.html
總結
以上是生活随笔為你收集整理的适用于Java开发人员的Elasticsearch:简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记本电脑主板静电现象(笔记本电脑主板静
- 下一篇: java 对象复活_Java对象复活