大数据开发经常用到 Elasticesearch,今天做一下介绍。
Elaticsearch,简称为 ES, 是一个开源的高扩展的分布式全文检索引擎,特点:
对于非结构化数据查询方法:
这种先建立索引,再对索引进行搜索的过程就叫全文检索。
可以使用 Lucene 实现全文检索。Lucene 是 apache 下的一个开放源代码的全文检索引擎工具包。提供了完整的查询引擎和索引引擎,部分文本分析引擎。
对于数据量大、数据结构不固定的数据可采用全文检索方式搜索,例如搜索引擎。
文件→字符串:非结构化数据中所存储的信息是每个文件包含哪些字符串,也即已知文件,欲求字符串相对容易,也即是从文件到字符串的映射。
字符串→文件:我们想搜索的信息是哪些文件包含此字符串,也即已知字符串,欲求文件,也即从字符串到文件的映射。
因此,索引需要保存从字符串到文件的映射,则会大大提高搜索速度。
采用倒排索引的方法:
正排索引:
文档编号 | 文档内容 |
---|---|
1 | 上海的鲜花 |
2 | 上海的公园 |
3 | 公园的鲜花绽放 |
倒排索引:
单词ID | 单词 | 倒排列表 |
---|---|---|
1 | 上海 | 1,2 |
2 | 鲜花 | 1,3 |
3 | 公园 | 2,3 |
4 | 绽放 | 3 |
5 | 的 | 1,2,3 |
MySQL:
背景:在做中文搜索时,组合词检索在数据库是很难完成的。
例如:当用户在搜索框输入“四川火锅”时,数据库通常只能把这四个字去进行全部匹配。可是在文本中,可能会出现“推荐四川好吃的火锅”,这时候就没有结果了。
Elasticsearch:
提升:使用ES搜索服务后,就不用太过于关注分词了,因为 Elasticsearch 支持中文分词插件,很好地解决了问题。
原因:当用户使用 Elasticsearch 时进行搜索时,Elasticsearch 就自动帮他分好词了。
例如:输入“四川火锅”时,Elasticsearch 会自动做下面两件事:
MySQL:
背景:当数据库中的文档数仅仅上万条时,关键词查询就比较慢了。如果一旦到企业级的数据,响应速度就会更加不可接受。
原因:在数据库做模糊查询时,如 LIKE 语句,它会遍历整张表,同时进行字符串匹配。
例如,在数据库查询“手机”时,数据库会在每一条记录去匹配“手机”这两字是否出现。实际上,并不是所有记录都包含“手机”,所以做了很多无用功。
这个步骤都不高效,而且随着数据量的增大,消耗的资源和时间都会线性的增长。
Elasticsearch:
提升:TB 级数据在毫秒级就能返回检索结果,很好地解决了痛点。
原因:Elasticsearch 是基于倒排索引。
例如:搜索“手机”,ES 已经提前分词了,直接去查对应文档。
MySQL:
背景:在用数据库做搜索时,结果经常会出现一系列不匹配的文档。
原因:数据库并不支持相关性搜索。
例如,当用户搜索“咖啡厅”的时候,他很可能更想知道附近哪里可以喝咖啡,而不是怎么开咖啡厅。
Elasticsearch:
提升:使用了 ES 搜索服务后,发现 Elasticsearch 能很好地支持相关性评分。通过合理的优化,ES 搜索服务能够返回精准的结果,满足用户的需求。
原因:Elasticsearch 支持全文搜索和相关度评分。这样在返回结果就会根据分数由高到低排列。分数越高,意味着和查询语句越相关。
例如,当用户搜索“星巴克咖啡”,带有“星巴克咖啡”的信息就要比只包含“咖啡”的信息靠前。
Elasticsearch 和 MySql 分工不同,MySQL 负责存储数据,Elasticsearch 负责搜索数据。