1.ElasticSearch简介
1.1ElasticSearch(简称ES)
Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎。能够达到实时搜索,稳定,可靠,快速,安装使用方便。
客户端支持Java、.NET(C#)、PHP、Python、Ruby等多种语言。
官方网站:www.elastic.co
创始人: Shay Banon(谢巴农)
应用场景
1.2ElasticSearch与Lucene的关系
Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库(框架)
但是想要使用Lucene,必须使用Java来作为开发语言并将其直接集成到你的应用 中,并且Lucene的配置及使用非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
Lucene缺点:
1)只能在Java项目中使用,并且要以jar包的方式直接集成项目中.
2)使用非常复杂-创建索引和搜索索引代码繁杂
3)不支持集群环境-索引数据不同步(不支持大型项目)
4)索引数据如果太多就不行,索引库和应用所在同一个服务器,共同占用硬盘.共用空间少.
上述Lucene框架中的缺点,ES全部都能解决.
1.3哪些公司在使用Elasticsearch
国内公司:
1. 京东 2. 携程 3. 去哪儿 4. 58同城 5. 滴滴 6. 今日头条 7. 小米 8. 哔哩哔哩 9. 联想
1.4ES vs Solr比较
1.4.1ES vs Solr 检索速度
当单纯的对已有数据进行搜索时,Solr更快。
当实时建立索引时, Solr会产生io阻塞,查询性能较差, Elasticsearch具有明显的优势。
大型互联网公司,实际生产环境测试,将搜索引擎从Solr转到 Elasticsearch以后的平均查询速度有了50倍的提升。
总结:
二者安装都很简单。
1、Solr 利用 Zookeeper 进行分布式管理,而Elasticsearch 自身带有分布式协调管理功能。
2、Solr 支持更多格式的数据,比如JSON、XML、CSV,而 Elasticsearch 仅支持json文件格式。
3、Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。
4、Solr 是传统搜索应用的有力解决方案,但 Elasticsearch更适用于新兴的实时搜索应用。
1.4.2ES vs 关系型数据库
Elasticsearch VS RDBMS
RDBMS | Database | Table | Row | Column | Schema | SQL |
Elasticsearch | Index | Index(Type) | Document | Filed | Mapping | DSL |
说明:
- 在 7.0 之前, 一个 index 可以设置多个 types
- 目前 type 已经被 Deprecated, 7.0 开始,一个索引只能创建一个 Type -> "_doc"
- 传统关系型数据库和 Elasticesarch 的区别
- Elasticsearch- Schemaless / 相关性 / 高性能全文检索
- RDMS - 事务性 / Join
2.Lucene全文检索框架
2.1什么是全文检索
全文检索是指:
通过一个程序扫描文本中的每一个单词,针对单词建立索引,并保存该单词在文本中的位置、以及出现的次数
用户查询时,通过之前建立好的索引来查询,将索引中单词对应的文本位置、出现的次数返回给用户,因为有了具体文本的位置,所以就可以将具体内容读取出来了
2.2分词原理之倒排索引
传统线性查找一个 10 MB 的 word ,查找关键字如果在文档的最后,大约需要 3 秒钟
倒排索引:记录每个词条出现在哪些文档,以及文档中的位置,可以根据词条快速定位到包含这些词条的文档以及文档的位置
- 文档 (Document):索引库中每一条原始护具,例如一个网页信息,一件商品信息
- 词条:原始数据按照算法进行分词,得到每一个词
创建倒排索引,分为以下几步:
1)创建文档列表:
l lucene首先对原始文档数据进行编号(DocID),形成列表,就是一个文档列表
2)创建倒排索引列表
l 然后对文档中数据进行分词,得到词条。对词条进行编号,以词条创建索引。然后记录下包含该词条的所有文档编号(及其它信息)。
谷歌之父--> 谷歌、之父
倒排索引创建索引的流程:
1) 首先把所有的原始数据进行编号,形成文档列表
2) 把文档数据进行分词,得到很多的词条,以词条为索引。保存包含这些词条的文档的编号信息。
搜索的过程:
当用户输入任意的词条时,首先对用户输入的数据进行分词,得到用户要搜索的所有词条,然后拿着这些词条去倒排索引列表中进行匹配。找到这些词条就能找到包含这些词条的所有文档的编号。
然后根据这些编号去文档列表中找到文档