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