在Java應用程序中使用Elasticsearch_第1頁
在Java應用程序中使用Elasticsearch_第2頁
在Java應用程序中使用Elasticsearch_第3頁
在Java應用程序中使用Elasticsearch_第4頁
在Java應用程序中使用Elasticsearch_第5頁
已閱讀5頁,還剩15頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、如果您使用過 ApacheLucene或 Apache Solr,就會知道它們的使用體驗非常有趣。尤其在您需要擴展基于 Lucene 或 Solr 的解決方案時,您就會了解Elasticsearch項目背后的動機。Elasticsearch(構建于 Lucene 之上)在一個容易管理的包中提供了高性能的全文搜索功能,支持開箱即用地集群化擴展。您可以通過標準的REST API或從特定于編程語言的客戶端庫與 Elasticsearch 進行交互。本教程將展示 Elasticsearch 的實際工作原理。首先從命令行訪問該 REST API 來了解它的基本信息。然后設置一個本地 Elasticsea

2、rch 服務器,并從一個簡單的 Java 應用程序與它交互。請參見下載部分,獲取有關的示例代碼。前提條件要理解本教程的所有示例,需要在您的系統上安裝 Elasticsearch。下載針對您的平臺的最新 Elastic Search 程序包。將該包解壓到一個方便的位置。在 UNIX 或 Linux 上,通過以下命令啟動該實例:/elastic-search-dir/bin/elasticsearch在 Windows 上,運行/elastic-search-dir/bin/elasticsearch.bat在看到日志消息started時,該節點已準備好接受請求。對于 Java 示例,還需要安裝E

3、clipse和Apache Maven。如果您的系統上還沒有它們,請下載和安裝它們。您還需要 cURL。在 Microsoft Windows 上,我使用Git Bashshell 來運行 cURL。使用 cURL 執行 REST 命令可以對 Elasticsearch 發出 cURL 請求,這樣很容易從命令行 shell 體驗該框架。“Elasticsearch 是無模式的。它可以接受您提供的任何命令,并處理它以供以后查詢。”Elasticsearch 是無模式的,這意味著它可以接受您提供的任何命令,并處理它以供以后查詢。Elasticsearch 中的所有內容都被存儲為文檔,所以您的第一個

4、練習是存儲一個包含歌詞的文檔。首先創建一個索引,它是您的所有文檔類型的容器 類似于 MySQL 等關系數據庫中的數據庫。然后,將一個文檔插入該索引中,以便可以查詢該文檔的數據。創建一個索引Elasticsearch 命令的一般格式是:REST VERBHOST:9200/index/doc-type 其中REST VERB是PUT、GET或DELETE。(使用 cURL-X動詞前綴來明確指定 HTTP 方法。)要創建一個索引,可在您的 shell 中運行以下命令:curl -XPUT http:/localhost:9200/music/模式可選盡管 Elasticsearch 是無模式的,但

5、它在幕后使用了 Lucene,后者使用了模式。不過 Elasticsearch 為您隱藏了這種復雜性。實際上,您可以將 Elasticsearch 文檔類型簡單地視為子索引或表名稱。但是,如果您愿意,可以指定一個模式,所以您可以將它視為一種模式可選的數據存儲。插入一個文檔要在/music索引下創建一個類型,可插入一個文檔。在第一個示例中,您的文檔包含數據(包含一行)“Deck the Halls” 的歌詞,這是一首最初由威爾士詩人 John Ceirog Hughes 于 1885 年編寫的傳統的圣誕歌曲。要將包含 “Deck the Halls” 的文檔插入索引中,可運行以下命令(將該命令和

6、本教程的其他 cURL 命令都鍵入到一行中):curl -XPUT http:/localhost:9200/music/songs/1 -d name: Deck the Halls, year: 1885, lyrics: Fa la la la la 前面的命令使用PUT動詞將一個文檔添加到/songs文檔類型,并為該文檔分配 ID 1。URL 路徑顯示為index/doctype/ID。查看文檔要查看該文檔,可使用簡單的GET命令:curl -XGET http:/localhost:9200/music/songs/1Elasticsearch 使用您之前PUT進索引中的 JSON

7、內容作為響應:_index:music,_type:songs,_id:1,_version:1,found:true,_source: name: Deck the Halls, year: 1885, lyrics: Fa la la la la 更新文檔如果您認識到日期寫錯了,并想將它更改為 1886 怎么辦?可運行以下命令來更新文檔:curl -XPUT http:/localhost:9200/music/lyrics/1 -d name: Deck the Halls, year: 1886, lyrics: Fa la la la la 因為此命令使用了相同的唯一 ID 1,所以

8、該文檔會被更新。刪除文檔(但暫時不要刪除)暫時不要刪除該文檔,知道如何刪除它就行了:curl -XDELETE http:/localhost:9200/music/lyrics/1從文件插入文檔這是另一個技巧。您可以使用一個文件的內容來從命令行插入文檔。嘗試此方法,添加另一首針對傳統歌曲 “Ballad of Casey Jones” 的文檔。將清單 1 復制到一個名為 caseyjones.json 的文件中;也可以使用示例代碼包中的 caseyjones.json 文件(參見下載)。將該文件放在任何方便對它運行 cURL 命令的地方。(在下載的代碼中,該文件位于根目錄中。)清單 1. “

9、Ballad of Casey Jones” 的 JSON 文檔 artist: Wallace Saunders, year: 1909, styles: traditional, album: Unknown, name: Ballad of Casey Jones, lyrics: Come all you rounders if you want to hearThe story of a brave engineerCasey Jones was the rounders name.Come all you rounders if you want to hearThe story

10、of a brave engineerCasey Jones was the rounders nameOn the six-eight wheeler, boys, he won his fameThe caller called Casey at half past fourHe kissed his wife at the station doorHe mounted to the cabin with the orders in his handAnd he took his farewell trip to that promisd landChorus:Casey Jones-mo

11、unted to his cabinCasey Jones-with his orders in his handCasey Jones-mounted to his cabinAnd he took his. land運行以下命令,將此文檔PUT到您的music索引中:$ curl -XPUT http:/localhost:9200/music/lyrics/2 -d caseyjones.json在該索引中時,將清單 2 的內容(包含另一手民歌 “Walking Boss”)保存到 walking.json 文件中。清單 2. “Walking Boss” JSON artist: Cl

12、arence Ashley, year: 1920 name: Walking Boss, styles: folk,protest, album: Traditional, lyrics: Walkin bossWalkin bossWalkin bossI dont belong to youI belongI belongI belongTo that steel driving crewWell you work one dayWork one dayWork one dayThen go lay around the shanty two將此文檔推送到索引中:$ curl -XPUT

13、 http:/localhost:9200/music/lyrics/3 -d walking.json搜索 REST API是時候運行一次基本查詢了,此查詢比您運行來查找 “Get the Halls” 文檔的簡單GET要復雜一些。文檔 URL 有一個內置的_search端點用于此用途。在歌詞中找到所有包含單詞you的歌曲:curl -XGET http:/localhost:9200/music/lyrics/_search?q=lyrics:youq參數表示一個查詢。響應是:took:107,timed_out:false,_shards:total:5,successful:5,fai

14、led:0,hits:total:2,max_score:0.15625,hits:_index:music,_type:songs,_id:2,_score:0.15625,_source:artist: Wallace Saunders,year: 1909,styles:traditional,album: Unknown,name: Ballad of Casey Jones,lyrics: Come all you roundersif you want to hear The story of a brave engineer Casey Jones was the rounder

15、s name. Come allyou rounders if you want to hear The story of a brave engineer Casey Jones was the rounders nameOn the six-eight wheeler, boys, he won his fame The caller called Casey at half past four He kissedhis wife at the station door He mounted to the cabin with the orders in his hand And he t

16、ook hisfarewell trip to that promisd land Chorus: Casey Jones-mounted to his cabin Casey Jones-with hisorders in his hand Casey Jones-mounted to his cabin And he took his. land,_index:music,_type:songs,_id:3,_score:0.06780553,_source:artist: ClarenceAshley,year: 1920,name: Walking Boss,styles: folk,

17、protest,album:Traditional,lyrics: Walkin boss Walkin boss Walkin boss I dont belong to you I belong Ibelong I belong To that steel driving crew Well you work one day Work one day Work one day Then golay around the shanty two使用其他比較符還有其他各種比較符可供使用。例如,找到所有 1900 年以前編寫的歌曲:curl -XGET http:/localhost:9200/m

18、usic/lyrics/_search?q=year:1900&fields=year檢查搜索返回對象清單 3 給出了 Elasticsearch 從前面的查詢返回的數據。清單 3. 查詢結果 took: 6, timed_out: false, _shards: total: 5, successful: 5, failed: 0 , hits: total: 2, max_score: 1.0, hits: _index: music, _type: lyrics, _id: 1, _score: 1.0, fields: year: 1920 , _index: music, _type

19、: lyrics, _id: 3, _score: 1.0, fields: year: 1909 在結果中,Elasticsearch 提供了多個 JSON 對象。第一個對象包含請求的元數據:看看該請求花了多少毫秒 (took) 和它是否超時 (timed_out)。_shards字段需要考慮 Elasticsearch 是一個集群化服務的事實。甚至在這個單節點本地部署中,Elasticsearch 也在邏輯上被集群化為分片。繼續查看清單 3 中的搜索結果,可以觀察到hits對象包含: total字段,它會告訴您獲得了多少個結果 max_score,用于全文搜索 實際結果實際結果包含fiel

20、ds屬性,因為您將fields參數添加到了查詢中。否則,結果中會包含source,而且包含完整的匹配文檔。_index、_type和_id的用途不言自明;_score指的是全文搜索命中長度。這 4 個字段始終會在結果中返回。使用 JSON 查詢 DSL基于查詢字符串的搜索很快會變得很復雜。對于更高級的查詢,Elasticsearch 提供了一種完全基于 JSON 的特定于領域的語言 (DSL)。例如,要搜索album值為traditional的每首歌曲,可創建一個包含以下內容的 query.json 文件: query : match : album : Traditional 然后運行:cu

21、rl -XGET http:/localhost:9200/music/lyrics/_search -d query.json從 Java 代碼使用 Elasticsearch“Elasticsearch 強大功能會在通過語言 API 使用它時體現出來。”Elasticsearch 強大功能會在通過語言 API 使用它時體現出來。現在我將介紹 Java API,您將從一個應用程序執行搜索。請參見下載部分,獲取相關的示例代碼。該應用程序使用了 Spark 微型框架,所以可以很快設置它。示例應用程序為一個新項目創建一個目錄,然后運行(將該命令鍵入到一行上):mvn archetype:gener

22、ate -DgroupId=com.dw -DartifactId=es-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false要生成一個項目來在 Eclipse 中使用,可通過cd進入 Maven 創建的項目目錄,并運行mvn eclipse:eclipse。在 Eclipse 中,選擇FileImportExisting Project into Workspace。導航到您使用 Maven 的文件夾,選擇該項目,單擊Finish。在 Eclipse 中,您可以看到一個基本的 Java 項目

23、布局,包括根目錄中的 pom.xml 文件和一個 com.dw.App.java 主要類文件。將您所需的依賴項添加到 pom.xml 文件中。清單 4 給出了完整的 pom.xml 文件。清單 4. 完整的 pom.xml 4.0.0 com.dw es-demo jar 1.0-SNAPSHOT es-demo org.apache.maven.plugins maven-compiler-plugin 1.8 1.8 1.8 com.sparkjava spark-core 2.3 com.sparkjava spark-template-fr

24、eemarker 2.3 org.elasticsearch elasticsearch 2.1.1 清單 4 中的依賴項獲取 Spark 框架核心、Spark Freemarker 模板支持和 Elasticsearch。另請注意,我將版本設置為 Java 8,Spark 需要該版本(因為它大量使用了 lambda)。我不知道您的情況,但我不久前構建了許多 RESTful 應用程序,所以為了改變以下步調,您將為應用程序提供一個更加傳統的 “提交和加載 (submit-and-load)” UI。在 Eclipse 中,在導航器中右鍵單擊項目,選擇ConfigureConvert to Mav

25、en Project,以便 Eclipse 可以解析 Maven 依賴項。轉到項目,右鍵單擊該項目,然后選擇MavenUpdate Project。Java 客戶端配置Elasticsearch 的 Java 客戶端非常強大;它可以建立一個嵌入式實例并在必要時運行管理任務。但我在這里將重點介紹如何運行針對您已運行的節點的應用程序任務。運行一個 Java 應用程序和 Elasticsearch 時,有兩種操作模式可供使用。該應用程序可在 Elasticsearch 集群中扮演更加主動或更加被動的角色。在更加主動的情況下(稱為 Node Client),應用程序實例將從集群接收請求,確定哪個節點應

26、處理該請求,就像正常節點所做的一樣。(應用程序甚至可以托管索引和處理請求。)另一種模式稱為 Transport Client,它將所有請求都轉發到另一個 Elasticsearch 節點,由后者來確定最終目標。獲取 Transport Client對于演示應用程序,(通過 App.java 中執行的初始化)選擇 Transport Client,并保持 Elasticsearch 執行最低級別的處理:Client client = TransportClient.builder().build() .addTransportAddress(new InetSocketTransportAddr

27、ess(InetAddress.getByName(localhost), 9300);如果連接到一個 Elasticsearch 集群,構建器可以接受多個地址。(在本例中,您只有一個 localhost 節點。)連接到端口 9300,而不是像之前在 REST API 的 cURL 中一樣連接到 9200。Java 客戶端將會使用這個特殊端口,使用端口 9200 不起作用。(其他 Elasticsearch 客戶端,Python 客戶端就是其中之一,將會 使用 9200 來訪問 REST API。)在服務器啟動時創建該客戶端,并在整個請求處理過程中使用它。Spark 通過 Mustache 模

28、板引擎的 Java 實現來呈現該頁面,而且 Spark 定義了請求端點 但我不會太多地解釋這些簡單的用例。(請參見參考資料,獲取 Spark 的詳細信息的鏈接。)該應用程序的索引頁面顯示了 Java 客戶端的功能:UI: 呈現現有歌曲的列表 提供一個添加歌曲的按鈕 實現按藝術家和歌詞進行搜索 返回突出顯示了匹配內容的結果搜索和處理結果在清單 5 中,根 URL/被映射到 index.mustache 頁面。清單 5. 基本搜索Spark.get(/, (request, response) - SearchResponse searchResponse = client.prepareSear

29、ch(music).setTypes(lyrics).execute().actionGet(); SearchHit hits = searchResponse.getHits().getHits(); Map attributes = new HashMap(); attributes.put(songs, hits); return new ModelAndView(attributes, index.mustache); , new MustacheTemplateEngine();清單 5 中的有趣部分始于:SearchResponse searchResponse = client

30、.prepareSearch(music).setTypes(lyrics).execute().actionGet();這一行顯示了搜索 API 的簡單用法。使用prepareSearch方法指定一個索引(在本例中為music),然后執行查詢。查詢基本上顯示為 “Give me all of the records in themusicindex.”。另外,將文檔類型設置為lyrics,但在這個簡單用例中沒有必要這么做,因為索引僅包含一種文檔類型。在更大的應用程序,需要執行這種設置。這個 API 調用類似于您之前看到的curl -XGET http:/localhost:9200/musi

31、c/lyrics/_search調用。SearchResponse對象包含有趣的功能(例如命中數量和評分),但就目前而言,您只想要一個結果數組,可使用searchResponse.getHits().getHits();獲得它。最后,將結果數組添加到視圖上下文中,并讓 Mustache 呈現它。Mustache 模板如下所示:清單 6. index.mustache SearchAdd#songs id - getS - getSource.year #getHighlightFields - #lyrics.getFragments #./. /lyrics.getFra

32、gments /getHighlightFields /songs突出顯示高級查詢和匹配內容要支持突出顯示更高級的查詢和匹配內容,可以使用/search,如下所示:清單 7. 搜索和突出顯示Spark.get(/search, (request, response) - SearchRequestBuilder srb = client.prepareSearch(music).setTypes(lyrics); String lyricParam = request.queryParams(query); QueryBuilder lyricQuery = null; if (lyricPa

33、ram != null & lyricParam.trim().length() 0) lyricQuery = QueryBuilders.matchQuery(lyrics, lyricParam); String artistParam = request.queryParams(artist); QueryBuilder artistQuery = null; if (artistParam != null & artistParam.trim().length() 0) artistQuery = QueryBuilders.matchQuery(artist, artistPara

34、m); if (lyricQuery != null & artistQuery = null) srb.setQuery(lyricQuery).addHighlightedField(lyrics, 0, 0); else if (lyricQuery = null & artistQuery != null) srb.setQuery(artistQuery); else if (lyricQuery != null & artistQuery != null) srb.setQuery(QueryBuilders.andQuery(artistQuery, lyricQuery).ad

35、dHighlightedField(lyrics, 0, 0); SearchResponse searchResponse = srb.execute().actionGet();SearchHit hits = searchResponse.getHits().getHits(); Map attributes = new HashMap(); attributes.put(songs, hits); return new ModelAndView(attributes, index.mustache);, new MustacheTemplateEngine();在清單 7 中,要注意的第一個有趣的 API 用法是QueryBuilders.matchQuery(lyrics, lyricParam);。這是您設置對lyrics字段的查詢的地方。另外要注意的是QueryBuilders.andQuery(artistQuery, lyricQuery),它是將查詢的artist和lyrics部分合并到 AND 查詢中的一種方法。.addHighlightedField(lyrics, 0, 0);調用告訴 Elasticsearch 生成lyrics字段上的搜索命中突出顯示結果。第二和第三個參數分別指定無線大小的分段和無限數量的分段。在呈現搜索結果時,將突出顯示結果放

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論