大数据开发经常用到 Elasticesearch,今天做一下介绍。

1.Elasticsearch 简介

Elaticsearch,简称为 ES, 是一个开源的高扩展的分布式全文检索引擎,特点:

  • 近乎实时的存储、检索数据;
  • 扩展性好,可以扩展到上百台服务器,处理PB级别的数据;
  • 使用 Java 开发并使用 Lucene 作为其核心来实现所有索引和搜索的功能;
  • 通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
2.全文索引
2.1 什么是全文索引

对于非结构化数据查询方法:

  • 顺序扫描法:要找内容包含某一个字符串的文件,就逐个文档查询,对于每一个文档,从头查到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。
  • 全文检索:将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息称之为索引。

这种先建立索引,再对索引进行搜索的过程就叫全文检索。

2.2 如何实现

可以使用 Lucene 实现全文检索。Lucene 是 apache 下的一个开放源代码的全文检索引擎工具包。提供了完整的查询引擎和索引引擎,部分文本分析引擎。

2.3 应用场景

对于数据量大、数据结构不固定的数据可采用全文检索方式搜索,例如搜索引擎。

2.4 实现

文件→字符串:非结构化数据中所存储的信息是每个文件包含哪些字符串,也即已知文件,欲求字符串相对容易,也即是从文件到字符串的映射。

字符串→文件:我们想搜索的信息是哪些文件包含此字符串,也即已知字符串,欲求文件,也即从字符串到文件的映射。

因此,索引需要保存从字符串到文件的映射,则会大大提高搜索速度。

采用倒排索引的方法:

正排索引:

文档编号文档内容
1上海的鲜花
2上海的公园
3公园的鲜花绽放

倒排索引:

单词ID单词倒排列表
1上海1,2
2鲜花1,3
3公园2,3
4绽放3
51,2,3
  • 比如单词“上海”,其单词编号为1,倒排列表为{1,2},说明文档集合中1、2文档都包含了这个单词。
3.Elasticsearch 与 MySQL 的区别
3.1 分词

MySQL:

背景:在做中文搜索时,组合词检索在数据库是很难完成的。

例如:当用户在搜索框输入“四川火锅”时,数据库通常只能把这四个字去进行全部匹配。可是在文本中,可能会出现“推荐四川好吃的火锅”,这时候就没有结果了。

Elasticsearch:

提升:使用ES搜索服务后,就不用太过于关注分词了,因为 Elasticsearch 支持中文分词插件,很好地解决了问题。

原因:当用户使用 Elasticsearch 时进行搜索时,Elasticsearch 就自动帮他分好词了。

例如:输入“四川火锅”时,Elasticsearch 会自动做下面两件事:

  • 将“四川火锅”分词成“四川”和“火锅”
  • 查找包含这两个词的文档
3.2 响应时间

MySQL:

背景:当数据库中的文档数仅仅上万条时,关键词查询就比较慢了。如果一旦到企业级的数据,响应速度就会更加不可接受。

原因:在数据库做模糊查询时,如 LIKE 语句,它会遍历整张表,同时进行字符串匹配。

例如,在数据库查询“手机”时,数据库会在每一条记录去匹配“手机”这两字是否出现。实际上,并不是所有记录都包含“手机”,所以做了很多无用功。

这个步骤都不高效,而且随着数据量的增大,消耗的资源和时间都会线性的增长。

Elasticsearch:

提升:TB 级数据在毫秒级就能返回检索结果,很好地解决了痛点。

原因:Elasticsearch 是基于倒排索引。

例如:搜索“手机”,ES 已经提前分词了,直接去查对应文档。

3.3 相关性

MySQL:

背景:在用数据库做搜索时,结果经常会出现一系列不匹配的文档。

原因:数据库并不支持相关性搜索。

例如,当用户搜索“咖啡厅”的时候,他很可能更想知道附近哪里可以喝咖啡,而不是怎么开咖啡厅。

Elasticsearch:

提升:使用了 ES 搜索服务后,发现 Elasticsearch 能很好地支持相关性评分。通过合理的优化,ES 搜索服务能够返回精准的结果,满足用户的需求。

原因:Elasticsearch 支持全文搜索和相关度评分。这样在返回结果就会根据分数由高到低排列。分数越高,意味着和查询语句越相关。

例如,当用户搜索“星巴克咖啡”,带有“星巴克咖啡”的信息就要比只包含“咖啡”的信息靠前。

3.4 总结

Elasticsearch 和 MySql 分工不同,MySQL 负责存储数据,Elasticsearch 负责搜索数据。

  1. 传统数据库在全文检索方面很鸡肋,海量数据下的查询很慢,对非结构化文本数据的不支持,ES 支持非结构化数据的存储和查询。
  2. ES 支持分布式文档存储。
  3. ES 是分布式实时搜索,并且响应时间比关系型数据库快。
  4. ES 在分词方面比关系型好,能做到精确分词。
  5. ES 对已有的数据,在数据匹配性方面比关系型数据库好, 例如:搜索“星巴克咖啡”,ES会优先返回带有“星巴克咖啡”的数据,不会优先返回带有“咖啡”的数据。
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐