|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

 

 

posted on   yanqi_vip  阅读(12)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示