返回

从JAVA程序员的视角开启Elasticsearch8的探索之旅

后端

从java程序员的视角,学习和实践elasticsearch,首先要做的不是准备环境或编写hello world,而是回顾经典,回溯经典代码库,领略设计之美。

本篇将与读者一同回顾elasticsearch-java 8.5.1版本的代码库,探究其设计理念,解读其代码结构,并以实际案例对其进行分析和应用。

1. 环境搭建

首先,我们需要搭建一个Elasticsearch 8.5.1的开发环境。这里推荐使用Docker,因为它简单易用,而且可以跨平台使用。

# 安装 Docker
curl -fsSL https://get.docker.com/ | sh

# 启动 Docker
sudo service docker start

# 拉取 Elasticsearch 镜像
docker pull elasticsearch:8.5.1

# 运行 Elasticsearch 容器
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch:8.5.1

稍等片刻,Elasticsearch 8.5.1的容器就启动好了,然后创建了对应的index,最后用 java 程序连接es进行数据写入、更新和检索等操作。

2. 创建索引

import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;

public class CreateIndex {

    public static void main(String[] args) throws IOException {
        // 创建 RestHighLevelClient
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")
                )
        );

        // 创建索引请求
        IndexRequest request = new IndexRequest("my_index");

        // 设置索引数据
        String json = "{" +
                "\"name\": \"John Doe\"," +
                "\"age\": 30" +
                "}";
        request.source(json, XContentType.JSON);

        // 执行索引请求
        client.index(request, RequestOptions.DEFAULT);

        // 关闭 RestHighLevelClient
        client.close();
    }
}

3. 搜索数据

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;

public class SearchData {

    public static void main(String[] args) throws IOException {
        // 创建 RestHighLevelClient
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")
                )
        );

        // 创建搜索请求
        SearchRequest request = new SearchRequest("my_index");

        // 设置搜索条件
        request.query(QueryBuilders.matchQuery("name", "John Doe"));

        // 执行搜索请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 获取搜索结果
        SearchHit[] hits = response.getHits().getHits();

        // 打印搜索结果
        for (SearchHit hit : hits) {
            System.out.println(hit.getSourceAsString());
        }

        // 关闭 RestHighLevelClient
        client.close();
    }
}

4. 分析数据

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.AvgAggregationBuilder;

public class AnalyzeData {

    public static void main(String[] args) throws IOException {
        // 创建 RestHighLevelClient
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")
                )
        );

        // 创建搜索请求
        SearchRequest request = new SearchRequest("my_index");

        // 设置搜索条件
        request.query(QueryBuilders.matchAllQuery());

        // 设置聚合条件
        TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("age_groups").field("age");
        AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("average_age").field("age");
        termsAggregationBuilder.subAggregation(avgAggregationBuilder);
        request.aggregations(termsAggregationBuilder);

        // 执行搜索请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 获取聚合结果
        TermsAggregation termsAggregation = response.getAggregations().get("age_groups");

        // 打印聚合结果
        for (Terms.Bucket bucket : termsAggregation.getBuckets()) {
            System.out.println(bucket.getKeyAsString() + ": " + bucket.getDocCount() + ", average age: " + bucket.getAggregations().get("average_age"));
        }

        // 关闭 RestHighLevelClient
        client.close();
    }
}

5. 扩展阅读

总结

本文从Java开发人员的角度出发,带领读者领略Elasticsearch 8.5.1的魅力。文章涵盖了从环境搭建到创建索引、搜索、分析数据的全过程,兼具实用性与趣味性,帮助读者快速上手Elasticsearch 8.5.1。