2.5(ElasticSearch)高级操作

本文详细介绍了Elasticsearch的高级操作,包括批量增删改查、数据导入、索引映射、多种查询方式如matchAll、term、wildcard、regexp、prefix等,以及排序、聚合查询和索引重建。同时,通过Java代码示例展示了如何在实际开发中应用这些操作。
摘要由CSDN通过智能技术生成

高级操作

批量操作-脚本

Bulk批量操作是将文档的增删改查一系列操作。通过一次请求全部做完,减少网络传输次数

这一组文档的增删改查命令,其中一个失败,不会影响其他的命令

增删改的语法

在这里插入图片描述

批量操作java代码

将请求的方式,通过java封装后的代码,来操作

 @Test
    public void BulkTest()throws  Exception{
//        创建BulkRequest对象整合所有操作
        BulkRequest bulkRequest = new BulkRequest();

/*
        删除1号记录
        添加6号记录
        修改3号记录,名称为三号
*/

//        删除操作传入Bulk
        DeleteRequest deleteboot01 = new DeleteRequest("boot01", "1");
        bulkRequest.add(deleteboot01);

//        新增操作传入Bulkbulktest
        Map<String,Object> map = new HashMap<>();
        map.put("name","6号");
        IndexRequest insetboot01 = new IndexRequest("boot01").id("6").source(map);
        bulkRequest.add(insetboot01);

//        更新操作传入Bulk
        Map<String,Object> map2 = new HashMap<>();
        map2.put("name","三号");
        UpdateRequest updateboot01 = new UpdateRequest("boot01","3").doc(map2);
        bulkRequest.add(updateboot01);

//        将Bulk放入客户端进行执行
        restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT);

    }

数据导入

我们想要使用ES进行查询操作,就需要将我们的数据库信息添加到我们的ES中

实现步骤

  1. 创建 指定(数据库中数据表) 对应(Es的索引)
  2. 对索引的映射进行指定
  3. 查询数据库中的表数据
  4. 批量添加到ES中

小拓展

我们在商品表中,经常会看到商品的规格

但是每一类的商品规格是不同的。

我们可以将规格信息通过JSON的形式存储到数据库中

在这里插入图片描述

对应的索引映射

数据库需要对应索引映射编写,我们在编写索引映射的时候。

只需要对属性的,类型和是否分词进行指定即可

在这里插入图片描述

在这里插入图片描述

# 创建一个索引,指定映射
# 属性 propertyId 类型是integer
# 属性 propertyName 类型是可分词字符串
# 并且指定分词器是 ik的max_word
# 属性 propertyCategoryId 类型是integer
PUT property/_mapping
{
  "properties":{
    "propertyId":{
      "type":"integer"
    },
    "propertyName":{
      "type":"text",
      "analyzer":"ik_max_word"
    },
    "propertyCategoryId":{
      "type":"integer"
    }
  }
}

具体示例

通过前面的学习

  1. 数据库查询到对象
  2. 对象转换为JSON
  3. 将数据作为文档放入索引
引入依赖
  <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.4</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.18</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1</version>
        </dependency>
Mybatis-plus的yaml


spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: ok
    url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8


#Mybatis-Plus的配置
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 配置在控制台打印 sql语句
  # 配置自定义sql语句的 *mapper.xml 文件位置
  mapper-locations: classpath:**/mapper/**.xml
实体类和数据访问层

在这里插入图片描述

@Mapper
public interface PropertyDao extends BaseMapper<Property> {
}

测试类

主要的操作都是在测试类中

这里我在添加数据前没有去创建索引

直接进行添加会及进行自动创建

  @Test
    public void getList() throws Exception{
        //        创建BulkRequest对象整合所有操作
        BulkRequest bulkRequest = new BulkRequest();

//        Mybatis-plus获取对象集合
        List<Property> properties = propertyDao.selectList(null);

//        遍历对象集合放入 Bulk
        for (Property property : properties) {
//            将获取的对象转为json
            String str = JSON.toJSONString(property);

            long propertyId = property.getPropertyId();
            String strPropertyId = String.valueOf(propertyId);
//            得到添加文档
//            传入JSON的时候要带入指定的文档类型
            IndexRequest insetboot01 = new IndexRequest("tabletest").id(strPropertyId).source(str,XContentType.JSON);
//            放入Bulk中
            bulkRequest.add(insetboot01);
        }

        //        将Bulk放入客户端进行执行
        restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT);

    }

结果

在这里插入图片描述

matchAll查询

match_all也是查询所有数据

如果不写参数默认就是带着这个参数的

GET 索引/_search 

默认ES展示10条数据

在这里插入图片描述

查询结果

在这里插入图片描述

java操作

 /**
    * 查询所有
     * matchALL
     * 将查询结果封装为  对象List集合中
     * ES分页操作,展示10条数据
    * */
    @Test
    public void testMatchAll()throws Exception{
//        指定索引。表示查询请求对象
        SearchRequest searchRequest = new SearchRequest("property");
//        创建查询条件构造器
        SearchSourceBuilder builder = new SearchSourceBuilder();

        //        ---------------------------------
//        带入分页信息
//        from 从0开始去10个
        builder.from(0);
        builder.size(10);
        //        ---------------------------------

//        表示查询所有的数据
        MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
//        将查询条件带入 条件构造器
        builder.query(matchAllQueryBuilder);
//        将条件构造器带入 查询请求对象中
        searchRequest.source(builder);

        //        ---------------------------------

//        查询请求对象带入 客户端得到  查询结果
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//        通过结果获取,查询的数据结果
        SearchHits hits = search.getHits();
//        获取总记录数
        long value = hits.getTotalHits().value;
        System.out.println("总记录数:"+value);

//        获取所有数据
        SearchHit[] hits1 = hits.getHits();
//        循环遍历数据转换,打印
        for (SearchHit hit : hits1) {
//            source数据转换字符串
            String sourceAsString = hit.getSourceAsString();
            Property property = JSON.parseObject(sourceAsString, Property.class);
            System.out.println("对象的名称:"+property.getPropertyName());
        }


    }

结果展示

确实做到了分页的功能。并且查询出现

在这里插入图片描述

term查询

Kibana的方式

在这里插入图片描述

java

  @Test
    public void testTerm()throws Exception{
//        指定索引。表示查询请求对象
        SearchRequest searchRequest = new SearchRequest("property");
//        创建查询条件构造器
        SearchSourceBuilder builder = new SearchSourceBuilder();
//        表示查询所有的数据
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("propertyName", "风");
//        将查询条件带入 条件构造器
        builder.query(termQueryBuilder);
//        将条件构造器带入 查询请求对象中
        searchRequest.source(builder);

        //        ---------------------------------

//        查询请求对象带入 客户端得到  查询结果
        SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//        通过结果获取,查询的数据结果
        SearchHits hits = search.getHits();
//        获取总记录数
        long value = hits.getTotalHits().value;
        System.out.println("总记录数:"+value);

//        获取所有数据
        SearchHit[] hits1 = hits.getHits();
//        循环遍历数据转换,打印
        for (SearchHit hit : hits1) {
//            source数据转换字符串
            String sourceAsString = hit.getSourceAsString();
            Property property = JSON.parseObject(sourceAsString, Property.class);
            System.out.println("对象的名称:"+property.getPropertyName());
        }
    }

在这里插入图片描述

match查询

match和term在于是否对条件进行分词

kibana

在这里插入图片描述

java代码

只需要在条件位置改动即可


        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("propertyName", "风格");
//        将查询条件带入 条件构造器
        builder.query(matchQueryBuilder);
//        将条件构造器带入 查询请求对象中
        searchRequest.source(builder);

在这里插入图片描述

模糊查询

wildcard查询

会对查询条件进行分词,还可以使用通配符

  1. ?:任意单个字符
  2. *:0或多个字符
示例

在这里插入图片描述

java
//wildcard
        WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("属性", "表达式");
//regexp
        PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("属性", "前缀");
//prefix
        RegexpQueryBuilder regexpQueryBuilder = QueryBuilders.regexpQuery("属性", "表达式");

regexp查询

正则表达式

示例

在这里插入图片描述

java
//wildcard
        WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("属性", "表达式");
//regexp
        PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("属性", "前缀");
//prefix
        RegexpQueryBuilder regexpQueryBuilder = QueryBuilders.regexpQuery("属性", "表达式");

prefix查询

前缀查询

示例

在这里插入图片描述

java
//wildcard
        WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("属性", "表达式");
//regexp
        PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("属性", "前缀");
//prefix
        RegexpQueryBuilder regexpQueryBuilder = QueryBuilders.regexpQuery("属性", "表达式");




范围查询

比如我们需要查询价格区间。可以使用范围查询

对数据类型的数据进行取值范围的操作

示例

在这里插入图片描述

java

//        指定索引。表示查询请求对象
        SearchRequest searchRequest = new SearchRequest("property");
//        创建查询条件构造器
        SearchSourceBuilder builder = new SearchSourceBuilder();



//        指定属性的条件
        RangeQueryBuilder range = QueryBuilders.rangeQuery("属性");
//        指定最小
        range.gte(2000);
//        指定最大
        range.gte(3000);


//        将查询条件带入 条件构造器
        builder.query(range);
//        将条件构造器带入 查询请求对象中
        searchRequest.source(builder);

排序

我们在操作的时候想要排序。

示例

在这里插入图片描述

java

//        指定索引。表示查询请求对象
        SearchRequest searchRequest = new SearchRequest("property");
//        创建查询条件构造器
        SearchSourceBuilder builder = new SearchSourceBuilder();



//        指定属性的条件
        RangeQueryBuilder range = QueryBuilders.rangeQuery("属性");
//        指定最小
        range.gte(2000);
//        指定最大
        range.gte(3000);


//        将查询条件带入 条件构造器
        builder.query(range);
        
//----------------------排序操作--------------------------
       builder.sort("指定属性", SortOrder.ASC);
        
//        将条件构造器带入 查询请求对象中
        searchRequest.source(builder);



QueryString

在这里插入图片描述

查询条件可以是多个,进行拼接的形式

示例

queryString:支持连接符

simple_query_string:不支持连接符

在这里插入图片描述

java

QueryStringQueryBuilder field = QueryBuilders.queryStringQuery("查询条件").field("属性").field("属性");

布尔查询

将多个查询连接起来,拼接为一个大查询(多条件的查询)

比如多个分类,就需要多个查询进行拼接

在这里插入图片描述

示例

在这里插入图片描述

聚合查询

  1. 指标聚合:相当于Mysql的聚合函数。max,min,avg,sum
  2. 桶聚合:相当于Mysql的group by操作,不要对text类型的数据进行分组。会失败

示例

指标聚合

在使用之后,在kibana的结果最后给出聚合的结果g)

在这里插入图片描述

分组聚合

表示根据指定的 属性进行分组。

根据品牌分组。展示前100个

在这里插入图片描述

java

添加聚合条件

在这里插入图片描述

查询聚合结果

在这里插入图片描述

重建索引

随着业务需求,索引的结构可能发生变化

ElasticSearch的索引一旦创建,只允许添加字段,不允许改变索引,因为改变字段,需要重新建立倒排索引,影响内部缓存结构,性能低

此时:需要重新建一个新的索引,将原有索引的数据导入到新的索引中

示例

可以做到将一个索引中的内容传入到另外一个中。

在java代码中的操作。通过指定索引进行操作。当我们改变索引,就需要在代码中也进行改动。

在这里插入图片描述

索引别名

我们可以给索引去一个别名,在java中去指定这个别名从而进行操作。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值