走进Elasticsearch

  • 什么是ES
    • 是一个分布式、RESTful风格的搜索和数据分析引擎
  • 查询方式
    • Kibana查询(原生查询) - DSL
      • 概念:ES特定的查询语言,一套基于JSON的查询语言。
        • DSL查询直接使用Elasticsearch的API进行数据检索,所以要求用户对ES的查询机制有更深的了解
      • 特点:DSL提供了强大的查询能力,包括叶子查询字句(如match、term、range)和复合查询字句(用于将多个查询逻辑组合起来)
    • SQL编程 (对原生DSL加工)- esSQL
       
      • 概念:SQL本质上是一个翻译器,它将SQL语句翻译成Elasticsearch的原生查询DSL,默认返回的是一个JSON结构
        • 增加format参数,返回就是表格形式展现:/sql?format=txt
      • 优点:SQL是一个广义的标准查询语言,降低了学习成本。
      • 常见的坑
        • 1,查询的SQL中不允许包含 换行符 "/n"
        • 2,SQL查询筛选中带中文不生效,可以考虑升级ES的SQL版本
        • 3,查询字符串类型,SQL中需包含 ''
        • 4,如果ES服务端支持中文查询,则客户端不需要配置相关分词
        • 5,ES不建议跨index查询,如果需要跨index查询,在同步关系数据库数据时到ES,可以联合多张表查询返回的结果集到ES,毕竟一个index可以看成一个库或者一张表
      • ES-SQL安装
    • Es默认返回10000条数据,要调大服务端就要改配置
  • 基本概念
    • 索引(Index):可看成关系数据库中的 表
    • 类型(Type):可看成关系数据库中表的 数据类型
    • 文档(Document):可看成关系数据库中表的每一行
    • 映射(Mapping):类似于数据库中的“表结构定义”,在Elasticsearch中,映射可以动态创建,也可以在创建索引时预先定义。
    • 集群(Cluster):集群是由一个或多个节点组成的集合,它们共同工作以存储和搜索数据。集群可以跨多台机器分布,以实现数据的备份冗余和高可用性。
    • 节点(Node):节点是集群中的一个实例。节点可以处理数据索引、搜索和聚合等操作。
    • 分片(Shard):分片是索引的一部分,用于实现数据的分布式存储。每个分片都是一个独立的数据结构,可以在不同节点上复制和分割。
    • 副本(Replica):副本是分片的复制品,用于提高数据的可靠性和搜索性能。每个分片可以有一个或多个副本,它们可以在节点间复制数据以提供故障转移能力。
    • 倒排索引(Inverted Index):倒排索引是Elasticsearch用于快速搜索的关键数据结构,允许系统通过词汇快速找到包含该词汇的文档列表。
  • 应用场景
    • 全文搜索:如电商商品搜索、应用内搜索等。
    • 日志分析:支持全栈日志分析,从采集到展示实现秒级响应。
    • 运维监控:时序数据分析,适用于系统监控等。
    • 安全分析:分析网络数据和安全事件。
    • 数据监控:作为主要的后端存储,提供持久存储和统计功能。
  • 工作原理
    • ES的工作原理基于Lucene库,实现了准实时的搜索功能。
      • 索引过程:当文档被存储到ES中时,它将在1秒内以几乎实时的方式进行索引。这一过程包括分析文档内容,创建倒排索引等,以便能够快速检索信息。
      • 搜索过程:ES使用按段搜索的概念来执行查询。每个段相当于一个数据集,包含了一系列的文档。提交点记录了所有已知的段,使得搜索操作可以跨越多个段进行。
    • Lucene库的工作原理
      • 反向索引(Inverted Index):这是Lucene高效检索数据的关键所在。在正向索引中,我们根据内容的记录来查找内容出现的位置;而在反向索引中,是根据某个词出现的位置来查找这个词,即建立了一个从词到文档的映射关系。
      • 数据分段(Segments):Lucene将索引分为多个独立的段,每个段都是只读的。这种设计避免了在读写操作中的锁竞争,显著提高了性能。
      • 核心组件:Lucene由多个组件构成,包括IndexWriter负责写入索引、IndexReader负责读取索引,以及QueryParser用于解析查询语句等。这些组件共同作用,实现了索引的建立、查询和优化。
      • 文本分析与分词(Analysis & Tokenization):在索引文档之前,Lucene会通过分析器(Analyzer)对文本进行处理,这包括分词、去除停用词、同义词处理等步骤,以确保索引的效率和准确性。
      • 查询操作:用户输入查询后,Lucene会对查询语句进行类似的文本分析和处理,然后利用已经建立的反向索引快速找到匹配的文档,并按照相关性对结果进行排序
  • 常踩的坑
    • 聚合分析问题:ES中的聚合操作分为分桶、度量和管道三种类型。在多主分片环境下,可能会出现聚合结果不准确的情况。这是因为在分布式环境中,不同分片间的数据处理可能导致聚合结果的差异。
      • 使用更高效的查询:尝试简化查询,减少不必要的字段和复杂的查询逻辑,以提高查询效率。
      • 调整分桶策略:对于涉及大量数据和多次分桶的聚合操作,合理设计分桶策略可以减少查询时间。例如,可以考虑使用组合聚合(composite aggregations)来减少聚合的数量。
      • 优化索引设置:确保索引的映射和设置能够支持高效的聚合操作。例如,使用适当的分片和副本策略,以及优化索引的存储结构。
      • 调整内存分配:增加Elasticsearch的堆内存分配可以提高聚合操作的性能,但这可能会影响其他系统资源的使用。
      • 利用缓存:利用Elasticsearch的查询结果缓存机制,对于重复的或经常执行的聚合查询,可以将结果缓存起来,以提高响应速度。
      • 使用近似聚合:如果精确度不是特别重要,可以使用近似聚合(如cardinality aggregation)来加快查询速度。
      • 调整搜索设置:通过调整搜索设置,比如减小size参数的值,可以加快聚合查询的速度。
      • 优化去重操作:对于需要去重的聚合操作,可以尝试使用tophits聚合或者top_hits与collapse结合使用,以提高效率。
    • 时区问题:ES底层默认采用UTC时间格式,而不同地区的项目可能需要使用本地时间。这可能导致查询结果与期望不符,特别是在涉及时间排序、范围查询或聚合的场景中。
      • 确保数据一致性: 插入时间格式前,统一使用UTC时间格式,避免由于不同时区引起的混乱和不一致
      • 程序中处理时区:在Java等编程语言中处理日期时间字符串时,如果字符串没有时区信息,需要明确指定时区来进行转换,以避免默认使用系统时区可能导致的问题。
      • 存储类型考虑:对于日期时间类型的字段,存储时应考虑是否需要包含时区信息。如果是时间戳(Long类型),则通常已经是UTC时间,需要在应用层转换为合适的时区。
      • Kibana设置时区:在Kibana的管理界面中,您可以在“Management” > “Advanced Settings”下设置时区,以确保在Kibana显示的视图和图表中使用正确的时区
    • 默认映射问题:ES允许在写入索引时不设置映射,但这可能导致后续查询效率低下或数据类型错误等问题。因此,合理配置映射对于保证索引的性能和准确性至关重要(建索引时,就要考虑映射索引的类型)
  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

、小H

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值