用spring.data的API,ElasticsearchRestTemplate来简单操作Elasticsearch的增删改查等功能~

        写本文的目的就是分享一下我自己常用的基本方法使用,也方便我自己以后来看看~

        参考了spring官方关于ES的文档,和bilibili上的视频~!

        截至今日2022/8/5,spring官方更新到 Spring Data Elasticsearch 4.4,也就是支持Elasticsearch 7.17.4以下的版本。本人使用的ES版本是7.15.1,集群部署在linux Centos Steam上,是可以运行的,没有问题的!

       那么话不多说,开始!

目录

项目构建!

开始操作!

1.基本准备!

1.1application.properties配置

 1.2自定义mapping

2.索引index的操作

2.1创建索引

2.2删除索引

3.文档document的操作

3.1添加文档

3.2删除文档

 3.3修改文档

3.4查询文档

3.5分页查询

 结尾


项目构建!

        按照spring boot构建流程正常进行就可以。直到在要你选择依赖时,直接查找elastic,然后勾选就行了

这张图片被吞掉辣!

        创建好后,依赖长这样~

开始操作!

1.基本准备!

1.1application.properties配置

        配置你的连接,我是在linux上部署的elasticsearch

        可以配置单体的连接

spring.elasticsearch.uris=http://192.168.10.130:9200

         也可以配置集群的,之间用逗号连接就行!

spring.elasticsearch.uris=http://192.168.10.130:9200, http://192.168.10.131:9200, http://192.168.10.132:9200

        如果你的es有设置账号密码的话,还要配置他们

spring.elasticsearch.password=
spring.elasticsearch.username=

         还要好多高级配置并不是刚需,这里就不配置了

 1.2自定义mapping

        自定义索引index的mapping,也就是我们需要直接自定义一个实体类!

        要注意:

  • id要定义成String类型的!
  • id需要给注解@Id,其他字段需要给注解@Field
  • keyword不参与分词,Text可以指定分词器,我这里选用ik分词器,前提是你在下载了ik分词器!
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "book")
public class Book {
    @Id
    private String id;

    @Field(type = FieldType.Keyword)
    private String title;

    @Field(type = FieldType.Integer)
    private Integer price;

    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String info;
}

2.索引index的操作

2.1创建索引

        可以创建无mapping的;也可以创建有mapping的,就是根据刚刚创建的实体类Book来的~

//    TODO 索引的创建
    @Test
    void createIndex() {
//        使用IndexOperations操作
        IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(Book.class);
//        创建索引,无mapping
        boolean createResult = indexOperations.create();
        System.out.println("索引创建" + createResult);
//        自定义mapping
//        根据类中注解自动产生mapping
        Document mapping = indexOperations.createMapping(Book.class);
        boolean mappingResult = indexOperations.putMapping(mapping);
        System.out.println("mapping创建" + mappingResult);
    }

        看看是否创建成功~

    @Test
    void YO(){
        IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(Book.class);
        Map<String, Object> mapping = indexOperations.getMapping();
        System.out.println("Book mapping:" + mapping);
    }

出现以下,就是成功辣:

Book mapping:{properties={price={type=integer}, _class={index=false, type=keyword, doc_values=false}, title={type=keyword}, info={analyzer=ik_max_word, type=text}}} 

2.2删除索引

        删索引前,可以判断一下存不存在~

//    TODO 索引的删除
    @Test
    void delIndex(){
        IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(Book.class);
//        判断存不存在索引
        if (indexOperations.exists()){
            indexOperations.delete();
            System.out.println("删除成功!");
        }
        else {
            System.out.println("没有此索引,删除失败!");
        }
    }

3.文档document的操作

3.1添加文档

        可以指定id,也可以不指定,不指定ES会自己帮你生成

    @Test
//    TODO 添加文档 Document
    void addDoc(){
        Book book = new Book(null, "秃头修炼手册", 998, "你,渴望力量吗?");
        Book save = elasticsearchRestTemplate.save(book);
        System.out.println(save);
    }

效果如下:

Book(id=RERVbIIBMBIlA2IGq_0r, title=秃头修炼手册, price=998, info=你,渴望力量吗?)

3.2删除文档

        根据id删除文档 

    @Test
//    TODO 删除文档 Document
    void delDoc(){
        String delete = elasticsearchRestTemplate.delete("RURebIIBMBIlA2IGNP3r", Book.class);
        System.out.println(delete);
    }

 3.3修改文档

        第一种是全量替换的更新文档,和上面添加文档save是一样的,这边就不多说了

        还有一种是局部更新,就像下面一样,只更新价格

    @Test
//    TODO 局部修改/新增
    void updateDoc_aim(){
        Document document = Document.create();
        document.put("price", 98);
//        UpdateQuery.builder绑的是id
        elasticsearchRestTemplate.update(UpdateQuery.builder("1").withDocument(document).build(), IndexCoordinates.of("book"));
    }

3.4查询文档

        查询有好多种查询,可以按主键查、模糊查询、查询全部、准确查询、范围查询等等

    @Test
//    TODO 查询
    void search(){
//        主键查询
        Book book = elasticsearchRestTemplate.get("1", Book.class);
        System.out.println("主键查询:" + book);

//        模糊查询
        NativeSearchQuery query = new NativeSearchQuery(QueryBuilders.queryStringQuery("98"));
        for (SearchHit<Book> search : elasticsearchRestTemplate.search(query, Book.class)) {
            System.out.println("模糊查询:" + search.getContent());
        }

//        matchAll 查询全部
        NativeSearchQuery query1 = new NativeSearchQuery(QueryBuilders.matchAllQuery());
        for (SearchHit<Book> search : elasticsearchRestTemplate.search(query1, Book.class)) {
            System.out.println("查询全部:" + search.getContent());
        }

//        精确查询
        NativeSearchQuery query2 = new NativeSearchQuery(QueryBuilders.matchQuery("title", "夏提雅的笔记"));
        for (SearchHit<Book> search : elasticsearchRestTemplate.search(query2, Book.class)) {
            System.out.println("精确查询:" + search.getContent());
        }

//        范围查询
        NativeSearchQuery query3 = new NativeSearchQuery(QueryBuilders.rangeQuery("price").gte(900).lte(9000));
        for (SearchHit<Book> search : elasticsearchRestTemplate.search(query3, Book.class)) {
            System.out.println("范围查询:" + search.getContent());
        }
    }

        可以在kibana中查看我book的文档,对照查询结果,如下 

主键查询:Book(id=1, title=秃头修炼手册, price=98, info=你,渴望力量吗?)

模糊查询:Book(id=1, title=秃头修炼手册, price=98, info=你,渴望力量吗?)
模糊查询:Book(id=R0RtbIIBMBIlA2IGkf1H, title=秃头修炼手册, price=98, info=你,渴望力量吗?)

查询全部:Book(id=RkRebIIBMBIlA2IGRf0l, title=秃头修炼手册, price=998, info=你,渴望力量吗?)
查询全部:Book(id=1, title=秃头修炼手册, price=98, info=你,渴望力量吗?)
查询全部:Book(id=R0RtbIIBMBIlA2IGkf1H, title=秃头修炼手册, price=98, info=你,渴望力量吗?)
查询全部:Book(id=SERtbIIBMBIlA2IG5v0c, title=秃头修炼手册, price=99998, info=你,渴望力量吗?)
查询全部:Book(id=SURxbIIBMBIlA2IGfP3P, title=夏提雅的笔记, price=998, info=安兹大人好帅!)

精确查询:Book(id=SURxbIIBMBIlA2IGfP3P, title=夏提雅的笔记, price=998, info=安兹大人好帅!)

范围查询:Book(id=RkRebIIBMBIlA2IGRf0l, title=秃头修炼手册, price=998, info=你,渴望力量吗?)
范围查询:Book(id=SURxbIIBMBIlA2IGfP3P, title=夏提雅的笔记, price=998, info=安兹大人好帅!)

3.5分页查询

        分页功能也是很好用的,例子如下

//    TODO 分页与排序
    @Test
    void sortPage(){
        NativeSearchQuery query = new NativeSearchQuery(QueryBuilders.matchAllQuery());
//        查看第0页,每页2条数据,按价格递增排序
        query.setPageable(PageRequest.of(0, 2, Sort.by(Sort.Direction.ASC, "price")));
        for (SearchHit<Book> search : elasticsearchRestTemplate.search(query, Book.class)) {
            System.out.println(search.getContent());
        }
    }
}

结果如下:

Book(id=1, title=秃头修炼手册, price=98, info=你,渴望力量吗?)
Book(id=R0RtbIIBMBIlA2IGkf1H, title=秃头修炼手册, price=98, info=你,渴望力量吗?)

 结尾

        分享一下,拥抱开源

        啦啦啦

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论 1

打赏作者

ForMoree

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值