一、为什么使用es?
首先举一个我们日常工作中常用的一个数据存储实例:
拿新闻来说,我们首先设计好一个表结构如下图所示。
一般查询的时候,我们会根据新闻的类别,新闻的标题,新闻的时间等等去查询。
按类别查询:select * from 新闻表 where 类别 in(...);
按时间查询:select * from 新闻表 where 发表时间 between XXXX and XXXX;
按标题为“上海金沙江路来查询”:select * from 新闻表 where 标题 = '上海金沙江路';
查询有关”上海金沙江路“有关的新闻:select * from 新闻表 标题 like '%上海金沙江路%' or 内容 like '%上海金沙江路%';
那么问题来了,一旦我们数据量增大那么这个时候我们要怎么去进行一个操作呢,下面具体讲解下。
数据库的优化:
建索引,分区表
通过上面两种方式进行对数据库进行进一步的优化从而使我们在数据量大的情况下提高我们的查询效率。那么数据库索引的一个原理是什么呢,为什么有了索引之后我们查询效率就会提高呢?
数据库索引原理:
对列值创建排序存储,数据结构={列值、行地址}。在有序数据列表中就可以利用 二分查找(针对不同数据库有不同的算法)快速找到要查找的行的地址,再根据地址直接取行数据。从而提高我们的查询效率。
问题:我们工作当中也会有索引用不到,分区表数据块过多查询效率没有明显的提高,那么这个时候我们要怎么做呢?
结论:
传统的数据库对结构化数据处理的能力非常好,甚至在数据量很大时也能够通过建索引,集群,分库分表等手段来保持较好的数据处理能力,但碰到需要像like "%abc%"等索引失效的情况,或者对半结构化数据和非结构化数据的处理(如找到一篇标题和内容都有”上海金沙江路“的新闻,并且标题含有”上海金沙江路“的新闻排在前面的问题),数据库就无法提供高效的数据处理了。搜索引擎就为解决此类问题而诞生。
二、搜索引擎是如何解决问题的?
>分析:我们搜索新闻时,输入”上海金沙江路车祸“,想要得到标题、内容中都包含”上海金沙江路车祸“的新闻列表。即如何做,可以快速检索出包含”上海金沙江路“的文章id和”车祸“的文章id的数据呢?
此时我们可以使用反向索引:
传统索引是把索引建在列上,反向索引是把索引建在列内容上。
如:上海金沙江路:{1,2,{2,9}}”上海金沙江路“出现在新闻id为1上,并且出现了2次,分别在位置2和9上。
车祸:{2,2,{2,9}}车祸出现在新闻id为2上,并且出现了2次,分别在位置2和9上。
此时,我们就可以通过诸如此类的索引迅速的找到相关新闻,并通过相关算法进行相关性的排列。这就完美的解决了问题。
此思想的关键在于你为什么知道以上海金沙江路为键建立反向索引呢,为什么不是在“江路车”建索引呢?
我们会自然的这么分词是因为我们是中国人,知道中国人的语境,如果这句话是日语,泰文等,你会不会这样分呢,机器是不知道相应的语境的,此时就要开发不同语言的分词器,这个分词器至少得有2个能力:1.能够按照不同语言的语境进行分词2.对新词能够进行扩展。
主流中文分词器:IKAnalyzer mmseg4j
那么还有一个问题我们怎么保证查询出来的数据的顺序或者说是我们检索出的数据的相关性呢?
权重:
规则一:通过反向索引的规则,根据上文所说的出现次数从高到底来进行排序。
规则二:加入权重,比如新闻中我们标题的权重为10,文章的权重为1,那么我们检索的时候对权重值进行计算拿到权重得分之后再按从高到底的顺序进行排序。
说了这么多理论上的东西,那么es到底底层是有什么东西实现的呢?
三、Lucene
最受欢迎的java开源全文搜索引擎开发工具包。提供了完整的查询引
擎和索引引擎,部分文本分词引擎。Lucene的目的是为软件开发人员提
供一个简单易用的工具包,以方便在目标系统中实现全文检索功能,或
者是以此为基础建立起完整的全文检索引擎。
目前市面上尚存的搜索引擎底层几乎都是在Lucene的基础上进行扩展以及升级的。
那么它当中有两个比较核心的概念:
shard:一个index可能存储大量的数据,以至于一台机器存放不下,即使能承载,由 单台机器查询全量数据,也相当耗时。为了解决这个问题,ES将index中数据分为 多份,每份叫一个shard。
replica: replica即为shard的备份,每个shard可以有多个replica,其中一个位 primary shard,剩余的为replica shard。Replica除可以起到容错的作用外,还 可以提高查询并发度。
通俗点来说就是我们分布式开放中常用的服务器节点的分片。
lucene在es中的应用:
ES将index的数据分为多份,每份叫一个shard,为了提高数据可用性,每个shard都 会有冗余副本,每个副本实际上是一个Lucene index实例.
以上就是我对elasticsearch核心理论和思想的总结,有什么不对的地方欢迎各位大佬及时指出,有什么问题需要讨论也可以通过一下联系方式联系我一块探讨。
QQ:2289949405
微信:15239847216
最后奉上一直激励我的一句话:
坚持做自己懒得做的事情,就能得到别人想得到却得不到的东西!