天天看點

ElasticSearch官方提供的Java用戶端API來實作模糊查詢并統計

作者:HerrZhang18
  1. 添加 Elasticsearch 依賴

在 pom.xml 檔案中添加 Elasticsearch 依賴:

<dependency>
  <groupId>org.elasticsearch</groupId>
  <artifactId>elasticsearch</artifactId>
  <version>7.12.1</version>
</dependency>           
  1. 配置 Elasticsearch 用戶端連接配接資訊

在 application.properties 檔案中配置 Elasticsearch 用戶端連接配接資訊:

spring.elasticsearch.rest.uris=http://localhost:9200           
  1. 建立一個 Elasticsearch 實體類

建立一個 Java 類來表示 Elasticsearch 索引中的資料,例如:

public class MyDocument {
    private String id;

    private String title;

    private String content;

    // 省略 getter 和 setter 方法
}           
  1. 實作模糊查詢并統計

在 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 來實作模糊查詢和統計功能。

繼續閱讀