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