- 添加 Elasticsearch 依賴
在 pom.xml 檔案中添加 Elasticsearch 依賴:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.12.1</version>
</dependency>
- 配置 Elasticsearch 用戶端連接配接資訊
在 application.properties 檔案中配置 Elasticsearch 用戶端連接配接資訊:
spring.elasticsearch.rest.uris=http://localhost:9200
- 建立一個 Elasticsearch 實體類
建立一個 Java 類來表示 Elasticsearch 索引中的資料,例如:
public class MyDocument {
private String id;
private String title;
private String content;
// 省略 getter 和 setter 方法
}
- 實作模糊查詢并統計
在 Spring Boot 應用程式中,可以使用 Elasticsearch 官方提供的 Java 用戶端 API 來執行搜尋,并使用 SearchResponse 對象來擷取搜尋結果。然後,使用 SearchHit 對象将結果轉換為 MyDocument 對象,并使用 AggregationBuilders 來實作統計功能,例如:
String searchTerm = "search term";
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200)));
SearchRequest searchRequest = new SearchRequest("my-index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("title", searchTerm));
searchSourceBuilder.size(0);
TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("group_by_content").field("content.keyword").size(10);
searchSourceBuilder.aggregation(aggregationBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
List<MyDocument> documents = Arrays.stream(searchResponse.getHits().getHits())
.map(hit -> {
MyDocument document = new MyDocument();
document.setId(hit.getId());
document.setTitle(hit.getSourceAsMap().get("title").toString());
document.setContent(hit.getSourceAsMap().get("content").toString());
return document;
})
.collect(Collectors.toList());
Terms groupByContent = searchResponse.getAggregations().get("group_by_content");
List<String> contentTerms = groupByContent.getBuckets().stream()
.map(bucket -> bucket.getKeyAsString())
.collect(Collectors.toList());
long totalCount = searchResponse.getHits().getTotalHits().value;
Map<String, Long> countByContent = groupByContent.getBuckets().stream()
.collect(Collectors.toMap(bucket -> bucket.getKeyAsString(), bucket -> bucket.getDocCount()));
// 按照 content 統計的結果
System.out.println("Count by content:");
countByContent.forEach((content, count) -> System.out.println(content + ": " + count));
// 總共的比對數
System.out.println("Total count: " + totalCount);
在這個示例中,我們使用 RestHighLevelClient 對象建立一個 Elasticsearch 用戶端連接配接,并使用 SearchRequest 和 SearchSourceBuilder 對象建構一個搜尋請求。然後,執行搜尋請求并将結果轉換為 MyDocument 對象。接着,使用 AggregationBuilders 建構一個分組統計聚合,以擷取比對查詢的文檔總數和按内容分組的計數。
在上述示例中,我們使用 matchQuery 來進行模糊查詢,這将搜尋 title 字段中包含指定搜尋術語的文檔。我們使用 size(0) 來避免擷取實際搜尋結果,因為我們隻對搜尋結果進行統計和聚合。使用 AggregationBuilders 建構 TermsAggregationBuilder 對象,以按 content 字段的值進行分組,使用 size(10) 限制傳回的分組數為 10 個。
在 SearchResponse 對象中,我們使用 getHits() 方法擷取實際的搜尋結果,并使用 getAggregations() 方法擷取分組統計結果。使用 getTotalHits().value 擷取實際搜尋結果的總數。
最後,我們使用 Stream API 将 SearchHit 對象轉換為 MyDocument 對象,并将分組統計結果轉換為 Map 對象以便于展示。您可以根據自己的需求自定義搜尋查詢和分組統計條件。
希望這可以幫助您開始使用 Elasticsearch 官方提供的 Java 用戶端 API 來實作模糊查詢和統計功能。