文章目录

  • 一、ElasticSearch 介绍
  • 二、环境准备
  • 三、创建Spring Boot项目导入依赖
  • 四、创建高级客户端
  • 五、基本操作
    • 索引操作
    • 文档操作
    • 批量插入数据
    • 其他操作
  • 六、总结

一、ElasticSearch 介绍

Elasticsearch 是一个分布式、高扩展、高实时的搜索与

二、环境准备

在开始开发之前,我们需要准备一些环境配置:

  • jdk 1.8 或其他更高版本
  • 开发工具 IDEA
  • 管理依赖 Maven
  • ElasticSearch环境,此处使用docker搭建,ElasticSearch 版本为7.17.7
  • Spring Boot 2.X

三、创建Spring Boot项目导入依赖

<dependencies>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-web</artifactId>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-test</artifactId>        <scope>test</scope>    </dependency></dependencies>

注意:依赖版本必须与你当前所用的版本保持一致,否则连接失败

四、创建高级客户端

新建config目录存放项目配置类

@Configurationpublic class ElasticSearchClientConfig {    @Bean    public RestHighLevelClient restHighLevelClient(){        RestHighLevelClient client = new RestHighLevelClient(                RestClient.builder(                        new HttpHost("服务器IP地址", 9200, "http")));        return client;    }}

五、基本操作

索引操作

@SpringBootTestclass DemoApplicationTests {    @Autowired    private RestHighLevelClient restHighLevelClient;    /**    * 创建索引    **/    @Test    void testCreateIndex() throws IOException {        //1.创建索引请求        CreateIndexRequest request = new CreateIndexRequest("lt");        //2.客户端执行请求IndicesClient,执行create方法创建索引,请求后获得响应        CreateIndexResponse response=                restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);        System.out.println(response);    }    /**     * 判断索引是否存在     **/    @Test    void testExistIndex() throws IOException {        //1.查询索引请求        GetIndexRequest request=new GetIndexRequest("lt");        //2.执行exists方法判断是否存在        boolean exists=restHighLevelClient.indices().exists(request,RequestOptions.DEFAULT);        System.out.println(exists ? "存在" : "消失");    }    /**     * 删除索引     **/    @Test    void testDeleteIndex() throws IOException {        //1.删除索引请求        DeleteIndexRequest request=new DeleteIndexRequest("lt");        //执行delete方法删除指定索引        AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);        System.out.println(delete.isAcknowledged() ? "删除成功" : "删除失败");    }}

文档操作

创建实体类User

@Data@NoArgsConstructor@AllArgsConstructor@ToStringpublic class User {    private String name;    private Integer age;    private String[] funny;}

文档相关操作代码

/** * 创建文档 **/@Testvoid testAddUser() throws IOException {    //1.创建对象    User user=new User("小赵",21,new String[]{"篮球","吃饭"});    //2.创建请求    IndexRequest request=new IndexRequest("lt");    //3.设置规则 PUT /lt/_doc/1    //设置文档id=6,设置超时=1s等,不设置会使用默认的    //同时支持链式编程如 request.id("6").timeout("1s");    request.id("6");    request.timeout("1s");    //4.将数据放入请求,要将对象转化为json格式    //XContentType.JSON,告诉它传的数据是JSON类型    request.source(JSONValue.toJSONString(user), XContentType.JSON);    //5.客户端发送请求,获取响应结果    IndexResponse indexResponse=restHighLevelClient.index(request,RequestOptions.DEFAULT);    System.out.println(indexResponse.toString());    System.out.println(indexResponse.status());}/** * 获取文档数据 **/@Testvoid testGetUser() throws IOException {    //1.创建请求,指定索引、文档id    GetRequest request=new GetRequest("lt","1");    GetResponse getResponse=restHighLevelClient.get(request,RequestOptions.DEFAULT);    System.out.println(getResponse);//获取响应结果    //getResponse.getSource() 返回的是Map集合    System.out.println(getResponse.getSourceAsString());//获取响应结果source中内容,转化为字符串}/** * 更新文档 **/@Testvoid testUpdateUser() throws IOException {    //1.创建请求,指定索引、文档id    UpdateRequest request=new UpdateRequest("lt","6");    User user =new User("xiaozhao",21,new String[]{"xxx","xxx"});    //将创建的对象放入文档中    request.doc(JSONValue.toJSONString(user),XContentType.JSON);    UpdateResponse updateResponse=restHighLevelClient.update(request,RequestOptions.DEFAULT);    System.out.println(updateResponse.status());}/** * 删除文档 **/@Testvoid testDeleteUser() throws IOException {    //创建删除请求,指定要删除的索引与文档ID    DeleteRequest request=new DeleteRequest("lt","6");    DeleteResponse updateResponse=restHighLevelClient.delete(request,RequestOptions.DEFAULT);    System.out.println(updateResponse.status());}

批量插入数据

/** * 批量插入数据 **/@Testvoid testBulkAddUser() throws IOException {    BulkRequest bulkRequest=new BulkRequest();    //设置超时    bulkRequest.timeout("10s");    ArrayList<User> list=new ArrayList<>();    list.add(new User("Java",25,new String[]{"内卷"}));    list.add(new User("Go",18,new String[]{"内卷"}));    list.add(new User("C",30,new String[]{"内卷"}));    list.add(new User("C++",26,new String[]{"内卷"}));    list.add(new User("Python",20,new String[]{"内卷"}));    int id=1;    //批量处理请求    for (User u :list){        //不设置id会生成随机id        bulkRequest.add(new IndexRequest("ljx666")                .id(""+(id++))                .source(JSONValue.toJSONString(u),XContentType.JSON));    }    BulkResponse bulkResponse=restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT);    System.out.println(bulkResponse.hasFailures());//是否执行失败,false为执行成功}

其他操作

@Testvoid testSearch() throws IOException {    SearchRequest searchRequest=new SearchRequest("ljx666");//里面可以放多个索引    SearchSourceBuilder sourceBuilder=new SearchSourceBuilder();//构造搜索条件    //此处可以使用QueryBuilders工具类中的方法    //1.查询所有    sourceBuilder.query(QueryBuilders.matchAllQuery());    //2.查询name中含有Java的    sourceBuilder.query(QueryBuilders.multiMatchQuery("java","name"));    //3.分页查询    sourceBuilder.from(0).size(5);    //4.按照score正序排列    //sourceBuilder.sort(SortBuilders.scoreSort().order(SortOrder.ASC));    //5.按照id倒序排列(score会失效返回NaN)    //sourceBuilder.sort(SortBuilders.fieldSort("_id").order(SortOrder.DESC));    //6.给指定字段加上指定高亮样式    HighlightBuilder highlightBuilder=new HighlightBuilder();    highlightBuilder.field("name").preTags("").postTags("");    sourceBuilder.highlighter(highlightBuilder);    searchRequest.source(sourceBuilder);    SearchResponse searchResponse=restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);    //获取总条数    System.out.println(searchResponse.getHits().getTotalHits().value);    //输出结果数据(如果不设置返回条数,大于10条默认只返回10条)    SearchHit[] hits=searchResponse.getHits().getHits();    for(SearchHit hit :hits){        System.out.println("分数:"+hit.getScore());        Map<String,Object> source=hit.getSourceAsMap();        System.out.println("index->"+hit.getIndex());        System.out.println("id->"+hit.getId());        for(Map.Entry<String,Object> s:source.entrySet()){            System.out.println(s.getKey()+"--"+s.getValue());        }    }}

六、总结

  • 依赖版本必须与你当前所用的版本保持一致,否则连接失败。
  • 如果添加时不指定文档ID,他就会随机生成一个ID,ID唯一。
  • 创建文档时若该ID已存在,发送创建文档请求后会更新文档中的数据。
  • 更新文档时需要将实体对象中的属性全部指定值,不然会被设置为空,如果只设置了一个字段,那么只有该字段会被修改成功,其他会被修改为null。
  • hasFailures()方法是返回是否失败,即它的值为false时说明上传成功
  • elasticsearch很消耗内存,极力推荐使用docker部署运行