搜索解决方案elasticsearch入门案例(代码摘要)

JavaRest 高级客户端简介

elasticsearch 存在三种Java客户端。
1. Transport Client
2. Java Low Level Rest Client(低级rest客户端)
3. Java High Level REST Client(高级rest客户端)

这三者的区别是:
TransportClient没有使用RESTful风格的接口,而是二进制的方式传输数据。
ES官方推出了Java Low Level REST Client,它支持RESTful。但是缺点是因为
TransportClient的使用者把代码迁移到Low Level REST Client的工作量比较大。
ES官方推出Java High Level REST Client,它是基于Java Low Level REST Client的封
装,并且API接收参数和返回值和TransportClient是一样的,使得代码迁移变得容易
并且支持了RESTful的风格,兼容了这两种客户端的优点。强烈建议ES5及其以后的
版本使用Java High Level REST Client。

准备工作:新建工程,引入依赖

<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch‐rest‐high‐level‐client</artifactId>
<version>6.5.3</version>
</dependency>
package demo;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.apache.http.HttpHost;
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.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.Test;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class test {
    /**
     * 新增和修改数据
     * 插入单条数据:
     * HttpHost : url地址封装
     * RestClientBuilder: rest客户端构建器
     * RestHighLevelClient: rest高级客户端
     * IndexRequest: 新增或修改请求
     * IndexResponse:新增或修改的响应结果
     * 如果ID不存在则新增,如果ID存在则修改
     *
     * 批处理请求:
     * BulkRequest: 批量请求(用于增删改操作)
     * BulkResponse:批量请求(用于增删改操作)
     * @throws IOException
     */
    @Test
    public void test1() throws IOException {
//     1.  连接rest接口
        HttpHost http = new HttpHost("127.0.0.1", 9200, "http");
        RestClientBuilder builder = RestClient.builder(http);//rest构建器
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);// 高级客户端对象

//    2.封装请求对象
        IndexRequest indexRequest = new IndexRequest("sku", "doc", "3");
        Map skuMap = new HashMap();
        skuMap.put("name", "华为p30pro");
        skuMap.put("brandName", "华为");
        skuMap.put("categoryName", "手机");
        skuMap.put("price", 1010221);
        skuMap.put("createTime", "2019-05-01");
        skuMap.put("saleNum", 101021);
        skuMap.put("commentNum", 10102321);
        Map spec = new HashMap();
        spec.put("网络制式", "移动4G");
        spec.put("屏幕尺寸", "5");
        skuMap.put("spec", spec);
        indexRequest.source(skuMap);

//        3 .获取响应结果
        IndexResponse response = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
        int status = response.status().getStatus();
        System.out.println(status);
        restHighLevelClient.close();
    }

    /**
     * 匹配查询
     * SearchRequest: 查询请求对象
     * SearchResponse:查询响应对象
     * SearchSourceBuilder:查询源构
     * MatchQueryBuilder:匹配查询构
     * @throws IOException
     */
    @Test
    public void test2() throws IOException {
//     1.  连接rest接口
        HttpHost http = new HttpHost("127.0.0.1", 9200, "http");
        RestClientBuilder builder = RestClient.builder(http);//rest构建器
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);// 高级客户端对象

//    2.封装请求对象
        SearchRequest searchRequest = new SearchRequest("sku");
        searchRequest.types("doc");// 设置查询类型
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "华为");
        searchSourceBuilder.query(matchQueryBuilder);
        searchRequest.source(searchSourceBuilder);

//        3 .获取响应结果
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits searchHits = searchResponse.getHits();
        long totalHits = searchHits.getTotalHits();
        System.out.println("总记录数:" + totalHits);
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            System.out.println(source);
        }
        restHighLevelClient.close();
    }

    /**
     * 布尔与词条查询
     * BoolQueryBuilder:布尔查询构建器
     * TermQueryBuilder:词条查询构建器
     * QueryBuilders:查询构建器工厂
     * @throws IOException
     */
    @Test
    public void test3() throws IOException {
//     1.  连接rest接口
        HttpHost http = new HttpHost("127.0.0.1", 9200, "http");
        RestClientBuilder builder = RestClient.builder(http);//rest构建器
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);// 高级客户端对象

//    2.封装请求对象
        SearchRequest searchRequest = new SearchRequest("sku");
        searchRequest.types("doc");// 设置查询类型
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();// 布尔查询构建器
        //   匹配查询
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "手机");
        boolQueryBuilder.must(matchQueryBuilder);
        //   词条查询
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("brandName", "华为");
        boolQueryBuilder.must(termQueryBuilder);
        searchSourceBuilder.query(boolQueryBuilder);
        searchRequest.source(searchSourceBuilder);

//        3 .获取响应结果
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits searchHits = searchResponse.getHits();
        long totalHits = searchHits.getTotalHits();
        System.out.println("总记录数:" + totalHits);
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            System.out.println(source);
        }
        restHighLevelClient.close();
    }

    /**
     * 过滤查询
     * @throws IOException
     */
    @Test
    public void test4() throws IOException {
//     1.  连接rest接口
        HttpHost http = new HttpHost("127.0.0.1", 9200, "http");
        RestClientBuilder builder = RestClient.builder(http);//rest构建器
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);// 高级客户端对象

//    2.封装请求对象
        SearchRequest searchRequest = new SearchRequest("sku");
        searchRequest.types("doc");// 设置查询类型
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();//  布尔查询构建器
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "华为");

         boolQueryBuilder.filter(matchQueryBuilder);
        searchSourceBuilder.query(boolQueryBuilder);
        searchRequest.source(searchSourceBuilder);

//        3 .获取响应结果
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits searchHits = searchResponse.getHits();
        long totalHits = searchHits.getTotalHits();
        System.out.println("总记录数:" + totalHits);
        SearchHit[] hits = searchHits.getHits();
        for (SearchHit hit : hits) {
            String source = hit.getSourceAsString();
            System.out.println(source);
        }
        restHighLevelClient.close();
    }

    /**
     * 分组(聚合)查询
     * AggregationBuilders:聚合构建器工厂
     * TermsAggregationBuilder:词条聚合构建器
     * Aggregations:分组结果封装
     * Terms.Bucket: 桶
     * @throws IOException
     */
    @Test
    public void test5() throws IOException {
//     1.  连接rest接口
        HttpHost http = new HttpHost("127.0.0.1", 9200, "http");
        RestClientBuilder builder = RestClient.builder(http);//rest构建器
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);// 高级客户端对象

//    2.封装请求对象
        SearchRequest searchRequest = new SearchRequest("sku");
        searchRequest.types("doc");// 设置查询类型
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("sku_category").field("categoryName");
        searchSourceBuilder.aggregation(termsAggregationBuilder);
        searchSourceBuilder.size(0);
        searchRequest.source(searchSourceBuilder);

//        3 .获取响应结果
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        Aggregations aggregations = searchResponse.getAggregations();
        Map<String, Aggregation> asMap = aggregations.getAsMap();
        Terms terms  =(Terms) asMap.get("sku_category");
        List<? extends Terms.Bucket> buckets = terms.getBuckets();
        for (Terms.Bucket bucket : buckets) {
            System.out.println(bucket.getKeyAsString()+":"+bucket.getDocCount());
        }
        restHighLevelClient.close();
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值