原文连接
https://blog.csdn.net/leilei1366615/article/details/106983357/
ElasticSearch (ES)学习之路(一)
最近在自主学习全文检索技术中…
为什么咱们的数据库有了查询查询功能还要额外使用其余的搜索技术?
为什么要用搜索引擎?我们的所有数据在数据库里面都有,而且 Oracle、Mysql等数据库里也能提供查询检索或者聚类分析功能,直接通过数据库查询不就可以了吗?确实,我们大部分的查询功能都可以通过数据库查询获得,如果查询效率低下,还可以通过建数据库索引,优化SQL等方式进行提升效率,甚至通过引入缓存来加快数据的返回速度。如果数据量更大,就可以分库分表来分担查询压力。
那为什么还要全文搜索引擎呢?我们主要从以下几个原因分析:
数据类型
全文索引搜索支持非结构化数据(无固定长度或者格式 例如 xml数据 图片数据等)的搜索,可以更好地快速搜索大量存在的任何单词或单词组的非结构化文本。
例如 Google,百度类的网站搜索再或者说我们常用的 j京东 淘宝 输入搜索信息后,出现相关信息,并关键字高亮显示,它们都是根据网页中的关键字生成索引,我们在搜索的时候输入关键字,它们会将该关键字即索引匹配到的所有网页返回;还有常见的项目中应用日志的搜索等等。对于这些非结构化的数据文本,关系型数据库搜索不是能很好的支持。
索引的维护复杂而繁琐
一般传统数据库,全文检索都实现的很鸡肋,很少人在数据库存文本类型字段(Text Longtext等)。进行全文检索需要扫描整个表,如果数据量大的话即使对SQL的语法优化,也收效甚微。建立了索引,但是维护起来也很麻烦,对于 insert 和 update 操作都会重新构建索引。
那么我们在什么时候使用全文搜索引擎合适呢?:
搜索的数据对象是大量的非结构化的文本数据。
文件记录量达到数十万或数百万个甚至更多。
支持大量基于交互式文本的查询。
需求非常灵活的全文搜索查询。
对高度相关的搜索结果的有特殊需求,但是没有可用的关系数据库可以满足。
对不同记录类型、非文本数据操作或安全事务处理的需求相对较少的情况。
那么什么叫全文检索呢?
我们生活中的数据分为结构化数据和非结构化数据:
结构化数据:具有固定格式或有限长度的数据,可以用二维表结构来逻辑表达实现的,如数据库,元数据等。
非结构化数据:指不定长或无固定格式的数据,如办公文档、文本、图片、XML、HTML、各类报表、图像和音频/视频信息等等。也叫全文数据。
对于结构化数据的搜索:如对数据库的搜索,用 SQL 语句。再如对元数据的搜索,如利用windows 搜索对文件名,类型,修改时间进行搜索等。
对非结构化数据的搜索:如利用 windows 的搜索也可以搜索文件内容,Linux 下的 grep命令,再如用 Google 和百度可以搜索大量内容数据。
对非结构化数据也即对全文数据的搜索主要有两种方法:
一种是顺序扫描法:比如在一个项目中接口 会返回某一个视图(html页面),其会在项目中一个文件一个文件的找,对于每个文档从头到尾的去找,直到扫描项目里面的所有文件。
window 的搜索文件内容,linux 的 grep 命令就是如此的。小数据量的文件还可以接受,如果对于大量的文件,方法就很慢了。
另一种方法就是通过索引:把非结构化数据重新设计成有一定的结构,利用结构化的数据采取一定的搜索算法加快速度。把非结构化数据中提取出的然后重新组织的信息,称之为索引。比如字典,字典的拼音表和部首检字表就是相当于字典的索引,对每一个字的解释就是非结构化的,如果字典没有音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。
然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵母,分别只有几种可以一一列举,于是将读音拿出来按一定的顺序排列,每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音,然后按其指向的页数,便可找到我们的非结构化数据——也即对字的解释。
这种先建立索引,在对索引进行搜索的过程叫全文检索。
全文检索大体分两个过程,索引创建(Indexing)和搜索索引(Search)。
索引创建:将现实世界中所有的结构化和非结构化数据提取信息,创建索引的过程。
搜索索引:通过用户的查询请求搜索创建的索引,然后返回查询结果的过程。
ElasticSearch是什么?
Elasticsearch 简称 ES,其是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。
在2016年1月,ElasticSearch已超过Solr等,成为排名第一的搜索引擎类应用。
Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”,又叫做 ELK。
ES Lucene Solr 区别
Lucene
Lucene是一个Java全文搜索引擎,完全用Java编写。Lucene不是一个完整的应用程序,而是一个代码库和API,是一个开放源代码的全文检索引擎工具包,可以很容易地用于向应用程序添加搜索功能,使用起来比较复杂。
ES
ES 是基于Lucene 这个代码库进一步封装编写的 一个全文检索引擎,隐藏Lucene的复杂性,从而让全文搜索变得简单。
Solr
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。相对于es 比较重量级
ElasticSearch vs Solr
(1)es基本是开箱即用,非常简单。Solr比之更为复杂
(2)Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能。
(3)Solr 支持更多格式的数据,比如JSON、XML、CSV,而 Elasticsearch 仅支持json文件格式。
(4)Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供,例如图形化界面需要kibana友好支撑
(5)Solr 查询快,但更新索引时慢(即插入删除慢),用于电商等查询多的应用;
ES建立索引快(即查询慢),即实时性查询快,用于facebook新浪等搜索。
Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。
(6)Solr比较成熟,有一个更大,更成熟的用户、开发和贡献者社区,而 Elasticsearch相对开发维护者较少,更新太快,学习使用成本较高。
————————————————