ElasticSearch入门到掌握(3)完结

news2024/11/26 23:27:48

文章目录

  • 三、深入 elasticsearch
    • 1.数据聚合
      • (1)聚合的分类
      • (2)DSL 实现 Bucket 聚合
      • (3)DSL 实现 Metrics 聚合
      • (4)RestAPI 实现聚合
    • 2.自动补全
      • (1)自定义分词器
      • (2)completion suggester 查询
    • 3.数据同步
      • (1)elasticsearch 与 mysql 之间的数据同步
    • 4.集群
      • (1)ES 集群的分布式存储
      • (1)ES 集群的分布式查询

三、深入 elasticsearch

1.数据聚合

(1)聚合的分类

聚合可以实现对文档数据的统计、分析、运算。聚合常见的有三类:

  • 桶( Bucket )聚合:用来对文档做分组
    • TermAggregation :按照文档字段值分组
    • Date Histogram :按照日期阶梯分组,例如一周为一组,或者一月为一组
  • 度量( Metric )聚合:用以计算一些值,比如:最大值、最小值、平均值等
    • Avg :求平均值
    • Max :求最大值
    • Min :求最小值
    • Stats :同时求 max 、 min 、 avg 、 sum 等
  • 管道( pipeline )聚合:其它聚合的结果为基础做聚合

(2)DSL 实现 Bucket 聚合

  • 现在,我们要统计所有数据中的酒店品牌有几种,此时可以根据酒店品牌的名称做聚合。
    类型为 term 类型, DSL 示例:
GET /hotel/_search
{
  "size": 0, 		//设置 size 为 0 ,结果中不包含文档,只包含聚合结果
  "aggs": { 		//定义聚合
  "brandAgg": { 	//给聚合起个名字
  "terms": { 		//聚合的类型,按照品牌值聚合,所以选择 term
  "field": "brand", //参与聚合的字段
  "size": 20 // 希望获取的聚合结果数量
      }
    }
  }
}
  • 默认情况下, Bucket 聚合会统计 Bucket 内的文档数量,记为 _count ,并且按照 _count 降序排序。
    我们可以修改结果排序方式:
GET /hotel/_search
{
  "size": 0,
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "order": {
          "_count": "asc" // 按照 _count 升序排列
        },
        "size": 20
      }
    }
  }
}
  • 限定聚合范围,默认情况下, Bucket 聚合是对索引库的所有文档做聚合,我们可以限定要聚合的文档范围,只要添加 query 条件即可。
GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "lte": 50 // 只对 50 元以下的文档聚合
      }
    }
  },
  "size": 0,
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "size": 20
      }
    }
  }
}
  • 总结:
    aggs 代表聚合,与 query 同级,此时 query 的作用是?
    • 限定聚合的的文档范围
    • 聚合必须的三要素:
      • 聚合名称
      • 聚合类型
      • 聚合字段
    • 聚合可配置属性有:
      • size :指定聚合结果数量
      • order :指定聚合结果排序方式
      • field :指定聚合字段

(3)DSL 实现 Metrics 聚合

我们要求获取每个品牌的用户评分的 min 、 max 、 avg 等值
我们可以利用 stats 聚合:

GET /hotel/_search
{
  "size": 0,
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "size": 20
      },
      "aggs": {               // 是 brands 聚合的子聚合,也就是分组后对每组分别计算
        "score_stats": {      // 聚合名称
          "stats": {          // 聚合类型,这里 stats 可以计算 min 、 max 、 avg 等
            "field": "score"  // 聚合字段,这里是 score
          }
        }
      }
    }
  }
}

结果如下:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 11,
      "relation": "eq"
    },
    "max_score": null,
    "hits": []
  },
  "aggregations": {
    "brandAgg": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "贝壳",
          "doc_count": 9,
          "score_stats": {
            "count": 9,
            "min": 43,
            "max": 43,
            "avg": 43,
            "sum": 387
          }
        },
        {
          "key": "如家",
          "doc_count": 1,
          "score_stats": {
            "count": 1,
            "min": 56,
            "max": 56,
            "avg": 56,
            "sum": 56
          }
        },
        {
          "key": "汉庭",
          "doc_count": 1,
          "score_stats": {
            "count": 1,
            "min": 12,
            "max": 12,
            "avg": 12,
            "sum": 12
          }
        }
      ]
    }
  }
}

(4)RestAPI 实现聚合

  • 组装request参数
    请添加图片描述
  • 解析response中json参数
    请添加图片描述

2.自动补全

(1)自定义分词器

  • 使用拼音分词
  • lasticsearch 中分词器( analyzer )的组成包含三部分:
    • character filters :在 tokenizer 之前对文本进行处理。例如删除字符、替换字符
    • tokenizer :将文本按照一定的规则切割成词条( term )。例如 keyword ,就是不分词;还有 ik_smart
    • tokenizer filter :将 tokenizer 输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等

(2)completion suggester 查询

elasticsearch 提供了 Completion Suggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词
条并返回。为了提高补全查询的效率,对于文档中字段的类型有一些约束:

  • 参与补全查询的字段必须是 completion 类型。
  • 字段的内容一般是用来补全的多个词条形成的数组。
// 自动补全查询
GET /hotel/_search
{
  "suggest": {
    "title_suggest": {
      "text": "s", // 关键字
      "completion": {
        "field": "brand", // 补全查询的字段
        "skip_duplicates": true, // 跳过重复的
        "size": 10 // 获取前 10 条结果
      }
    }
  }
}

3.数据同步

(1)elasticsearch 与 mysql 之间的数据同步

请添加图片描述
请添加图片描述

请添加图片描述

4.集群

(1)ES 集群的分布式存储

当新增文档时,应该保存到不同分片,保证数据均衡,那么 coordinating node 如何确定数据该存储到哪个分片呢?
elasticsearch 会通过 hash 算法来计算文档应该存储到哪个分片:
说明:

shard = hash(_routing) % number_of_shards
  • _routing 默认是文档的 id
  • 算法与分片数量有关,因此索引库一旦创建,分片数量不能修改!

请添加图片描述

(1)ES 集群的分布式查询

elasticsearch 的查询分成两个阶段:

  • scatter phase :分散阶段, coordinating node 会把请求分发到每一个分片。
  • gather phase :聚集阶段, coordinating node 汇总 data node 的搜索结果,并处理为最终结果集返回给用户。
    请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1582396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习笔记:解决拖延

1 解决拖延、减轻压力的关键心态和方法 1.1 要点梳理 拖延是因为自己一直在逃避,重点是要有效突破逃避圈,进入学习圈,扩展成长圈。 毒蛇曲线(见思维导图)中越是临近截止期限,拖延的焦虑越上升&#xff0…

MLeaksFinder报错

1.报错:FBClassStrongLayout.mm 文件:layoutCache[currentClass] ivars; 解决:替换为layoutCache[(id)currentClass] ivars; 2.编译正常但运行时出现crash indirect_symbol_bindings[i] cur->rebinding FBRetainCycleDetector iOS15 …

算法 第36天 贪心5

435 无重叠区间 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 def eraseOverlapIntervals(intervals:list)->int:if not intervals:return 0intervals.sort(keylambda x:…

ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?

前言 ASP.NET Core 内置的标识(identity)框架,采用的是 RBAC(role-based access control,基于角色的访问控制)策略,是一个用于管理用户身份验证、授权和安全性的框架。 它提供了一套工具和库&…

爬虫+RPC+js逆向---直接获取加密值

免责声明:本文仅做技术交流与学习,请勿用于其它违法行为;如果造成不便,请及时联系... 目录 爬虫RPCjs逆向---直接获取加密值 target网址: 抓包 下断点 找到加密函数 分析参数 RPC流程 一坨: 二坨: 运行py,拿到加密值 爬虫RPCjs逆向---直接获取加密值 target网址: 优志…

prometheus expected a valid start token, got “\““ (“INVALID“) while parsing:

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

C++中的数组下标可以出现越界并且不报错

C中数组越界 最近用C写算法题目的时候,突然在某个题目中发现其数组下标会出现越界的情况,但是程序似乎不会报错,百思不得其解,然后自己写了个代码测试了一下,如下图所示: 当我们访问越界地址的时候&#…

rhce复习3

DNS DNS(Domain Name System)是互联网上的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网。 DNS系统使用的是网络的查询,那么自然需要有监听的port。DNS使用的是53端口&#x…

[react] useState的一些小细节

1.无限循环 因为setState修改是异步的,加上会触发函数重新渲染, 如果代码长这样 一秒再修改,然后重新触发setTImeout, 然后再触发,重复触发循环 如果这样呢 还是会,因为你执行又会重新渲染 2.异步修改数据 为什么修改多次还是跟不上呢? 函数传参解决 因为是异步修改 ,所以…

接口日志处理类

类:ZCL_IFLOG_UTILITIES 属性:AUTH_RESULTS_LIST 类型: TY_AUTH_RESULT Private 受保护部分: PRIVATE SECTION.TYPES: BEGIN OF ty_auth_result,funcname TYPE ztall_logcfg-funcname,pass TYPE abap_bool,END OF ty_aut…

CentOS 7 升级 5.4 内核

MatrixOne 推荐部署使用的操作系统为 Debian 11、Ubuntu 20.04、CentOS 9 等 Kernel 内核版本高于 5.0 的操作系统。随着 CentOS 7 的支持周期接近尾声,社区不少小伙伴都在讨论用以替换的 Linux 操作系统,经过问卷调查,我们发现小伙伴们的操作…

测试开发-快速定位问题

写在前面 这两天工作实在是有点小忙,感觉好久没更新了,但是平时也是有感而发的比较多,今天遇到一个问题,感觉挺有意思,处理过程也非常有意义,希望能给大家一个借鉴吧。 测试平台又又又出问题了 今天一位…

【文件IO】JavaIO详解

一.文件的相关概念 什么是文件? 文件是计算机中存储信息的基本单位。文件通常指的是存储在计算机或其他数字存储设备上的一段信息的集合,这些信息可以是文本、图片、音频、视频等不同格式的数据。 文件路径: 文件的路径可以分为两类 相对路径:先指定一个"当前…

c++的STL(8) -- queue

queue容器概述 queue容器实现了实现了和队列相同结构的容器。 如图,队列这种结构有两端: 队首和队尾。 对于队列,我们添加数据只能从队尾添加,删除数据和获取数据只能从队首删除。是一种先进先出的结构。 -- 当然读取数据也只能从队首或者…

方案分享 | 嵌入式指纹方案

随着智能设备的持续发展,指纹识别技术成为了现在智能终端市场和移动支付市场中占有率最高的生物识别技术。凭借高识别率、短耗时等优势,被广泛地运用在智能门锁、智能手机、智能家居等设备上。 我们推荐的品牌早已在2015年进入指纹识别应用领域&#xff…

MUNK电源维修GmbH高频电源E230 G60/45 WRG-TFMYCT24

德国MUNK电源维修主要系列:ΡKA2,DCAC100,AS100,HS100,ESA2000, HSG2000,E230 G60/45;E230 G100,D400 G100全系列型号。 常见维修型号包括:D400 G100/75WRG-…

【四十一】【算法分析与设计】floodfill(2),130. 被围绕的区域,417. 太平洋大西洋水流问题

目录 130. 被围绕的区域 417. 太平洋大西洋水流问题 结尾 130. 被围绕的区域 给你一个 m x n 的矩阵 board ,由若干字符 X 和 O ,找到所有被 X 围绕的区域,并将这些区域里所有的 O 用 X 填充。 示例 1: 输入:board …

长基线大高差RTK定位效果分析

为了评估基于GNSS参考站网的实时高精度滑坡监测算法效果,如图2所示,本文共收集了中国西北2019年年积日第271~277共7天的4个CORS站数据,分别为LZLC、BYBY、LXDX、LXJS, 2个黑方台滑坡监测站数据HF01和HF06,其…

算法:多重背包问题dp

文章目录 一、多重背包问题特点1.1、多重背包问题的特征1.2、解决多重背包问题的基本方法典型例题:AcWing——多重背包问题I 1.3、二进制优化1.3.1、二进制优化的思想1.3.2、多重背包问题的二进制优化 一、多重背包问题特点 多重背包问题是背包问题的又一变种&…

大厂设计师倾心推荐的在线作图免费网站

在当今数字时代,绘画已经成为各行各业的必备技能。无论你是设计师、学生、创作者还是业余爱好者,免费的在线绘图软件都是发挥创造力和表达想法的理想选择。本文将介绍七款强大免费的在线绘图软件,让你轻松实现自己的创作梦想。你可以在不安装…