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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ElasticSearch初学者教程

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

1.簡介

在此示例中,我們將演示如何使用Elasticsearch , Elasticsearch是一個基于Apache Lucene的分布式自由文本搜索和分析數(shù)據(jù)庫引擎,具有一個基于maven的簡單Java客戶端。

在撰寫本文時,我們將使用最新版本的Elasticsearch,即ES v6.1.2。 對于此示例,我們使用以下技術(shù):

  • Maven 3
  • Java 8
  • Elasticsearch 6.1.2

Elasticsearch因其通過RESTful API進(jìn)行通信的能力而聞名。

這意味著我們將使用API??以及HTTP方法(如GET,POST,PUT和DELETE)與數(shù)據(jù)庫進(jìn)行交互。

它是一個高度可擴(kuò)展的分布式數(shù)據(jù)庫,可使用Apache Lucene出色地實(shí)現(xiàn)。

有關(guān)Elasticsearch的其他一些功能包括:

  • Elasticsearch的總依賴項(xiàng)大小僅為300 KB,非常輕巧
  • Elasticsearch僅專注于查詢的性能。 這意味著無論對數(shù)據(jù)庫執(zhí)行什么操作,它們都經(jīng)過高度優(yōu)化和可擴(kuò)展
  • 這是一個高度容錯的系統(tǒng)。 如果集群中有單個Elasticsearch節(jié)點(diǎn)死亡,則主服務(wù)器將非常Swift地確定問題,并將傳入的請求盡快路由到新節(jié)點(diǎn)
  • Elasticsearch的專長在于可索引文本數(shù)據(jù),可根據(jù)標(biāo)記和過濾器進(jìn)行搜索

盡管當(dāng)使用分布式自由文本搜索和分析引擎時,Elasticsearch是一個不錯的選擇,但在進(jìn)行其他一些操作時,它可能不是最適合的數(shù)據(jù)庫:

  • 計(jì)算總數(shù)和平均值之類的運(yùn)算
  • 使用回滾執(zhí)行事務(wù)查詢
  • 管理在多個給定條件下唯一的記錄

這意味著Elasticsearch是一個基于用例的高度數(shù)據(jù)庫,但就其自己的領(lǐng)域而言卻是一個出色的數(shù)據(jù)庫。

2.先決條件

因?yàn)閙aven是Java工具,所以您必須在計(jì)算機(jī)上安裝Java才能繼續(xù)。 您可以在此處下載Java。

一旦在系統(tǒng)上安裝了Java,就必須安裝maven。 您可以從此處下載Maven。

最后,您需要安裝Elasticsearch。 您可以從此處下載它,然后按照適用于您的操作系統(tǒng)的步驟進(jìn)行操作。 請注意,本課程將使用v6.1.2。 現(xiàn)在,其他版本可能會以完全相同的方式工作。 您可以通過在瀏覽器中打開以下URL來驗(yàn)證ES是否正在運(yùn)行:

localhost:9200

您應(yīng)該得到如下響應(yīng):

{"name": "wKUxRAO","cluster_name": "elasticsearch","cluster_uuid": "gvBXz7xsS5W4zlZuiADelw","version": {"number": "6.1.2","build_hash": "5b1fea5","build_date": "2018-01-10T02:35:59.208Z","build_snapshot": false,"lucene_version": "7.1.0","minimum_wire_compatibility_version": "5.6.0","minimum_index_compatibility_version": "5.0.0"},"tagline": "You Know, for Search" }

請注意, elasticsearch是Elasticsearch中的默認(rèn)集群名稱。

3.項(xiàng)目設(shè)置

我們將使用許多Maven原型之一為我們的示例創(chuàng)建一個示例項(xiàng)目。 要創(chuàng)建項(xiàng)目,請?jiān)趯⒂米鞴ぷ骺臻g的目錄中執(zhí)行以下命令:

mvn archetype:generate -DgroupId=com.javacodegeeks.example -DartifactId=jcg-elasticsearch-example -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

如果您是第一次運(yùn)行maven,則完成生成命令將花費(fèi)幾秒鐘,因?yàn)閙aven必須下載所有必需的插件和工件才能完成生成任務(wù)。

請注意,現(xiàn)在,您將在所選目錄中擁有一個與artifactId同名的新目錄。 現(xiàn)在,隨時在您喜歡的IDE中打開項(xiàng)目。

4. Maven依賴

首先,我們需要在項(xiàng)目中添加適當(dāng)?shù)腗aven依賴項(xiàng)。 我們將以下依賴項(xiàng)添加到我們的pom.xml文件中:

pom.xml

<properties><elasticsearch.version>6.1.2</elasticsearch.version><jackson.version>2.9.4</jackson.version><java.version>1.8</java.version> </properties><dependencies><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>${elasticsearch.version}</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>${elasticsearch.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency> </dependencies>

在此處找到最新的Elasticsearch依賴項(xiàng)。

請注意,我們在代碼中僅將Jackson用作Java的標(biāo)準(zhǔn)JSON庫。

5.進(jìn)行數(shù)據(jù)庫查詢

現(xiàn)在,我們準(zhǔn)備開始構(gòu)建項(xiàng)目并向其中添加更多組件。

5.1建立模型

我們將在我們的項(xiàng)目中添加一個非常簡單的模型,即Person。 它的定義將非常標(biāo)準(zhǔn),例如:

人.java

public class Person {private String personId;private String name;//standard getters and setters@Overridepublic String toString() {return String.format("Person{personId='%s', name='%s'}", personId, name);} }

為了簡潔起見,我們省略了標(biāo)準(zhǔn)的getter和setter方法,但是由于Jackson在對象的序列化和反序列化過程中使用它們,因此必須將它們制成。

5.2定義連接參數(shù)

我們將使用默認(rèn)的連接參數(shù)與Elasticsearch建立連接。 默認(rèn)情況下,ES使用兩個端口:9200和9201。

連接參數(shù)

//The config parameters for the connection private static final String HOST = "localhost"; private static final int PORT_ONE = 9200; private static final int PORT_TWO = 9201; private static final String SCHEME = "http";private static RestHighLevelClient restHighLevelClient; private static ObjectMapper objectMapper = new ObjectMapper();private static final String INDEX = "persondata"; private static final String TYPE = "person";

除了連接配置參數(shù)外,我們還在上面定義了索引參數(shù),以標(biāo)識我們的Person數(shù)據(jù)的存儲位置。

如以上參數(shù)所述,Elasticsearch使用兩個端口9200和9201。第一個端口9200由Elasticsearch Query Server使用,我們可以使用它們通過RESTful API直接查詢數(shù)據(jù)庫。 REST服務(wù)器使用第二個端口9201 ,外部客戶端可以通過該端口連接并執(zhí)行操作。

5.3建立連接

我們將提供一種方法來建立與Elasticsearch數(shù)據(jù)庫的連接。 與數(shù)據(jù)庫建立連接時,我們必須提供兩個端口,因?yàn)橹挥羞@樣,我們的應(yīng)用程序才能連接到Elasticsearch服務(wù)器,并且我們將能夠執(zhí)行數(shù)據(jù)庫操作。 這是建立連接的代碼:

用于獲取連接對象的Singleton方法

/*** Implemented Singleton pattern here* so that there is just one connection at a time.* @return RestHighLevelClient*/ private static synchronized RestHighLevelClient makeConnection() {if(restHighLevelClient == null) {restHighLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost(HOST, PORT_ONE, SCHEME),new HttpHost(HOST, PORT_TWO, SCHEME)));}return restHighLevelClient; }

請注意,我們在此處實(shí)現(xiàn)了Singleton Design模式 ,這樣就不會為ES建立多個連接,從而節(jié)省了大量內(nèi)存。

由于存在RestHighLevelClient ,因此與Elasticsearch的連接是線程安全的。 初始化此連接的最佳時間是在應(yīng)用程序請求或向客戶端發(fā)出第一個請求時。 初始化此連接客戶端后,即可用于執(zhí)行任何受支持的API。

5.4關(guān)閉連接

就像在舊版本的Elasticsearch中一樣,我們使用TransportClient并在完成查詢后將其關(guān)閉,并且在數(shù)據(jù)庫與RestHighLevelClient的交互完成后也需要關(guān)閉連接。 這是可以做到的:

緊密連接

private static synchronized void closeConnection() throws IOException {restHighLevelClient.close();restHighLevelClient = null; }

我們還為RestHighLevelClient對象分配了null,以便Singleton模式可以保持一致。

5.5插入數(shù)據(jù)

通過將鍵和值轉(zhuǎn)換為Hashmap,可以將數(shù)據(jù)插入數(shù)據(jù)庫。 ES數(shù)據(jù)庫僅接受HashMap形式的值。 讓我們看一下如何實(shí)現(xiàn)這一點(diǎn)的代碼片段:

POST查詢

private static Person insertPerson(Person person){person.setPersonId(UUID.randomUUID().toString());Map<String, Object> dataMap = new HashMap<String, Object>();dataMap.put("personId", person.getPersonId());dataMap.put("name", person.getName());IndexRequest indexRequest = new IndexRequest(INDEX, TYPE, person.getPersonId()).source(dataMap);try {IndexResponse response = restHighLevelClient.index(indexRequest);} catch(ElasticsearchException e) {e.getDetailedMessage();} catch (java.io.IOException ex){ex.getLocalizedMessage();}return person; }

上面,我們還使用Java的UUID類來創(chuàng)建對象的唯一標(biāo)識符。 這樣,我們可以控制如何制作對象的標(biāo)識符。

5.6發(fā)出GET請求

將數(shù)據(jù)插入數(shù)據(jù)庫后,我們可以通過向Elasticsearch數(shù)據(jù)庫服務(wù)器發(fā)出GET請求來確認(rèn)操作。 讓我們看一下如何做到這一點(diǎn)的代碼片段:

GET查詢

private static Person getPersonById(String id){GetRequest getPersonRequest = new GetRequest(INDEX, TYPE, id);GetResponse getResponse = null;try {getResponse = restHighLevelClient.get(getPersonRequest);} catch (java.io.IOException e){e.getLocalizedMessage();}return getResponse != null ?objectMapper.convertValue(getResponse.getSourceAsMap(), Person.class) : null; }

在此查詢中,我們僅提供了有關(guān)可用來識別對象的主要信息,即索引,類型及其唯一標(biāo)識符。 同樣,我們得到的實(shí)際上是一個值映射,如以下表達(dá)式所示:

獲取地圖

getResponse.getSourceAsMap()

實(shí)際上是Jackson的objectMapper,用于將該Map轉(zhuǎn)換為可以在我們的程序中輕松使用的POJO Object,這樣,我們不必每個Map都構(gòu)成鍵,當(dāng)您可以時,這將是一個繁瑣的過程只是有一個POJO對象。

5.7更新數(shù)據(jù)

我們可以通過首先使用索引,類型和唯一標(biāo)識符標(biāo)識資源來輕松地向Elasticsearch發(fā)出更新請求。 然后,我們可以使用新的HashMap對象來更新Object中任意數(shù)量的值。 這是一個示例代碼片段:

PUT查詢

private static Person updatePersonById(String id, Person person){UpdateRequest updateRequest = new UpdateRequest(INDEX, TYPE, id).fetchSource(true); // Fetch Object after its updatetry {String personJson = objectMapper.writeValueAsString(person);updateRequest.doc(personJson, XContentType.JSON);UpdateResponse updateResponse = restHighLevelClient.update(updateRequest);return objectMapper.convertValue(updateResponse.getGetResult().sourceAsMap(), Person.class);}catch (JsonProcessingException e){e.getMessage();} catch (java.io.IOException e){e.getLocalizedMessage();}System.out.println("Unable to update person");return null; }

請注意以下語句中我們在上面所做的操作:

PUT查詢

updateRequest.doc(personJson, XContentType.JSON);

在這里,我們沒有傳遞需要更新的對象的任何特定屬性,而是傳遞了完整的Object JSON,它將替換該對象存在的每個鍵。

我們還通過catch語句檢查了任何可能的錯誤。 在實(shí)際的應(yīng)用程序中,您將需要適當(dāng)?shù)靥幚磉@些錯誤并制作記錄的日志。

5.8刪除數(shù)據(jù)

最后,我們可以通過簡單地用索引,類型和唯一標(biāo)識符標(biāo)識資源來刪除數(shù)據(jù)。 讓我們看一下如何做到這一點(diǎn)的代碼片段:

刪除查詢

private static void deletePersonById(String id) {DeleteRequest deleteRequest = new DeleteRequest(INDEX, TYPE, id);try {DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest);} catch (java.io.IOException e){e.getLocalizedMessage();} }

同樣,在上面的DELETE查詢中,我們僅提到了如何識別對象。

5.9運(yùn)行應(yīng)用程序

讓我們通過執(zhí)行上面提到的所有操作來嘗試我們的應(yīng)用程序。 由于這是一個普通的Java應(yīng)用程序,因此我們將調(diào)用以下每個方法并打印操作結(jié)果:

main()方法

public static void main(String[] args) throws IOException {makeConnection();System.out.println("Inserting a new Person with name Shubham...");Person person = new Person();person.setName("Shubham");person = insertPerson(person);System.out.println("Person inserted --> " + person);System.out.println("Changing name to `Shubham Aggarwal`...");person.setName("Shubham Aggarwal");updatePersonById(person.getPersonId(), person);System.out.println("Person updated --> " + person);System.out.println("Getting Shubham...");Person personFromDB = getPersonById(person.getPersonId());System.out.println("Person from DB --> " + personFromDB);System.out.println("Deleting Shubham...");deletePersonById(personFromDB.getPersonId());System.out.println("Person Deleted");closeConnection(); }

使用代碼運(yùn)行此應(yīng)用程序后,將獲得以下輸出:

節(jié)目輸出

Inserting a new Person with name Shubham... Person inserted --> Person{personId='bfc5ba80-832a-4925-9b8d-525a4e420cb0', name='Shubham'} Changing name to `Shubham Aggarwal`... Unable to update person Person updated --> Person{personId='bfc5ba80-832a-4925-9b8d-525a4e420cb0', name='Shubham Aggarwal'} Getting Shubham... Person from DB -->Person{personId='bfc5ba80-832a-4925-9b8d-525a4e420cb0', name='Shubham Aggarwal'} Deleting Shubham... Person Deleted

當(dāng)然,ID可以有所不同。 請注意,在完成查詢后,我們關(guān)閉了連接。 這有助于JVM收回由ES連接保留的內(nèi)存。

六,結(jié)論

在本課程中,我們研究了如何將Elasticsearch與使用REST客戶端的普通Java客戶端一起使用。 需要使用一個可擴(kuò)展的示例來探討選擇使用REST客戶端使其在實(shí)際應(yīng)用程序中可用。 這是我們開始構(gòu)建應(yīng)用程序時需要做出的選擇。

在我們的Elasticsearch課程中進(jìn)一步探索Elasticsearch 。

7.下載完整的源代碼

這是有關(guān)ElasticSearch REST客戶端和Java查詢的教程,我們通過RESTful操作與Elasticsearch數(shù)據(jù)庫進(jìn)行了交互。

下載
您可以在此處下載此示例的完整源代碼: Elasticsearch示例

翻譯自: https://www.javacodegeeks.com/2018/03/elasticsearch-tutorial-beginners.html

總結(jié)

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

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