Java連接Elasticsearch實戰指南

Elasticsearch是一個分散式、 RESTful風格、基於Lucene的全文搜索和分析引擎。它可以用於各種用例,例如網站搜索、日誌分析、安全情報等。

由於其性能出色和易於使用的API,越來越多的企業選擇使用Elasticsearch作為其搜索引擎。

一、連接Elasticsearch

連接Elasticsearch可以使用Java的TransportClient或Java High-Level REST Client兩種方式。

1、TransportClient

TransportClient是Elasticsearch提供的Java API,使用它可以直接連接到Elasticsearch服務。下面是一個使用TransportClient連接Elasticsearch的示例:

TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));

創建TransportClient實例時需要指定連接的地址和埠號。這裡我們可以使用默認的Settings和本地的9300埠。

2、Java High-Level REST Client

Java High-Level REST Client是Elasticsearch推薦的Java客戶端,它使用HTTP協議與Elasticsearch進行通信。下面是一個使用Java High-Level REST Client連接Elasticsearch的示例:

RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));

通過HTTP Host和埠號創建RestHighLevelClient實例。這裡我們使用本地的9200埠連接http。

二、索引操作

1、創建索引

創建索引需要指定索引名稱和索引映射。下面是一個創建名為「my_index」的索引的示例:

CreateIndexRequest request = new CreateIndexRequest("my_index");
request.mapping("doc", "field1", "type=string", "field2", "type=integer");
CreateIndexResponse response = client.indices().create(request);

創建CreateIndexRequest對象並指定索引名稱「my_index」,然後通過mapping()方法設定屬性。最後通過indices()方法的create()方法創建索引。

2、添加文檔

添加文檔需要指定索引名稱、類型和文檔ID。文檔格式一般為JSON,可以通過Map或實體類轉換得到。下面是一個添加文檔的示例:

IndexRequest request = new IndexRequest("my_index", "doc", "1");
request.source(XContentType.JSON, "field1", "value1", "field2", 2);
IndexResponse response = client.index(request);

添加文檔需要指定索引名稱、類型和文檔ID,然後通過source()方法指定文檔內容。通過index()方法添加文檔。

3、查詢文檔

查詢文檔需要指定查詢條件和索引名稱,結果一般為SearchResponse對象。下面是一個查詢文檔的示例:

SearchRequest searchRequest = new SearchRequest("my_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery("field1", "value1"));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);

查詢文檔需要指定查詢條件和索引名稱,然後通過source()方法設置查詢條件。通過search()方法查詢文檔。

三、聚合操作

1、統計文檔數量

統計文檔數量可以使用count()方法。下面是一個統計所有文檔數量的示例:

CountRequest countRequest = new CountRequest("my_index");
CountResponse countResponse = client.count(countRequest);
long count = countResponse.getCount();

通過CountRequest對象指定索引名稱,然後通過count()方法統計文檔數量。

2、按條件聚合

聚合操作可以根據條件聚合文檔。下面是一個按「field1」欄位聚合所有文檔的示例:

SearchRequest searchRequest = new SearchRequest("my_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.aggregation(AggregationBuilders.terms("by_field1").field("field1"));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);
Terms terms = searchResponse.getAggregations().get("by_field1");
for (Terms.Bucket entry : terms.getBuckets()) {
    String key = (String) entry.getKey();
    long docCount = entry.getDocCount();
}

通過AggregationBuilders對象的terms()方法指定聚合條件,結果保存在SearchResponse對象中。通過getAggregations()方法獲取所有聚合結果,然後通過get()方法獲取指定聚合結果,並使用for循環獲取聚合結果中的所有數據。

四、數據分析

1、Term Vectors

Term Vectors可以分析文檔中每個單詞的詞頻和位置等信息。下面是一個獲取Term Vectors的示例:

TermVectorsRequest request = new TermVectorsRequest("my_index", "doc", "1");
request.setFields("field1");
TermVectorsResponse response = client.termvectors(request);

通過TermVectorsRequest對象指定索引名稱、類型和文檔ID,然後通過Fields()方法設置需要分析的欄位類型。使用termvectors()方法分析文檔。

2、多關鍵字查詢

可以使用MultiMatchQuery查詢多個關鍵字。下面是一個查詢同時匹配「field1」和「field2」的文檔的示例:

SearchRequest searchRequest = new SearchRequest("my_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.multiMatchQuery("value1", "field1", "field2"));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);

通過QueryBuilders對象的multiMatchQuery()方法指定多個查詢欄位,然後使用source()方法設置查詢條件。使用search()方法查詢文檔。

3、詞條查詢

詞條查詢可以查詢特定詞條的文檔。下面是一個查詢「field1」欄位包含「value1」的文檔的示例:

SearchRequest searchRequest = new SearchRequest("my_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery("field1", "value1"));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);

通過QueryBuilders對象的termQuery()方法指定查詢欄位和關鍵字,然後使用source()方法設置查詢條件。使用search()方法查詢文檔。

以上是Java連接Elasticsearch的一些常用操作,本文介紹的示例代碼可以參考下列完整代碼:

完整代碼:

TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
        .addTransportAddress(new InetSocketTransportAddress(
                InetAddress.getByName("localhost"), 9300));

//創建索引
CreateIndexRequest request = new CreateIndexRequest("my_index");
request.mapping("doc", "field1", "type=string", "field2", "type=integer");
CreateIndexResponse response = client.indices().create(request);

//添加文檔
IndexRequest request = new IndexRequest("my_index", "doc", "1");
request.source(XContentType.JSON, "field1", "value1", "field2", 2);
IndexResponse response = client.index(request);

//查詢文檔
SearchRequest searchRequest = new SearchRequest("my_index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.termQuery("field1", "value1"));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);

//統計文檔數量
CountRequest countRequest = new CountRequest("my_index");
CountResponse countResponse = client.count(countRequest);
long count = countResponse.getCount();

//聚合操作
searchSourceBuilder.aggregation(AggregationBuilders.terms("by_field1").field("field1"));
searchRequest.source(searchSourceBuilder);
searchResponse = client.search(searchRequest);
Terms terms = searchResponse.getAggregations().get("by_field1");
for (Terms.Bucket entry : terms.getBuckets()) {
    String key = (String) entry.getKey();
    long docCount = entry.getDocCount();
}

//Term Vectors
TermVectorsRequest request = new TermVectorsRequest("my_index", "doc", "1");
request.setFields("field1");
TermVectorsResponse response = client.termvectors(request);

//多關鍵字查詢
searchSourceBuilder.query(QueryBuilders.multiMatchQuery("value1", "field1", "field2"));
searchRequest.source(searchSourceBuilder);
searchResponse = client.search(searchRequest);

//詞條查詢
searchSourceBuilder.query(QueryBuilders.termQuery("field1", "value1"));
searchRequest.source(searchSourceBuilder);
searchResponse = client.search(searchRequest);

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/152206.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-12 00:55
下一篇 2024-11-12 00:55

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • 運維Python和GO應用實踐指南

    本文將從多個角度詳細闡述運維Python和GO的實際應用,包括監控、管理、自動化、部署、持續集成等方面。 一、監控 運維中的監控是保證系統穩定性的重要手段。Python和GO都有強…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Python wordcloud入門指南

    如何在Python中使用wordcloud庫生成文字雲? 一、安裝和導入wordcloud庫 在使用wordcloud前,需要保證庫已經安裝並導入: !pip install wo…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python應用程序的全面指南

    Python是一種功能強大而簡單易學的編程語言,適用於多種應用場景。本篇文章將從多個方面介紹Python如何應用於開發應用程序。 一、Web應用程序 目前,基於Python的Web…

    編程 2025-04-29
  • Python小波分解入門指南

    本文將介紹Python小波分解的概念、基本原理和實現方法,幫助初學者掌握相關技能。 一、小波變換概述 小波分解是一種廣泛應用於數字信號處理和圖像處理的方法,可以將信號分解成多個具有…

    編程 2025-04-29
  • Python字元轉列表指南

    Python是一個極為流行的腳本語言,在數據處理、數據分析、人工智慧等領域廣泛應用。在很多場景下需要將字元串轉換為列表,以便於操作和處理,本篇文章將從多個方面對Python字元轉列…

    編程 2025-04-29

發表回復

登錄後才能評論