ES基本语法的Java客户端操作

导包

<!-- fastjson 对象和json转换 -->
<dependency>
       <groupId>com.alibaba</groupId>
       <artifactId>fastjson</artifactId>
       <version>1.2.58</version>
</dependency>
<!--es 高级版本操作坐标-->
<dependency>
       <groupId>org.elasticsearch.client</groupId>
       <artifactId>elasticsearch-rest-high-level-client</artifactId>
       <version>6.8.3</version>
</dependency>
<!--es依赖-->
<dependency>
       <groupId>org.elasticsearch</groupId>
       <artifactId>elasticsearch</artifactId>
       <version>6.8.3</version>
</dependency>

先准备一份数据库和表

PUT /root02
{
  "mappings": {
    "product": {
      "properties": {
        "id": {
          "type": "keyword"
        },
        "title": {
          "type": "text",
          "analyzer": "ik_max_word"
        },
        "category": {
          "type": "keyword"
        },
        "brand": {
          "type": "keyword"
        },
        "images": {
          "type": "keyword",
          "index": false
        },
        "price": {
          "type": "double"
        }
      }
    }
  }
}

创建一个对应的实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product {

    private Long id;

    /**
     * 标题
     */
    private String title;

    /**
     * 分类
     */
    private String category;

    /**
     *    品牌
     */
    private String brand;

    /**
     *  价格
     */
    private Double price;

    /**
     * 图片地址
     */
    private String images;
   
}

这里的案例使用测试类进行

1.增删改和简单查

API

java连接至es

RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("x.x.x.x", 9200, "http")));

增删改和简单查

//新增
IndexRequest indexRequest = new IndexRequest("root02", "product", "1");

//根据id查询
GetRequest getRequest = new GetRequest("root02", "product", "1");

//修改数据
final UpdateRequest updateRequest = new UpdateRequest("root02", "product", "1");

//删除根据id
DeleteRequest deleteRequest = new DeleteRequest("root02", "product", "1");

//批量添加
BulkRequest bulkRequest = new BulkRequest();

使用

public class TestClass {
    RestHighLevelClient client;

    @BeforeEach
    public void before() {
        client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("62.234.118.219", 9902, "http")));
    }

    /*
        文档新增
     */
    @Test
    public void add() throws IOException {
        //1.创建请求对象
        /*
            第一个参数: 索引库名称
            第二个参数: 类型名称
            第三个参数: 可选项,id
         */
        IndexRequest indexRequest = new IndexRequest("root02", "product", "1");
        //2.准备数据---》json
        Product product = new Product(1L, "小米手机", "手机", "小米", 2699.00, "http://www.baidu.com");
        String jsonString = JSON.toJSONString(product);
        //3.将数据封装到请求对象
        indexRequest.source(jsonString, XContentType.JSON);
        //4.发送请求
        IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
        //5.打印结果
        System.out.println("结果: " + indexResponse);
    }

    /*
    根据id查询文档
    */
    @Test
    public void getById() throws IOException {
        //1.创建查询对象并且设置查询id
        GetRequest getRequest = new GetRequest("root02", "product", "1");
        //2.发送请求
        final GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT);
        System.out.println(documentFields);
    }

    /*
    修改文档
   */
    @Test
    public void updateDocById() throws IOException {
        final UpdateRequest updateRequest = new UpdateRequest("root02", "product", "1");
        //2.组装修改内容---》json
        Product product = new Product(1L, "大米手机", "手机", "大米", 19999.00, "http://www.baidu.com");
        String jsonString = JSON.toJSONString(product);
        //3.将修改内容封装到修改对象
        updateRequest.doc(jsonString, XContentType.JSON);
        final UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT);
        System.out.println(update);
    }

    //删除文档
    @Test
    public void delById() throws IOException {
        //1.创建删除对象
        DeleteRequest deleteRequest = new DeleteRequest("root02", "product", "1");
        //2.发送请求
        DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
        System.out.println("结果: " + deleteResponse);
    }

    /*
        批量新增
    */
    @Test
    public void batchAddDoc() throws IOException {
        //1.创建批量请求对象
        BulkRequest bulkRequest = new BulkRequest();
        //2.for循环创建对象----》IndexRequest---》json
        for (long i = 2; i < 10; i++) {
            IndexRequest indexRequest = new IndexRequest("root02", "product", i + "");
            //2.准备数据---》json
            Product product = new Product(i, "小米手机" + i, "手机", "小米", 2699.00 + i, "http://www.baidu.com");
            String jsonString = JSON.toJSONString(product);
            //3.将数据封装到请求对象
            indexRequest.source(jsonString, XContentType.JSON);
            //4.将IndexRequest封装到批量请求对象
            bulkRequest.add(indexRequest);
        }
        //4.发送请求
        BulkResponse bulkResponse = null;
        bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println("结果: " + bulkResponse);
    }

    @AfterEach
    public void close() throws IOException {
        client.close();
    }
}

2.复杂查询

//创建searchRequest请求对象
RestHighLevelClient client;

//创建searchRequest请求对象
SearchRequest searchRequest = new SearchRequest("root02");

//创建searchSourceBuilder对象--》封装查询对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

核心对象

QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
//封装了各种查询方法

对象关系

  SearchRequest -->封装 SearchSourceBuilder -->封装 QueryBuilder

  RestHighLevelClient --> 携带封装好的 SearchRequest 发送请求

使用

public class Test02 {
    RestHighLevelClient client;
    //1.创建searchRequest请求对象
    SearchRequest searchRequest = new SearchRequest("root02");
    //2.创建searchSourceBuilder对象-->封装查询对象
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

    @BeforeEach
    public void before() {
        client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("62.234.118.219", 9902, "http")));
    }

    /*
        查询所有
     */
    @Test
    public void matchAll() throws IOException {
        //创建查询对象QueryBuilder
        QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
        //封装查询对象
        searchSourceBuilder.query(queryBuilder);
        //searchSourceBuilder封装到searchRequest对象中
        searchRequest.source(searchSourceBuilder);
        showContext();
    }

    /*
    模糊匹配查询
 */
    @Test
    public void matchDoc() throws IOException {
        //3.创建查询对象
        QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "小米");
        searchSourceBuilder.query(queryBuilder);
        searchRequest.source(searchSourceBuilder);
        //发送请求
        showContext();
    }

    /*
    精确查询,一般用于查询不分词字段
    */
    @Test
    public void term() throws IOException {
        QueryBuilder queryBuilder = QueryBuilders.termQuery("price", 2706);
        searchSourceBuilder.query(queryBuilder);
        searchRequest.source(searchSourceBuilder);
        showContext();
    }

    //排序,高亮,分页查询
    @Test
    public void commons() throws IOException {
        QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "小米");
        searchSourceBuilder.query(queryBuilder);
         /*
            排序
        //默认升序排序
            分页:
                size: 页大小
                from: 起始索引位置 int start = (pagenum -1) * pagesize_
            高亮:设置条件
                前置标签:
                后置标签:
                高亮字段:
         */
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags("<span color='red'>");
        highlightBuilder.postTags("</span>");
        highlightBuilder.field("title");
        searchSourceBuilder.sort("price", SortOrder.ASC).from(4).size(2).highlighter(highlightBuilder);
        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        //7.解析结果
        SearchHits searchHits = searchResponse.getHits();
        if (null != searchHits) {
            SearchHit[] hits = searchHits.getHits();
            for (SearchHit hit : hits) {
                String sourceAsString = hit.getSourceAsString();
                System.out.println("查询结果:" + sourceAsString);
                    /*
                        高亮结果解析
                     */
                Map<String, HighlightField> highlightFields = hit.getHighlightFields();
                if (!highlightFields.isEmpty()) {
                    Text title = highlightFields.get("title").getFragments()[0];
                    System.out.println("高亮结果: " + title);
                }
            }
        }
    }

    //封装请求和打印数据
    public void showContext() throws IOException {
        //发送请求
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        //解析结果
        SearchHits searchHits = searchResponse.getHits();
        if (null != searchHits) {
            SearchHit[] hits = searchHits.getHits();
            for (SearchHit hit : hits) {
                String sourceAsString = hit.getSourceAsString();
                System.out.println("查询结果:" + sourceAsString);
            }
        }
    }

    @AfterEach
    public void close() throws IOException {
        client.close();
    }
}

 

posted @ 2020-10-22 11:41  一半人生  阅读(1279)  评论(0编辑  收藏  举报