admin管理员组

文章数量:1530041

文章目录

  • 搜索引擎
  • Elasticsearch简介
  • ES优势
    • 引擎(搜索引擎)
    • Elasticsearch VS 数据库
      • 模糊查询
      • 结果排序
      • 正向索引 VS 倒排索引
    • 架构优势
    • 为什么可以实现快速的“模糊匹配”/“相关性查询”? =》分词 + 倒排索引
  • Lucene核心引擎
  • ELKB(ES + Kibana + Logstash + Beat)架构
    • Kibana
    • Logstash
    • Beat
  • ES常见术语
    • 其它概念
  • ES架构(Master-slave 架构)
    • 集群cluster
    • 节点Node(运行着Elasticsearch进程的机器)
      • 种类
    • 分片Shard
      • 流程
        • 详情
      • 分片副本Replia
      • 作用
  • ES流程
    • 工作原理
    • 写入
      • 路由
      • Warning
    • 更新和删除
    • 查询
      • 途径
      • 三阶段
  • 分词器
    • 英文分词器
    • 中文分词器
    • 分词器组成部分
  • ES数据结构
  • problem
    • 跨域访问(跨端口)导致集群无法连接
    • 汉化Kibana
  • 资料

搜索引擎

根据用户需求和一定的算法,运用特定策略从互联网检索出制定信息反馈给用户的一种搜索技术。

Elasticsearch简介

Elasticsearch,简称为ES。 ES是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据。

Elasticsearch是面向文档的一种数据库,这意味着其不再需要行列式的表格字段约束。

ES会存储整个构造好的数据或文档,然而不仅仅是储存数据,这使得文档中每个数据可以被标识,进而可以被检索。在ES中,执行index,search,sort或过滤文档等操作都不是传统意义上的行列式的数据。

ES从根本上对数据的不同思考方式也正是他能应对复杂数据结构的全文检索的原因之一。

ES优势

引擎(搜索引擎)

  1. Solr查询快,但更新索引时慢、插入删除慢
  2. Elasticsearch建立索引快、查询慢

Elasticsearch VS 数据库

模糊查询

数据库的select * from user where name like 'xxx':1. 不走索引,数据库量很大时,查询慢。2. 往往会返回大量的数据。3.用户输入的内容可能并不准确
mysql中like进行模糊查询时,如果用前导模糊查询"%程序控"则不会走索引,如果用非前导模糊查询"程序控%"则会走索引。
=》
正排索引存储会以ID作为索引,来查询相应的数据。如果数据量很大,则会导致经常性的全表扫描。
=》
Elasticsearch优势:
倒排索引。
模糊搜索速度很快: 写入数据到Elasticsearch的时候会进行分词。
搜索到的数据可以根据评分排序,过滤掉大部分的内容。
能匹配有相关性的记录,没有那么准确的关键字也能搜出相关的结果。

结果排序

搜索引擎肯定是根据用户搜索得出最符合用户搜索条件的放在最前面,这一点数据库是无法支持的,es中会根据搜索的数据的评分进行排序,越符合条件评分越高,原生支持这一点。

正向索引 VS 倒排索引

  • 正向索引:书的章节目录就是正向索引,通过章节名称就找到对应的页码。
    正排索引存储会以ID作为索引,来查询相应的数据。如果数据量很大,则会导致经常性的全表扫描。
  • 倒排索引:先对目录分词,对待查找的词找到对应记录。

字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档,一个表项就是一个字表段,它记录该文档的ID和字符在该文档中出现的位置情况
由于每个字或词对应的文档数量在动态变化,所以倒排表的建立和维护都较为复杂,但是在查询的时候由于可以一次得到查询关键字所对应的所有文档,所以效率高于正排表。在全文检索中,检索的快速响应是一个最为关键的性能,而索引建立由于在后台进行,尽管效率相对低一些,但不会影响整个搜索引擎的效率

架构优势

  1. 分布式实时文件存储,可将每一个字段存入索引,使其可以被检索到。
  2. 实时分析的分布式搜索引擎。
    • 分布式:索引分拆成多个分片,每个分片可有零个或多个副本。集群中的每个数据节点都可承载一个或多个分片,并且协调和处理各种操作;
    • 负载再平衡和路由在大多数情况下自动完成。
  3. 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。也可以运行在单台PC上(已测试)。
  4. 支持插件机制,分词插件、同步插件、Hadoop插件、可视化插件等。

为什么可以实现快速的“模糊匹配”/“相关性查询”? =》分词 + 倒排索引

Lucene核心引擎

Elastic Search 中代码几乎全部是为搜索服务器服务的。真正处理倒排索引、具体搜索算法的,则Lucene 核心引擎

  • Lucene是一套用于全文检索和搜寻的开源程序库,由Apache软件基金会支持和提供。
  • Lucene是一套信息检索工具包(jar包),并不是现成的搜索引擎产品,但可以用来制作搜索引擎产品。
  • Lucene包含:索引结构、读写索引的工具、排序、搜索规则、工具类、…

无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
=》ElasticSearch基于Apache Lucene内核,通过标准的RESTful API覆盖Lucene的复杂性,以期全文检索技术能简单易用地被各种搜索应用所使用。

ELKB(ES + Kibana + Logstash + Beat)架构

ELK架构为数据分布式存储、可视化查询和日志解析创建了一个功能强大的管理链。 三者相互配合,取长补短,共同完成分布式大数据处理工作。

Kibana

Kibana是一个针对Elasticsearch的开源分析及可视化平台 ,用来搜索、查看交互存储在Elasticsearch索引中的数据。 使用Kibana,可以通过各种图表进行高级数据分析及展示。Kibana让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板( dashboard )实时显示Elasticsearch查询动态

Logstash

Logstash是ELK的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。

一文快速上手Logstash

Beat

Beats 是一个开源的用来构建轻量级数据汇集的平台,可用于将各种类型的数据发送至 Elasticsearch 与 Logstash。

Packetbeat:用于监控局域网内服务器之间的网络流量信息;
Filebeat:收集服务器上的日志信息——它是用来替代 Logstash Forwarder 的下一代 Logstash 收集器,是为了更快速稳定轻量低耗地进行收集工作,它可以很方便地与 Logstash 还有直接与 Elasticsearch 进行对接。
新推出的 Metricbeat,可以定期获取外部系统的监控指标信息。 除了以上三个核心产品外,还有:Winlogbeat(Windows事件日志轻量级工具)、Auditbeat(审计数据的轻量级工具)、Heartbeat(用于时间监控的轻量级工具)。 除此以外,你还可以非常方便的基于 libbeat 框架来构建你属于自己的专属 Beat。

ES常见术语

名称数据库概念释义备注
Indexdatabase文档在哪个索引存放索引名称必须为小写
Type(废除,默认类型 _doc 代替)Table文档对象类型一个Index下支持多个Type
Type只是Index中的虚拟逻辑分组,不同的Type应该有相似的结构
从es6.0版本默认type是log。
Document数据库的一行记录rowElasticsearch是面向文档的,使用JSON作为序列化格式存储整个对象。
Field数据库的Column文档中包含的一组字段或者是键值对,字段的值可以是一个简单的(标量)值(如字符串,整数,日期),或者一个嵌套的结构就像一个数组或对象
Mapping数据库的Schema
DSLSQLES读取API
  1. Elasticsearch(一般为集群)中可以包含多个索引(数据库DB) ,每个索引中可以包含多个类型Type(Table),每个类型下又包含多个Document(行),每个文档中又包含多个字段(列)。
  2. 在一个关系型数据库里面,schema定义了表、每个表的字段,还有表和字段之间的关系。 在ES中:Mapping定义索引下的Type的字段处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等。
  3. 在数据库中的增insert、删delete、改update、查search操作等价于ES中的增PUT/POST、删Delete、改_update、查GET
  4. 7.X之后,废除Type,所有的type默认为_doc。(自定义type也能用,但是会提示不推荐)

Elasticsearch为什么在6 7 版本后不再支持type了

其它概念

名称释义备注
_id文档唯一标识
_version数据版本

ES架构(Master-slave 架构)

ElasticSearch 是分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个实例。单个实例称为一个节点(node),一组节点构成一个集群(cluster)

集群cluster

为了处理大型数据集,实现容错和高可用性,ES可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。一个集群是一些运行 Elastic Search 的节点服务器(node)的总称。

  • 从技术上讲,一台服务器就可以是一个集群(可以跑起来多个node节点)。

节点Node(运行着Elasticsearch进程的机器)

一个Elasticsearch集群可能包含一个或多个节点一个主节点Master Node,多个从节点。如果主节点挂了,会选举出一个新的主节点

  • Master Node:主要负责维护索引元数据、负责切换主分片和副本分片身份等工作。
  • 每个Node包含 主分片&副本分片

这些节点受到集群的管理。你可以向一个集群中增加或者删除一些节点(扩容或者减容),也可以查询节点的信息(比如这个节点的 CPU 使用状况如何等等)。
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html

种类

  • 主节点master node:负责各种沟通协作节点的工作,一个集群必须有至少一个。
  • 数据节点data node:搜索和数据存储。
  • 写入节点ingest node:负责文档写入。

分片Shard

数据分片sharding:分布式服务中常见的一个手段。

流程

当有大量的文档时,由于内存的限制、磁盘处理能力不足、无法足够快的响应客户端的请求等,一个节点可能不够。这种情况下,数据可以分为较小的分片每个分片放到不同的服务器上。当你查询的索引分布在多个分片上时,ES会把查询发送给每个相关的分片,并将结果组合在一起,而应用程序并不知道分片的存在。即:这个过程对用户来说是透明的。

详情

如果一个Index的数据量太大,只有一个分片,那只会在一个节点上存储,随着数据量的增长,一个节点未必能把一个Index存储下来。 =》横向扩展 =》分片

分片是底层的工作单元,文档保存在分片内,分片又被分配到集群内的各个节点里,每个分片仅保存全部数据的一部分
一个Index(数据库表)的数据我们可以分发到不同的Node上进行存储(1个Index、4个Node :设置4个分片)。

分片副本Replia

为提高查询吞吐量或实现高可用性,可以使用分片副本。
副本是一个分片的精确复制,每个分片可以有零个或多个副本。

数据写入到主分片,副本分片会复制主分片的数据,读取的时候主分片和副本分片都可以读。如果某个节点挂了,主节点就会把对应的副本分片提拔为主分片,数据就不会丢。

可在index创建后更改,其值越大搜索效率越高,但写入性能越低(一条数据写入操作需要做(1+replicas)遍),具体值与集群data节点数量相关,不宜超过【data节点数-1】。

作用

  1. 多个分片,在写入或查询的时候就可以并行操作(从各个节点中读写数据,提高吞吐量)。
  2. 副本分片(replica)和系统健壮性(Robust)
    把同样的数据放在多个服务器
  3. 查询集群健康状态

ES流程

工作原理

当ElasticSearch的节点启动后,它会利用多播(multicast)(或者单播,如果用户更改了配置)寻找集群中的其它节点,并与之建立连接。

写入

  • 客户端写入一条数据,Elasticsearch集群由节点来处理这次请求。

  • 集群上的每个节点都是coordinating node(协调节点),协调节点表明这个节点可以做路由(请求转发)

    • coodinate(协调)节点通过hash算法可以计算出是在哪个主分片上,然后路由到对应的节点shard = hash(document_id) %(num_of_primary_shards)
  • 主分片写完后,会将数据并行发送到副本集节点上,等到所有的节点写入成功就返回ack给协调节点,协调节点返回ack给客户端,完成一次的写入。

路由

  1. 数据写入内存缓冲区
  2. 数据写到translog缓冲区:为防止节点宕机、内存中的数据丢失。
  3. 每隔1s从buffer刷新到文件系统缓存区,生成segment文件,数据才可以被检索到)。
  4. 清空memory buffer。
  5. 每隔5s,translog从buffer刷到磁盘中,生成日志文件。。
  6. 文件大到一定程度或者超过了30分钟,会触发commit操作,将内存中的segement文件异步刷到磁盘中,完成持久化操作。

Warning

  • Elasticsearch写入的数据需要1s才能查询到。
  • Elasticsearch某个节点如果挂了,可能会造成5s的数据丢失。

更新和删除

  • 给对应的doc记录打上【.del】标识。

    • 删除操作:打上delete状态。
    • 更新操作:把原来的doc标志为delete,然后重新新写入一条数据。
  • 足够多的segement文件存在时会合并成一个segement文件。合并时,把带有delete状态的doc给物理删除掉。

查询

途径

  1. 根据ID查询doc(实时
    1.1 检索内存的Translog文件
    1.2 检索硬盘的Translog文件
    1.3 检索硬盘的Segement文件

  2. 根据query(搜索词)去查询匹配的doc(写入后1s才能查,segement文件是每隔一秒才生成一次的)
    2.1 同时查询内存和硬盘的Segement文件

public TopDocs search(Query query, int n);
public Document doc(int docID);

三阶段

  • QUERY_AND_FETCH(查询完就返回整个Doc内容):只适合于只需要查一个分片的请求。
  • QUERY_THEN_FETCH
    1. 协调节点向目标分片发送查询的命令(转发搜索请求到主分片或者副本分片上)。
    2. 每个分片将搜索(过滤、排序等)结果 doc id 返回给协调节点。
    3. 协调节点将得到数据节点返回的doc id 聚合。然后将目标数据分片,发送抓取命令(希望拿到整个Doc记录)。
    4. 协调节点根据 doc id 去各个节点上拉取实际的 document 数据,最终返回给客户端
  • DFS_QUERY_THEN_FETCH(先算词出现频率和文档频率得分,再查询)

分词器

英文分词器

  • Standard Analyzer 。按词切分,将词小写
  • Simple Analyzer。按非字母过滤(符号被过滤掉),将词小写
  • WhitespaceAnalyzer。按照空格切分,不转小写
  • ….

中文分词器

  • IK

分词器组成部分

Character Filters(文本过滤器,去除HTML)
Tokenizer(按照规则切分,比如空格)
TokenFilter(将切分后的词进行处理,比如转成小写)

ES数据结构

  • Term Dictionary:分词后的词(自动排序
    • 根据二分法来查找,不需要遍历整个Dictionary。
    • 由于词的数量过多,无法存入内存 =》Term Index(占用空间小,放入内存,检索快
  • Term Index:存储词的前缀,每个节点是一个字母。
    • FST(Finite State Transducers)保存:非常节省内存、空间占用小、查询速度快。
    • 空间占用小,通过对词典中单词前缀和后缀的重复利用,压缩了存储空间
    • 查询速度快,O(len(str))的查询时间复杂度
  • PostingList(自动压缩):每个词的对应记录(文档ID)。
    • Frame Of Reference(FOR)编码技术对数据压缩,节约磁盘空间。
    • Roaring Bitmaps(压缩位图索引):节省空间和快速得出文档ID交并集操作的结果。

什么是 Elasticsearch?一篇搞懂

problem

跨域访问(跨端口)导致集群无法连接

配置es,打开elasticsearch.yml文件,在最后一行加入(注意yalm语法,冒号后要加一个空格)

http.cors.enabled: true
http.cors.allow-origin: "*"

重启es。

汉化Kibana

在Kibana目录下的config中修改Kibana.yml文件,最后一行加上

i18n.locale: "zh-CN"

重启。

资料

elasticsearch初学终极教程 - 第二章: 把Elastic Search在本地跑起来

终于有人把Elasticsearch原理讲透了!
搜索引擎入门
教程
官方教程
ElasticSearch 快速上手学习入门教程

Elastic社区
集群配置

【狂神说Java】ElasticSearch7.6.x最新完整教程通俗易懂
狂神说笔记之ElasticSearch

ES国内外使用优秀案例
ES简介、与Solr对比
ES介绍、核心概念

本文标签: 分布式实时引擎Elasticsearches