ElasticSearch增删改查、高亮、分页、复杂查询--实战

ElasticSearch增删改查、高亮、分页、复杂查询--实战,第1张

ElasticSearch增删改查、高亮、分页、复杂查询--实战 一、ES介绍篇 ES简介
  • Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎。可以近乎实时地快速存储、搜索和分析大量数据。底层使用的是Lucene。

ES优点
  • 分布式的功能

  • 数据高可用,集群高可用

  • 相比Lucene,隐藏了复杂性,提供简单的API

  • 支持PB级别的数据

  • 数据分析能力

索引擎原理
  • 反向索引又叫倒排索引,是根据文章内容中的关键字建立索引,索引擎原理就是建立反向索引。

  • 以前是根据ID查内容,倒排索引之后是根据内容查ID,然后再拿着ID去查询出真正需要的东西。

  • Elasticsearch 在 Lucene 的基础上进行封装,每一个集群节点都是一个Lucene,实现了分布式搜索引擎。

  • Elasticsearch 中的索引和文档的概念比较重要,类似于 MySQL 中的数据表和行(7.x版本后移除了type类型(Elasticsearch7.X为什么移除类型(type) - wangzhen3798 - 博客园))。

  • Elasticsearch 也是 Master-slave 架构,也实现了数据的分片和备份。 (Elasticsearch-数据的存储、搜索(干货) - 嘣嘣嚓 - 博客园)

  • Elasticsearch 一个典型应用就是 ELK 日志分析系统。

典型应用场景:E L K
  • E就是ElasticSearch,L就是Logstach,K就是kibana

  • E:EalsticSearch 搜索和分析的功能

  • L:Logstach 搜集数据的功能,是日志收集系统

  • K:Kibana 数据可视化(分析),可以用图表的方式来去展示的数据可视化平台

index 索引
  • ES中的索引非传统索引的含义,ES中的索引是存放数据的地方,是ES中的一个概念词汇,index类似于我们Mysql里面的一张表。

document:文档
  • 文档就是最终的数据了,可以认为一个文档就是一条记录。是ES里面最小的数据单元,就好比表里面的一条数据,文档以JSON表示

Field 字段
  • 好比关系型数据库表中字段的概念

shard:分片
  • 一台服务器,无法存储大量的数据,ES把一个index里面的数据,分为多个shard,分布式的存储在各个服务器上面

replica:副本

  • 一个分布式的集群可能存在服务器宕机的情况,为了保证数据的安全,引入了replica的概念,可以保证数据的安全。

  • 在ES集群中,一模一样的数据有多份,能正常提供查询和插入的分片我们叫做 primary shard,其余的我们就管他们叫做 replica shard(备份的分片)

分片存储
  • 在默认情况下,当创建一个索引库的时候,会创建5个主分片(primary shrad)和5个副分片(replica shard),所以说正常情况下是有10个分片

  • 同一个节点上面,副本和主分片是一定不会在一台机器上面的,就是拥有相同数据的分片,是不会在同一个节点上面的

  • 所以当你有一个节点的时候,这个分片是不会把副本存在这仅有的一个节点上的,当你新加入了一台节点,ES会自动的给你在新机器上创建一个之前分片的副本

  • 这样的存储方式能保证集群状态下部分节点挂点而不影响数据的查询做到高可用

数据类型
  • 字符串

    1. text ⽤于全⽂索引,搜索时会自动使用分词器进⾏分词再匹配

    2. keyword 不分词,搜索时需要匹配完整的值

  • 数值型

    1. 整型: byte,short,integer,long

    2. 浮点型: float, half_float, scaled_float,double

  • 日期类型

    1. date(不推荐,可以使用long类型存储时间戳)

  • 布尔值

    1. boolean

  • ⼆进制

    1. binary

  • 复杂数据类型

    1. Object: object(单个JSON对象)

    2. Nested: nested(JSON对象数组)

  • 地理数据类型

    1. Geo-point: geo_point (纬度/经度积分)

    2. Geo-shape: geo_shape (用于多边形等复杂形状)

  • 特殊数据类型

    • ......

二、ES *** 作篇 索引
  • 创建索引

  • 查询索引信息

  •  

  • 删除索引

  •  

文档
  • 添加文档

  •  

  • 查询文档

  •  

  • 返回文档信息详解

  •  

  • 更新文档--方式一

  •  

  • 在更新文档后可以看到右侧的“version”和“result”都发生了变化,每当修改文档的时候,"version"都会+1,"result"也会显示出对应的 *** 作类型。 这种方法虽然简单暴力,但是也有他的缺点 缺点:在第一次添加记录时,这里添加的是"name"、“age”、“comment”,当我们对这条记录进行修改时,如果我们只输入"name"、“age”,那么对应的"comment"字段就会消失,也就是说这条记录会被无条件覆盖。

  • 更新文档--方式二(推荐)

  •  

  • 复杂查询

  • must ——所有的语句都 必须(must) 匹配,与 AND 等价。 must_not ——所有的语句都 不能(must not) 匹配,与 NOT 等价。 should ——至少有一个语句要匹配,与 OR 等价。 filter——必须匹配,运行在非评分&过滤模式。 就这么简单! 当我们需要多个过滤器时,只须将它们置入 bool 过滤器的不同部分即可。

  •  

    • 等同于mysql查询:

    • select * from video_info where

    • fans_num>=50000 and fans_num<=99999

    • and

    • (summary like '%555%' or comment_content like '%555%' or title like '%555%' or tags like '%555%')

    • order by publish_time desc limit 0,20

  • 高亮查询

  • 更多查询

三、ES辅助应用 Kibana

ES-Head

 

四、Tips
  • match 、 match_phrase 匹配规则
    • match在查询时ES会先将查询的字符串进行分词,然后根据分词去匹配搜索

    • match_phrase在查询时ES也会先将查询的字符串进行分词,然后根据分词去匹配搜索,不同的是结果只保留全匹配的文档

    • 举例:

    • match : "宝马法拉利" , 返回结果:"宝马法拉利兰博基尼" 、 "宝马兰博基尼布加迪威龙"

    • match_phrase :"宝马法拉利" , 返回结果:"宝马法拉利兰博基尼"

  • date日期类型

    • PUT test_666 { "mappings": { "properties": { "create_time": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" } } } }

    • 迁移数据时java的日期类型【new Date()】可直接存储到es,而且查询返回到java层也是Date类型,并且在kibana查询时也是显示格式化后的日期

    • 但问题出现在排序上,格式化后的日期为字符串类型,ES字符串排序无效,除非在字符串字段创建倒序索引(将消耗不必要的资源),后将日期全部改为long类型

  • 分组查询

  • 用作品找UP主需要根据kolId分组查询,返回去重后的数据,使用collapse进行去重

  • 问题:数据已经返回了去重后的数据,但count还是未去重前的总数

  • "collapse": { "field": "kolId" }

  • 解决:增加aggs cardinality返回去重后的后的count

  • "aggs": { "kolId": { "cardinality": { "field": "kolId" } } }

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

原文地址: http://outofmemory.cn/zaji/5677533.html

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

发表评论

登录后才能评论

评论列表(0条)

保存