20210404 1. 全文搜索引擎 Elasticsearch 基础 - 拉勾教育

全文搜索引擎 Elasticsearch 基础

Elasticsearch 是什么

Elaticsearch 简称为 ES ,是一个开源的可扩展的分布式的 全文检索引擎,它可以近乎实时的存储、检索数据。本身扩展性很好,可扩展到上百台服务器,处理 PB 级别 的数据。 ES 使用 Java 开发使用 Lucene 作为其核心 来实现索引和搜索的功能,但是它通过简单的 RestfulAPIJavaAPI 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。

起源: Shay Banon 。 2004 年失业,陪老婆去伦敦学习厨师。失业在家帮老婆写一个菜谱搜索引擎。封装了 Lucene ,做出了开源项目 compass 。找到工作后,做分布式高性能项目,再封装 compass ,写出了 Elasticsearch ,使得 Lucene 支持分布式。现在是 Elasticsearch 创始人兼 Elastic 首席执行官。

Elasticsearch 的功能

  • 分布式的搜索引擎
    • 分布式:Elasticsearch 自动将海量数据分散到多台服务器上去存储和检索
    • 搜索:百度、谷歌,站内搜索
  • 全文检索
    • 提供模糊搜索等自动度很高的查询方式,并进行相关性排名,高亮等功能
  • 数据分析引擎(分组聚合)
    • 电商网站,最近一周笔记本电脑这种商品销量排名 top10 的商家有哪些?新闻网站,最近 1 个月访问量排名 top3 的新闻板块是哪些
  • 对海量数据进行近实时的处理
    • 海量数据的处理:因为是分布式架构, Elasticsearch 可以采用大量的服务器去存储和检索数据,自然而然就可以实现海量数据的处理
    • 近实时:Elasticsearch 可以实现秒级别的数据搜索和分析

Elasticsearch 的特点

Elasticsearch 的特点是它提供了一个极速的搜索体验。这源于它的高速( speed )。相比较其它的一些大数据引擎, Elasticsearch 可以实现秒级的搜索,速度非常有优势。 Elasticsearch 的 cluster 是一种分布式的部署,极易扩展( scale )这样很容易使它处理 PB 级的数据库容量。最重要的是 Elasticsearch 搜索的结果可以按照分数进行排序,它能提供我们最相关的搜索结果( relevance ) 。

  1. 安装方便:没有其他依赖,下载后安装非常方便;只用修改几个参数就可以搭建起来一个集群
  2. JSON 格式:输入/输出格式为 JSON,意味着不需要定义 Schema,快捷方便
  3. RESTful API:基本所有操作 ( 索引、查询、甚至是配置 ) 都可以通过 HTTP 接口进行
  4. 分布式:节点对外表现对等(每个节点都可以用来做入口) 加入节点自动负载均衡
  5. 多租户:可根据不同的用途分索引,可以同时操作多个索引
  6. 支持超大数据: 可以扩展到 PB 级的结构化和非结构化数据,海量数据的近实时处理

Elasticsearch 企业使用场景

常见场景

  • 搜索类场景

    比如说电商网站、招聘网站、新闻资讯类网站、各种 app 内的搜索。

  • 日志分析类场景

    经典的 ELK 组合( Elasticsearch / Logstash / Kibana ),可以完成日志收集,日志存储,日志分析查询界面基本功能,目前该方案的实现很普及,大部分企业日志分析系统使用了该方案。

  • 数据预警平台及数据分析场景

    例如电商价格预警,在支持的电商平台设置价格预警,当优惠的价格低于某个值时,触发通知消息,通知用户购买。

    数据分析常见的比如分析电商平台销售量 top 10 的品牌,分析博客系统、头条网站 top 10 关注度、评论数、访问量的内容等等。

  • 商业 BI ( Business Intelligence )系统

    比如大型零售超市,需要分析上一季度用户消费金额,年龄段,每天各时间段到店人数分布等信
    息,输出相应的报表数据,并预测下一季度的热卖商品,根据年龄段定向推荐适宜产品。

    Elasticsearch 执行数据分析和挖掘,Kibana 做数据可视化。

常见案例

  • 维基百科、百度百科:有全文检索、高亮、搜索推荐功能
  • Stack Overflow:有全文检索,可以根据报错关键信息,去搜索解决方法。
  • GitHub:从上千亿行代码中搜索你想要的关键代码和项目。
  • 日志分析系统:各企业内部搭建的 ELK 平台。

主流全文搜索方案对比

Lucene、Solr、Elasticsearch 是目前主流的全文搜索方案,基于 倒排索引 机制完成快速全文搜索。

  • Lucene

    Lucene 是 Apache 基金会维护的一套完全使用 Java 编写的信息搜索工具包( Jar 包),它包含了索引结构、读写索引工具、相关性工具、排序等功能,因此在使用 Lucene 时仍需要我们自己进一步开发搜索引擎系统,例如数据获取、解析、分词等方面的东西。

    注意: Lucene 只是一个框架,我们需要在 Java 程序中集成它再使用。而且需要很多的学习才能明白它是如何运行的,熟练运用 Lucene 非常复杂。

  • Solr

    Solr 是一个有 HTTP 接口的基于 Lucene 的查询服务器,是一个搜索引擎系统,封装了很多 Lucene 细节, Solr 可以直接利用 HTTP GET/POST 请求去查询,维护修改索引。

  • Elasticsearch

    Elasticsearch 也是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎。采用的策略是分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。

三者之间的区别和联系:

Solr 和 Elasticsearch 都是基于 Lucene 实现的。但 Solr 和 Elasticsearch 之间也是有区别的

  • Solr 利用 Zookpper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能
  • Solr 比 Elasticsearch 实现更加全面, Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能, 高级功能多由第三方插件提供
  • Solr 在传统的搜索应用中表现好于 Elasticsearch ,而 Elasticsearch 在实时搜索应用方面比 Solr 表现好

DB-Engines Ranking

Elasticsearch 的版本

Elasticsearch 版本介绍

Elasticsearch 主流版本为 5.x , 6.x 及 7.x 版本

7.x 更新的内容如下:

  • 集群连接变化:TransportClient 被废弃

    以至于, ES7 的 Java 代码,只能使用 restclient 。对于 Java 编程,建议采用 High-level-restclient 的方式操作 ES 集群。 High-level REST client 已删除接受 Header 参数的 API 方法, Cluster Health API 默认为集群级别。

  • ES 数据存储结构变化:简化了 type 默认使用 _doc

    ES6 时,官方就提到了 ES7 会逐渐删除索引 type ,并且 ES6 时已经规定每一个 index 只能有一个 type 。在 ES7 中使用默认的 _doc 作为 type ,官方说在 8.x 版本会彻底移除 type 。 API 请求方式也发送变化,如获得某索引的某 ID 的文档: GET index/_doc/id 其中 indexid 为具体的值

  • ES 程序包默认打包 JDK :以至于 7.x 版本的程序包大小突然增大了 200MB+ , 对比 6.x 发现,包大了 200MB+ , 正是 JDK 的大小

  • 默认配置变化:默认节点名称为主机名,默认分片数改为 1 ,不再是 5

  • Lucene 升级为 Lucene 8 查询相关性速度优化: Weak-AND 算法

    ES 可以看过是分布式 Lucene , Lucene 的性能直接决定 ES 的性能。 Lucene 8 在 top k 及其他查询上有很大的性能提升

    Weak-AND 算法的核心原理:取 TOP N 结果集,估算命中记录数。

    TOP N 的时候会跳过得分低于 10000 的文档来达到更快的性能。

  • 间隔查询( Intervals queries ): intervals query 允许用户精确控制查询词在文档中出现的先后关系,实现了对 terms 顺序、 terms 之间的距离以及它们之间的包含关系的灵活控制

  • 引入新的集群协调子系统,移除 minimum_master_nodes 参数,让 Elasticsearch 自己选择可以形成仲裁的节点

  • 7.0 将不会再有 OOM 的情况, JVM 引入了新的 circuit breaker (熔断)机制,当查询或聚合的数据量超出单机处理的最大内存限制时会被截断

    设置 indices.breaker.fielddata.limit 的默认值已从 JVM 堆大小的 60% 降低到 40%

  • 分片搜索空闲时跳过 refresh

    以前版本的数据插入,每一秒都会有 refresh 动作,这使得 ES 能成为一个近实时的搜索引擎。但是当没有查询需求的时候,该动作会使得 ES 的资源得到较大的浪费

Elasticsearch 与其他软件兼容

Elasticseach Single-Node Mode 快速部署

Elasticsearch 是一个分布式全文搜索引擎,支持单节点模式( Single-Node Mode )和集群模式( ClusterMode )部署,一般来说,小公司的业务场景往往使用 Single-Node Mode 部署即可。课程中我们先以 Single-Node Mode 部署实例学习,随后再专门讲授集群模式相关内容。

下载地址

安装过程略

参考资料

posted @ 2021-04-04 10:26  流星<。)#)))≦  阅读(140)  评论(0编辑  收藏  举报