|NO.Z.00038|——————————|BigDataEnd|——|Hadoop&ElasticSearch.V38|——|ELK.v38|集群|Java API定版ES.V6|
一、环境准备
### --- 查询操作:准备数据
~~~ # 添加数据一:
POST /es_test/_doc/1
{
"name": "hadoop添加文档",
"description": "hadoop技术栈",
"studymodel":"online",
"pic": "http://www.baidu.com", "price":56.6
}
~~~ # 添加数据二:
POST /es_test/_doc/2
{
"name": "es添加文档",
"description": "es技术栈",
"studymodel":"offline",
"pic": "wwww.google.com",
"price":66.6
}
### --- 聚合操作报错解决方案
~~~ # 解决方案一:在kibana中执行
PUT /book/_mapping
{
"properties": {
"name": {
"type": "text",
"analyzer":"ik_max_word",
"fielddata": true
}
}
}
二、Java API操作ES:编程定版文件
### --- 依赖插件:定版文件:pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.yanqi.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.3.0</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.3.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
<!--log4j2依赖添加 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.5</version>
</dependency>
<!--es.client.V7.9.0版本依赖添加 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.9.0</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.9.0</version>
</dependency>
</dependencies>
</project>
### --- 导入依赖数据:log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-mm-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
### --- 编程程序文件:ECSDemo
package com.yanqi.es;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.Avg;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.Map;
public class ESDemo {
// 步骤一:准备一个highlevel client
RestHighLevelClient client;
@Before
public void init() {
final RestHighLevelClient highLevelClient = new RestHighLevelClient( RestClient.builder(
new HttpHost("hadoop01", 9200, "http"),
new HttpHost("hadoop02", 9200, "http"),
new HttpHost("hadoop03", 9200, "http")
));
// System.out.println(highLevelClient.cluster().toString());
client = highLevelClient;
}
// 最后步骤:关闭客户端
@After
public void destory() {
if (client != null) {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 步骤二:方法一:创建索引
@Test
public void createIndex() { final CreateIndexRequest indexRequest = new CreateIndexRequest("es_test");
//准备mapping映射信息
String str = "{\n" +
" \"settings\": {},\n" +
" \"mappings\": {\n" +
" \"properties\": {\n" +
" \"description\": {\n" +
" \"type\": \"text\",\n" +
" \"analyzer\": \"ik_max_word\"\n" +
" },\n" +
" \"name\": {\n" +
" \"type\": \"text\"\n" +
" },\n" +
" \"pic\": {\n" +
" \"type\": \"text\",\n" +
" \"index\": false\n" +
" },\n" +
" \"studymodel\": {\n" +
" \"type\": \"text\"\n" +
" }\n" +
" }\n" +
" }\n" +
" }";
//把映射信息添加到request对象中
indexRequest.source(str, XContentType.JSON);
//创建索引
try { final CreateIndexResponse createIndexResponse = client.indices().create(indexRequest, RequestOptions.DEFAULT);
final boolean acknowledged = createIndexResponse.isAcknowledged();
System.out.println("创建结果:" + acknowledged);
} catch (IOException e) { e.printStackTrace();
}
}
// 步骤三:方法二:创建索引
@Test
public void createIndex2() throws IOException { final CreateIndexRequest indexRequest = new CreateIndexRequest("es_test");
//准备mapping映射信息
// String str = "{\n" +
// "
// " \"mappings\": {\n" +
// " \"properties\": {\n" +
// " \"description\": {\n" +
// " \"type\": \"text\",\n" +
// " \"analyzer\": \"ik_max_word\"\n" +
// " },\n" +
// " \"name\": {\n" +
// " \"type\": \"text\"\n" +
// " },\n" +
// " \"pic\": {\n" +
// " \"type\": \"text\",\n" +
// " \"index\": false\n" +
// " },\n" +
// " \"studymodel\": {\n" +
// " \"type\": \"text\"\n" +
// " }\n" +
// " }\n" +
// " }\n" +
// " }";
// 把映射信息添加到request对象中
// 指定setting信息
indexRequest.settings( Settings.builder()
.put("index.number_of_shards", 5)
.put("index.number_of_replicas", 1)
);
//指定mapping信息
final XContentBuilder xContentBuilder = XContentFactory.jsonBuilder();
xContentBuilder.startObject();
xContentBuilder.startObject("properties");
xContentBuilder.startObject("description")
.field("type", "text")
.field("analyzer", "ik_max_word")
.endObject(); xContentBuilder.startObject("name")
.field("type", "text")
.endObject(); xContentBuilder.startObject("pic")
.field("type", "text")
.field("index", "false")
.endObject(); xContentBuilder.startObject("studymodel")
.field("type", "text")
.endObject(); xContentBuilder.endObject(); xContentBuilder.endObject(); indexRequest.mapping(xContentBuilder);
//创建索引
try {
final CreateIndexResponse createIndexResponse = client.indices().create(indexRequest, RequestOptions.DEFAULT);
final boolean acknowledged = createIndexResponse.isAcknowledged();
System.out.println("创建结果:" + acknowledged);
} catch (IOException e) { e.printStackTrace();
}
}
// 步骤四:删除索引
@Test
public void deleteIndex() throws IOException {
//创建一个删除索引的请求
final DeleteIndexRequest indexRequest = new DeleteIndexRequest("es_test");
final AcknowledgedResponse delete = client.indices().delete(indexRequest, RequestOptions.DEFAULT);
System.out.println(delete.isAcknowledged());
}
// 步骤五:文档操作;添加doc
@Test
public void addDoc() throws IOException {
//准备一个添加文档的对象
final IndexRequest indexRequest = new IndexRequest("es_test").id("1");
/*
{
"name": "spark添加文档",
"description": "spark技术栈",
"studymodel":"online",
"pic": "http://www.baidu.com"
}
*/
//准备文档内容
String str = " {\n" +
" \"name\": \"spark添加文档\",\n" +
" \"description\": \"spark技术栈\",\n" +
" \"studymodel\":\"online\",\n" +
" \"pic\": \"http://www.baidu.com\"\n" +
" }";
indexRequest.source(str, XContentType.JSON);
//执行添加动作
final IndexResponse index = client.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(index.status());
}
// 步骤六:添加doc查询文档
@Test
public void getDoc() throws IOException {
//准备一个查询的reqeust请求
final GetRequest getRequest = new GetRequest("es_test");
//设定id he
getRequest.id("1");
//执行查询
final GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
final Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
System.out.println(sourceAsMap);
}
// 步骤七:查询所有文档
@Test
public void getAllDoc() throws IOException {
// 构建一个searchRequest对象
final SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("es_test");
//指定查询条件 matchall
final SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query( QueryBuilders.matchAllQuery());
searchRequest.source(sourceBuilder);
//执行检索 RequestOptions options参数: 请求选项(例如请求头),如果不需要自定义任何内容,使用
final RequestOptions aDefault = RequestOptions.DEFAULT;
final SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
//解析响应结果
final RestStatus status = response.status();
System.out.println("查询结果状态:" + status);
final SearchHits hits = response.getHits();
final SearchHit[] hits1 = hits.getHits();
for (SearchHit searchHit : hits1) {
System.out.println("----------------------------");
final Map<String, Object> map = searchHit.getSourceAsMap();
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.println("查询的字段:" + entry.getKey() + "; 字段value:" + entry.getValue());
}
}
}
// 步骤八:查询操作:termquery
@Test
public void termQuery() throws IOException {
//根据关键字 不分词检索
final SearchRequest searchRequest = new SearchRequest("es_test");
//sourcebuilder
final SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//指定检索的类型
sourceBuilder.query(QueryBuilders.termQuery("studymodel", "online"));
//添加sourcebuilder
searchRequest.source(sourceBuilder);
//执行查询
final SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
//解析response
final RestStatus status = response.status();
System.out.println("查询结果状态:" + status);
final SearchHits hits = response.getHits();
final SearchHit[] hits1 = hits.getHits();
for (SearchHit searchHit : hits1) { System.out.println("----------------------------");
final Map<String, Object> map = searchHit.getSourceAsMap();
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.println("查询的字段:" + entry.getKey() + "; 字段value:" + entry.getValue());
}
}
}
// 步骤九:查询操作:分页查询
@Test
public void getAllDocWithPage() throws IOException {
// 构建一个searchRequest对象
final SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("es_test");
//指定查询条件 matchall
final SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchAllQuery());
//指定分页
sourceBuilder.from(0);
sourceBuilder.size(1);
searchRequest.source(sourceBuilder);
//执行检索 RequestOptions options参数: 请求选项(例如请求头),如果不需要自定义任何内容,使用
RequestOptions aDefault = RequestOptions.DEFAULT;
final SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
//解析响应结果
final RestStatus status = response.status();
System.out.println("查询结果状态:" + status);
final SearchHits hits = response.getHits();
final SearchHit[] hits1 = hits.getHits();
for (SearchHit searchHit : hits1) {
System.out.println("----------------------------");
final Map<String, Object> map = searchHit.getSourceAsMap();
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.println("查询的字段:" + entry.getKey() + "; 字段value:" + entry.getValue());
}
}
}
// 步骤十:查询操作:对返回的source字段进行过滤
@Test
public void searchWithLimit() throws IOException {
// 构建一个searchRequest对象
final SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("es_test");
//指定查询条件 matchall
final SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchAllQuery());
//准备两个数组,包含,不包含
final String[] includesArr = {"name"};
final String[] excludesArr = {}; sourceBuilder.fetchSource(includesArr, excludesArr); searchRequest.source(sourceBuilder);
//执行检索 RequestOptions options参数: 请求选项(例如请求头),如果不需要自定义任何内容,使用
RequestOptions aDefault = RequestOptions.DEFAULT;
final SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
//解析响应结果
final RestStatus status = response.status(); System.out.println("查询结果状态:" + status);
final SearchHits hits = response.getHits();
final SearchHit[] hits1 = hits.getHits();
for (SearchHit searchHit : hits1) { System.out.println("----------------------------");
final Map<String, Object> map = searchHit.getSourceAsMap();
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.println("查询的字段:" + entry.getKey() + "; 字段value:" + entry.getValue());
}
}
}
// 步骤十一:查询操作:排序 sort
@Test
public void searchWithSort() throws IOException {
// 构建一个searchRequest对象
final SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("book");
//指定查询条件 matchall
final SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//指定排序规则
sourceBuilder.sort(new FieldSortBuilder("price").order( SortOrder.DESC)); sourceBuilder.query(QueryBuilders.matchAllQuery());
searchRequest.source(sourceBuilder);
//执行检索 RequestOptions options参数: 请求选项(例如请求头),如果不需要自定义任何内容,使用
RequestOptions aDefault = RequestOptions.DEFAULT;
final SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
//解析响应结果
final RestStatus status = response.status(); System.out.println("查询结果状态:" + status);
final SearchHits hits = response.getHits();
final SearchHit[] hits1 = hits.getHits();
for (SearchHit searchHit : hits1) { System.out.println("----------------------------");
final Map<String, Object> map = searchHit.getSourceAsMap();
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.println("查询的字段:" + entry.getKey() + "; 字段value:" + entry.getValue());
}
}
}
// 步骤十二:查询操作:聚合分析
// 按照name分组,对组内计算一个avg的price
@Test
public void searchAgg() throws IOException {
// 构建一个searchRequest对象
final SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("book");
//指定查询条件 matchall
final SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//指定聚合分析的规则
final TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("name_group").field("name");
aggregationBuilder.subAggregation(AggregationBuilders.avg("avg_price").field("price"));
sourceBuilder.aggregation(aggregationBuilder);
searchRequest.source(sourceBuilder);
//执行检索 RequestOptions options参数: 请求选项(例如请求头),如果不需要自定义任何内容,使用
RequestOptions aDefault = RequestOptions.DEFAULT;
final SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//解析响应结果
final Terms name_group = searchResponse.getAggregations().get("name_group");
for (Terms.Bucket bucket : name_group.getBuckets()) {
final Object key = bucket.getKey();
final Avg avg_price = bucket.getAggregations().get("avg_price");
System.out.println("name:" + key + ",平均价格:" + avg_price.getValue());
}
}
}
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv025-elk
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通