elasticsearch使用笔记

Rest风格说明
一种软件架构风格,而不是标准。更易于实现缓存等机制

**

客户端使用规则

**
在这里插入图片描述

**

新增操作

**
保存一个数据,保存在哪个索引的哪个类型下(哪张数据库哪张表下),保存时用唯一标识指定

POST指定ID新增

在这里插入图片描述
结论:指定ID新增,如果ID一样,数据不存在,是新增;数据存在,是更新;而且_seq_no和_version 每次调用值都会发送改变

POST不指定ID新增

在这里插入图片描述
结论:不指定ID,每次点击都会自动生成ID值,而且都是新增

PUT指定id新增

在这里插入图片描述
结论:PUT可以新增也可以修改。PUT必须指定id;由于PUT需要指定id,我们一般用来做修改操作,不指定id会报错

在这里插入图片描述

返回数据:
带有下划线开头的,称为元数据,反映了当前的基本信息。
{
  "_index" : "demo", 表明该数据在哪个数据库下;
  "_type" : "person",表明该数据在哪个类型下;
  "_id" : "3", 表明被保存数据的id;
  "_version" : 1, 被保存数据的版本
  "result" : "create",数据的状态创建还是更新
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1, 而序列号"_seq_no"则可以看做是索引的信息 
  在第一次为索引插入数据时为0,每对索引内数据操作成功一次
  sqlNO加1, 并且文档会记录是第几次操作使它成为现在的情况的
  "_primary_term" : 1
  }

更新

POST带_update
只修改传入的值
在这里插入图片描述

POST不带_update
直接覆盖原先的数据
在这里插入图片描述

put操作
覆盖操作

在这里插入图片描述

删除

在这里插入图片描述

ES的批量操作——bulk

批量新增

index批量新增

在这里插入图片描述

create批量新增

在这里插入图片描述

结论

create 创建操作,如果需要创建的文档已经存在,那么创建失败
index 创建或替换操作,如果要创建的文档不存在则执行创建操作,如果已经存在则执行替换操作

批量更新

在这里插入图片描述
通过 _bulk 批量更新索引中的文档数据,其中一条更新成功,一条因为无法获取对应ID的文档,更新失败

批量删除

在这里插入图片描述

代码示例:


文档 id 更新:
public void updateBookById(String id) {
    Document document = Document.create();
    document.put("commentCount", 1214666);
    document.put("price", 66.6);
    UpdateQuery updateQuery = UpdateQuery.builder(id).withDocument(document).build();
    UpdateResponse response = elasticsearchRestTemplate.update(updateQuery, IndexCoordinates.of("book"));
    System.out.println(response.getResult().name());
}

根据多个文档 id 批量更新:
public void bulkUpdateBook(String... ids) {
    List<UpdateQuery> updateQueryList = new ArrayList<>();
    for (String id : ids) {
        Document document = Document.create();
        document.put("commentCount", 1214666);
        document.put("price", 66.6);
        UpdateQuery updateQuery = UpdateQuery.builder(id).withDocument(document).build();
        updateQueryList.add(updateQuery);
    }
    elasticsearchRestTemplate.bulkUpdate(updateQueryList, IndexCoordinates.of("book"));
}

根据文档 id 删除:
public void deleteBookById(String id) {
    String result = elasticsearchRestTemplate.delete(id, Book.class);
    System.out.println(result);
}

自定义删除条件,例如根据 skuId 删除:
public void deleteBookBySkuId(String skuId) {
    NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
            .withQuery(QueryBuilders.termQuery("skuId", skuId))
            .build();
    elasticsearchRestTemplate.delete(nativeSearchQuery, Book.class, IndexCoordinates.of("book"));
}

查询:
@Autowired
    ElasticsearchRestTemplate elasticsearchRestTemplate;

    /**
     * @param keyword 关键字
     * @param pageNum  页码从1开始
     * @param pageSize 每页数据条数
     */
    public List<Book> queryBook(String keyword, int pageNum, int pageSize) {

        BoolQueryBuilder keywordQueryBuilder = QueryBuilders.boolQuery()
                .should(QueryBuilders.matchPhraseQuery("author", keyword))
                .should(QueryBuilders.matchPhraseQuery("name", keyword));

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
                .must(keywordQueryBuilder)
                .must(QueryBuilders.rangeQuery("commentCount").gte(10));

        HighlightBuilder highlightBuilder = new HighlightBuilder()
                .field("author").field("name")
                .preTags("<span style='color:red'>")
                .postTags("</span>")
                // 如果要高亮显示的字段内容很多,需要如下配置,避免高亮显示不全、内容缺失
                .fragmentSize(1000) // 最大高亮分片数
                .numOfFragments(0);// 从第一个分片获取高亮片段

        AvgAggregationBuilder priceAvgAggregation = AggregationBuilders.avg("avgPrice").field("price");

        NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
                .withQuery(boolQueryBuilder)
                .withPageable(PageRequest.of(pageNum - 1, pageSize))
                .withFields("author", "name", "price", "commentCount")
                .withSort(new FieldSortBuilder("price").order(SortOrder.ASC))
                .withHighlightBuilder(highlightBuilder)
                .addAggregation(priceAvgAggregation)
                .build();

        // 开始查询
        SearchHits<Book> search = elasticsearchRestTemplate.search(nativeSearchQuery, Book.class);

        long totalHits = search.getTotalHits();
        long totalPage = (totalHits % pageSize == 0) ? totalHits / pageSize : totalHits / pageSize + 1;

        System.out.println("总数据条数:" + totalHits);
        System.out.println("总页数:" + totalPage);
        System.out.println("当前页码:" + pageNum);

        double avgPrice = ((Avg) search.getAggregations().get("avgPrice")).getValue();
        System.out.println("搜索到的书籍均价:" + avgPrice);

        List<Book> resultList = new ArrayList<>();
        // 解析查询结果
        for (SearchHit<Book> searchHit : search.getSearchHits()) {
            Book book = searchHit.getContent();
            if (searchHit.getHighlightFields().containsKey("author")) {
                // 提取高亮字段
                book.setAuthor(searchHit.getHighlightFields().get("author").get(0));
            }
            if (searchHit.getHighlightFields().containsKey("name")) {
                // 提取高亮字段
                book.setName(searchHit.getHighlightFields().get("name").get(0));
            }
            resultList.add(book);
            System.out.println(JSONObject.toJSONString(book));
        }

        return resultList;
    }

构造查询条件:
NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
        .withQuery(boolQueryBuilder)
        .build()

NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
        .withQuery(boolQueryBuilder)
        // 分页
        .withPageable(PageRequest.of(pageNum - 1, pageSize)) 
        // 指定查询结果包含那些文档字段
        .withFields("author", "name", "price", "commentCount")
        // 查询结果如何排序
        .withSort(new FieldSortBuilder("price").order(SortOrder.ASC))
        // 设置查询结果高亮
        .withHighlightBuilder(highlightBuilder)
        // 添加聚合查询
        .addAggregation(priceAvgAggregation)
        .build();

ElasticsearchTemplate

ElasticsearchTemplate 封装ES客户端的一些原生api模板,方便实现一些查询

elasticsearchTemplate.queryForPage   #是查询一个分页列表,用的就是一个对象实例
    NativeSearchQuery                #是springdata中的查询条件
    NativeSearchQueryBuilder         #用于建造一个NativeSearchQuery查询对象
    QueryBuilders                    #设置查询条件,是ES中的类
    SortBuilders                     #设置排序条件
    HighlightBuilder                 #设置高亮显示

QueryBuilders

QueryBuilders是ES中的查询条件构造器

QueryBuilders.boolQuery          #子方法must可多条件联查
QueryBuilders.termQuery          #精确查询指定字段
QueryBuilders.matchQuery         #按分词器进行模糊查询
QueryBuilders.rangeQuery         #按指定字段进行区间范围查询
#  大于等于      .from    .gte   
#  小于等于      .to      .lte    

NativeSearchQuery

原生的查询条件类,用来和ES的一些原生查询方法进行搭配,实现一些比较复杂的查询,最终进行构建.build 可作为ElasticsearchTemplate. queryForPage的参数使用

//构建Search对象
        NativeSearchQuery build = new NativeSearchQueryBuilder()
                //条件
                .withQuery(queryBuilder)
                //排序
                .withSort(SortBuilders.fieldSort("id").order(SortOrder.ASC))
                //高亮
                .withHighlightFields(name, ms)
                //分页
                .withPageable(PageRequest.of(pageNum - 1, pageSize))
                //构建
                .build();
 
        AggregatedPage<Goods> aggregatedPage = elasticsearchTemplate.queryForPage(build, Goods.class,new Hig());
 
//queryForPage 
			   参数一: NativeSearchQuery 封装的查询数据对象
               参数二: es对应索引实体类
               参数三: 调用高亮工具类

示例: 注意:

bulkIndex 批量索引文档更新,文档不存在就建立,存在就覆盖,如果文档原来有3个字段,批量更新时有2个字段,在bulkIndex之后,它最后会变成最新的2个字段

bulkUpdate 批量更新文档字段,如果文档原来有3个字段,批量更新时有2个字段,结果还是3个字段

.should() 相当于 or, .must() 相当于 and

 @Autowired
    ElasticsearchTemplate elasticsearchTemplate; 
 
    @RequestMapping(value = "list")
    public String list(@ModelAttribute(value = "vo") QueryVo vo, @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "5") Integer pageSize, Model model){
        //高亮显示
        String pre = "<span style='color:red'>";
        String post = "</span>";
        //指定要高亮的字段将其加上头尾标签
        HighlightBuilder.Field name = new HighlightBuilder.Field("name").preTags(pre).postTags(post);
        HighlightBuilder.Field ms = new HighlightBuilder.Field("ms").preTags(pre).postTags(post);
        //查询高亮结果不分片,不加此条会按分词器高亮显示(数据变少)
        ms.numOfFragments(1);
 
        //多查询条件  must 可不断添加条件
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        if(StringUtils.isNoneBlank(vo.getName())){
                  //精确查询
                queryBuilder.must(QueryBuilders.termQuery("name.keyword",vo.getName()));
        }
        if(StringUtils.isNoneBlank(vo.getMs())){
                  //模糊查询
                queryBuilder.must(QueryBuilders.matchQuery("ms",vo.getMs()));
        }
        //根据指定字段区间查询   from(gte) 大于等于    to(lte)  小于等于
        RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("price");
        if(vo.getStartpice() != null){
            rangeQuery.from(vo.getStartpice());
        }
        if(vo.getEndpice() != null){
            rangeQuery.to(vo.getEndpice());
        }
        queryBuilder.must(rangeQuery);
 
        //构建Search对象
        NativeSearchQuery build = new NativeSearchQueryBuilder()
                //条件
                .withQuery(queryBuilder)
                //排序
                .withSort(SortBuilders.fieldSort("id").order(SortOrder.ASC))
                //高亮
                .withHighlightFields(name, ms)
                //分页
                .withPageable(PageRequest.of(pageNum - 1, pageSize))
                //构建
                .build();
 
        AggregatedPage<Goods> aggregatedPage = elasticsearchTemplate.queryForPage(build, Goods.class,new Hig());
        //封装分页数据至list集合中
        Page<Goods> page = new Page<>(pageNum, pageSize);
        //填充分页总条数
        page.setTotal(aggregatedPage.getTotalElements());
        //封装至pageinfo内,实现列表
        PageInfo<Goods> pg = new PageInfo<>(page);
        //将es查询到当前页的数据 封装至pg中
        pg.setList(aggregatedPage.getContent());
        
        //传入前端,实现列表页面
        model.addAttribute("pg",pg);
        return "list";
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
elasticsearch 学习笔记包括以下内容: 一、Elasticsearch概述: - Elasticsearch是一种开源的分布式搜索和分析引擎,可以用于快速搜索、分析和存储大量的结构化和非结构化数据。 - Elasticsearch与Solr相比有一些区别,包括用户、开发和贡献者社区的规模和成熟度等方面。 二、Elasticsearch安装: 1. 下载Elasticsearch,可以从官方网站或华为云镜像下载。 2. 安装Elasticsearch。 三、安装head插件: - head插件是一个可视化的管理界面,可以方便地管理和监控Elasticsearch集群。 四、安装Kibana: 1. Kibana是一个开源的数据可视化工具,用于展示和分析Elasticsearch中的数据。 2. 下载Kibana并安装。 3. 启动Kibana并进行访问测试。 4. 可选的汉化操作。 五、ES核心概念理解: - 学习ES的核心概念,包括索引、文档、映射、查询等。 以上是elasticsearch学习笔记的主要内容,希望对你有帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Elasticsearch 学习笔记(上)](https://blog.csdn.net/m0_52691962/article/details/127064350)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

50W程序员都在看

qiugan

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

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

打赏作者

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

抵扣说明:

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

余额充值