java操作elasticsearch api实现索引及文档增删改查(非常全面)

 专属小彩蛋:前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站(前言 - 床长人工智能教程) 

福利:左侧VX扫码赚个零花钱~ 

目录

前言

一、创建User实体类

二、索引(index)的增删改查

三、文档(doc)的增删改查

四、文档(doc)的批量新增和删除

五、文档(doc)的高级查询


前言

在实际的项目开发中,我们经常要对大批量的业务数据或者日志数据进行全文检索查询,这个时候我们就可以用elasticsearch作为我们的全文检索引擎,下面我们将使用java elasticsearch 的 api 实现 索引以及文档(doc)的增删改查,包括批量新增和删除,以及组合条件,聚合,分组,高亮等高级查询都会一一以代码示例展示。

一、创建User实体类

用户具有姓名(name),年龄(age),性别(sex)三个字段

package com.example.dzx.elasticsearch;

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * @author 500007
 * @ClassName:
 * @Description:
 * @date 2022年04月29日 09:06:04
 */
@Data
@Accessors(chain = true)
public class User {
    private String name;
    private Integer age;
    private String sex;
}

二、索引(index)的增删改查

package com.example.dzx.elasticsearch;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
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.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.*;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.client.indices.GetIndexResponse;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentType;

import java.io.IOException;

/**
 * @author 500007
 * @ClassName:
 * @Description: index索引的增删改查
 * @date 2022年04月28日 20:03:49
 */
public class ESIndexOperate {
    public static void main(String[] args) throws IOException {
        //创建客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
        //索引客户端
        IndicesClient indices = restHighLevelClient.indices();
        CreateIndexRequest createIndexRequest = new CreateIndexRequest("user");
        //创建索引
        CreateIndexResponse createIndexResponse = indices.create(createIndexRequest, RequestOptions.DEFAULT);
        //响应状态
        boolean acknowledged = createIndexResponse.isAcknowledged();
        System.out.println("创建索引响应:" + acknowledged);

        //获取索引信息
        GetIndexRequest getIndexRequest = new GetIndexRequest("user");
        GetIndexResponse getIndexResponse = indices.get(getIndexRequest, RequestOptions.DEFAULT);
        System.out.println(getIndexResponse.getAliases());
        System.out.println(getIndexResponse.getMappings());
        System.out.println(getIndexResponse.getSettings());

        //删除索引信息
        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("user");
        AcknowledgedResponse acknowledgedResponse = indices.delete(deleteIndexRequest, RequestOptions.DEFAULT);
        System.out.println(acknowledgedResponse.isAcknowledged());

        //关闭客户端
        restHighLevelClient.close();

    }
}

三、文档(doc)的增删改查

package com.example.dzx.elasticsearch;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpHost;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
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.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;

import java.io.IOException;

/**
 * @author 500007
 * @ClassName:
 * @Description: 索引下doc的增删改查
 * @date 2022年04月29日 09:29:11
 */
public class ESDocOperate {
    public static void main(String[] args) throws Exception {

        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
        //插入数据
        IndexRequest request = new IndexRequest("user").id("1001");
        User user = new User();
        user.setName("zhangsan");
        user.setAge(30);
        user.setSex("男");
        ObjectMapper objectMapper = new ObjectMapper();
        String user_json = objectMapper.writeValueAsString(user);
        request.source(user_json, XContentType.JSON);
        IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
        System.out.println(response.status().getStatus());
        System.out.println(response.getResult());

        //修改数据
        UpdateRequest updateRequest = new UpdateRequest().index("user").id("1001");
        updateRequest.doc(XContentType.JSON, "sex", "女");
        UpdateResponse update = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
        System.out.println(update.status());
        System.out.println(update.getResult());

        //查询数据
        GetRequest getRequest = new GetRequest().index("user").id("1001");
        GetResponse documentFields = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
        System.out.println(documentFields.getSourceAsString());

        //删除数据
        DeleteRequest deleteRequest = new DeleteRequest().index("user").id("1001");
        DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
        System.out.println(delete.status());
        System.out.println(delete.getResult());

        //关闭客户端
        restHighLevelClient.close();
    }
}

四、文档(doc)的批量新增和删除

package com.example.dzx.elasticsearch;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpHost;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.springframework.beans.BeanUtils;

/**
 * @author 500007
 * @ClassName:
 * @Description: doc的批量新增和删除
 * @date 2022年04月29日 09:33:14
 */
public class ESBulkOperate {


    public static void main(String[] args) throws Exception {
        //创建客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
        //批量操作请求体
        BulkRequest bulkRequest = new BulkRequest();

        ObjectMapper objectMapper = new ObjectMapper();
        User user = new User().setName("zhangsan").setAge(30).setSex("男");
        String user_json = objectMapper.writeValueAsString(user);
        //插入数据请求体
        IndexRequest indexRequest = new IndexRequest("user").id("1001").source(user_json, XContentType.JSON);

        User user1 = new User().setName("lisi").setAge(31).setSex("女");
        String user_json1 = objectMapper.writeValueAsString(user);
        //插入数据请求体
        IndexRequest indexRequest1 = new IndexRequest("user").id("1002").source(user_json1, XContentType.JSON);

        //将两个插入数据请求体加入到批量操作请求体中
        bulkRequest.add(indexRequest).add(indexRequest1);
        //批量插入数据
        BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        //耗时
        System.out.println(bulk.getTook().seconds());
        //打印数据
        System.out.println(bulk.getItems());

        //批量删除操作
        BulkRequest deleteBulkRequest = new BulkRequest();
        deleteBulkRequest.add(new DeleteRequest().index("user").id("1001"));
        deleteBulkRequest.add(new DeleteRequest().index("user").id("1002"));
        BulkResponse bulkDeleteResponse = restHighLevelClient.bulk(deleteBulkRequest, RequestOptions.DEFAULT);
        System.out.println(bulkDeleteResponse.getItems());
        System.out.println(bulkDeleteResponse.getTook());
    }
}

五、文档(doc)的高级查询

package com.example.dzx.elasticsearch;

import org.apache.http.HttpHost;
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.RestHighLevelClient;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortOrder;

/**
 * @author 500007
 * @ClassName:
 * @Description: es的高级查询操作
 * @date 2022年04月29日 09:53:31
 */
public class ESSearchOperate {

    public static void main(String[] args) throws Exception {
        //创建客户端
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));

        SearchRequest request = new SearchRequest();
        request.indices("user");
        /**
         * ****************************全量查询******************************
         */
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
                .query(QueryBuilders.matchAllQuery());
        request.source(searchSourceBuilder);

        SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        //命中数据
        SearchHits hits = search.getHits();
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit searchHit : hits1) {
            System.out.println(searchHit.getSourceAsString());
        }
        //命中条数
        System.out.println(hits.getTotalHits());
        //耗时
        System.out.println(search.getTook().seconds());

        /**
         * *****************************条件查询******************************
         */
        SearchRequest termSearchRequest = new SearchRequest("user")
                .source(new SearchSourceBuilder().query(QueryBuilders.termQuery("age", 30)));
        SearchResponse termSearchResponse = restHighLevelClient.search(termSearchRequest, RequestOptions.DEFAULT);
        System.out.println(termSearchResponse.getHits());
        System.out.println(termSearchResponse.getTook());


        /**
         * *****************************分页并按照年龄排序查询******************************
         */
        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.termQuery("age", 30));
        //(当前页码-1)*页面容量
        builder.from(0)
                .size(2)
                .sort("age", SortOrder.DESC);
        SearchRequest termPageSearchRequest = new SearchRequest("user")
                .source(builder);
        SearchResponse termPageSearchResponse = restHighLevelClient.search(termPageSearchRequest, RequestOptions.DEFAULT);
        System.out.println(termSearchResponse.getHits());
        System.out.println(termSearchResponse.getTook());


        /**
         * *****************************排除字段和包含字段查询******************************
         */
        SearchSourceBuilder cludesBuilder = new SearchSourceBuilder().query(QueryBuilders.termQuery("age", 30));
        //查询返回的结果中,包含user的age字段,排除name字段
        String[] includes = {"age"};
        String[] excludes = {"name"};
        cludesBuilder.fetchSource(includes, excludes);
        SearchRequest cludesSearchRequest = new SearchRequest("user")
                .source(builder);
        SearchResponse cludesSearchResponse = restHighLevelClient.search(cludesSearchRequest, RequestOptions.DEFAULT);
        System.out.println(cludesSearchResponse.getHits());
        System.out.println(cludesSearchResponse.getTook());


        /**
         * *****************************组合查询******************************
         */
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        //姓名必须等于30,
        boolQueryBuilder.must(QueryBuilders.matchQuery("age", 30));
        //性别必须是男
        boolQueryBuilder.must(QueryBuilders.matchQuery("sex", "男"));
        //性别必须不是男
//        boolQueryBuilder.mustNot(QueryBuilders.matchQuery("sex", "男"));

        //年龄可以是30或者40
        boolQueryBuilder.should(QueryBuilders.matchQuery("age", 30));
        boolQueryBuilder.should(QueryBuilders.matchQuery("age", 40));

        SearchRequest boolQuerySearchRequest = new SearchRequest("user")
                .source(new SearchSourceBuilder().query(boolQueryBuilder));
        restHighLevelClient.search(boolQuerySearchRequest, RequestOptions.DEFAULT);


        /**
         * *****************************范围查询*****************************
         */
        RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
        rangeQueryBuilder.gte(30).lte(50);
        SearchRequest rangeQuerySearchRequest = new SearchRequest("user")
                .source(new SearchSourceBuilder().query(rangeQueryBuilder));
        restHighLevelClient.search(rangeQuerySearchRequest, RequestOptions.DEFAULT);


        /**
         * *****************************模糊查询*****************************
         */
        FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("name", "wangwu");
        //设置偏差字符长度为1,例如wangwu1,wangwu2,都可以查询出来
        fuzzyQueryBuilder.fuzziness(Fuzziness.ONE);
        //设置偏差字符长度为2,例如wangwu11,wangwu22,都可以查询出来
        fuzzyQueryBuilder.fuzziness(Fuzziness.TWO);

        SearchRequest fuzzyQuerySearchRequest = new SearchRequest("user")
                .source(new SearchSourceBuilder().query(fuzzyQueryBuilder));
        restHighLevelClient.search(fuzzyQuerySearchRequest, RequestOptions.DEFAULT);


        /**
         * *****************************高亮查询*****************************
         */
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "张三");
        SearchSourceBuilder highlightSourceBuilder = new SearchSourceBuilder();
        //设置高亮器,文本显示为红色
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags("<font color='red'>");
        highlightBuilder.preTags("</font>");
        highlightBuilder.field("name");
        highlightSourceBuilder.highlighter(highlightBuilder);

        highlightSourceBuilder.query(termQueryBuilder);

        SearchRequest highlightQuerySearchRequest = new SearchRequest("user")
                .source(highlightSourceBuilder);
        restHighLevelClient.search(highlightQuerySearchRequest, RequestOptions.DEFAULT);


        /**
         * *****************************聚合查询*****************************
         */
        SearchSourceBuilder aggSourceBuilder = new SearchSourceBuilder();
        //查询
        AggregationBuilder aggregationBuilder = AggregationBuilders.max("maxAge").field("age");
        aggSourceBuilder.aggregation(aggregationBuilder);
        SearchRequest aggQuerySearchRequest = new SearchRequest("user")
                .source(aggSourceBuilder);
        restHighLevelClient.search(highlightQuerySearchRequest, RequestOptions.DEFAULT);


        /**
         * *****************************分组查询*****************************
         */
        SearchSourceBuilder groupSourceBuilder = new SearchSourceBuilder();
        AggregationBuilder groupAggregationBuilder = AggregationBuilders.terms("ageGroup").field("age");
        groupSourceBuilder.aggregation(groupAggregationBuilder);
        SearchRequest groupQuerySearchRequest = new SearchRequest("user")
                .source(groupSourceBuilder);
        restHighLevelClient.search(groupQuerySearchRequest, RequestOptions.DEFAULT);
    }
}

至此代码演示结束,大家觉得赞的话,支持一下博主呢,记得一键三连哦!

 专属小彩蛋:前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站(前言 - 床长人工智能教程) 

  • 14
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小米吃辣椒2022

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值