返回
从JAVA程序员的视角开启Elasticsearch8的探索之旅
后端
2023-09-09 19:14:00
从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。