2.5(ElasticSearch)高级 *** 作

2.5(ElasticSearch)高级 *** 作,第1张

2.5(ElasticSearch)高级 *** 作

文章目录
  • 高级 *** 作
    • 批量 *** 作-脚本
      • 增删改的语法
    • 批量 *** 作java代码
    • 数据导入
      • 实现步骤
      • 小拓展
      • 对应的索引映射
      • 具体示例
        • 引入依赖
        • Mybatis-plus的yaml
        • 实体类和数据访问层
        • 测试类
    • matchAll查询
      • 查询结果
      • java *** 作
    • term查询
      • Kibana的方式
      • java
    • match查询
      • kibana
      • java代码
    • 模糊查询
      • wildcard查询
        • 示例
        • java
      • regexp查询
        • 示例
        • java
      • prefix查询
        • 示例
        • java
    • 范围查询
      • 示例
      • java
    • 排序
      • 示例
      • java
    • QueryString
      • 示例
      • java
    • 布尔查询
      • 示例
    • 聚合查询
      • 示例
        • 指标聚合
        • 分组聚合
      • java
        • 添加聚合条件
        • 查询聚合结果
    • 重建索引
      • 示例
    • 索引别名

高级 *** 作 批量 *** 作-脚本

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

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

增删改的语法

批量 *** 作java代码

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

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



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

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

//        更新 *** 作传入Bulk
        Map 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. 将数据作为文档放入索引
引入依赖
  
            com.alibaba
            fastjson
            1.2.4
        

        
            mysql
            mysql-connector-java
            8.0.18
        
        
            com.baomidou
            mybatis-plus-boot-starter
            3.3.1
        
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
    @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中去指定这个别名从而进行 *** 作。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5691632.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存