您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > Elasticsearch分享
Elasticsearch分享任志伟2017-09-06生活中的数据•结构化数据•指具有固定格式或有限长度的数据,如数据库,元数据等•非结构化数据•指不定长或无固定格式的数据,如邮件,word文档等。•数据库的搜索(SQL)•Windows对文件元数据的搜索(everything)•???非结构化数据的搜索顺序扫描法Windows的文件内容搜索Linux的grep全文检索先建立索引,再对索引进行搜索的过程就叫全文检索(Full-textSearch)Lucene就是一套用于全文检索和搜索的开放源代码程序库Lucene&ElasticsearchLuceneApacheLuceneisahigh-performance,full-featuredtextsearchenginelibrary.ElasticsearchElasticsearchisadistributed,JSON-basedsearchandanalyticsenginedesignedforhorizontalscalability,maximumreliability,andeasymanagement.RelationshipsElasticsearchusesApacheLucenetocreateandmanagethisinvertedindex.Justlikeacarandanengine.FeaturesofLucene2.1索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。2.2在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。2.3优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。2.4设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。2.5已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(FuzzySearch)、分组查询等等。Lucene倒排索引原理假设有两篇文章1和2文章1的内容为:TomlivesinGuangzhou,IliveinGuangzhoutoo.文章2的内容为:HeoncelivedinShanghai.经过分词处理后文章1的所有关键词为:[tom][live][guangzhou][i][live][guangzhou]文章2的所有关键词为:[he][live][shanghai]加上“出现频率”和“出现位置”信息后,我们的索引结构为:关键词文章号[出现频率]出现位置guangzhou1[2]3,6He2[1]1I1[1]4Live1[2],2[1]2,5,2Shanghai2[1]3Tom1[1]1全文检索的一般过程全文检索大体分两个过程,索引创建(Indexing)和搜索索引(Search)。•索引创建:将现实世界中所有的结构化和非结构化数据提取信息,创建索引的过程。•搜索索引:就是得到用户的查询请求,搜索创建的索引,然后返回结果的过程。如何创建索引第一步:一些要索引的原文档(Document)第二步:将原文档传给分词组件(Tokenizer)将文档分成一个一个单独的单词去除标点符号去除停词(Stopword)第三步:将得到的词元(Token)传给语言处理组件(LinguisticProcessor)变为小写(Lowercase)将单词缩减为词根形式,如“cars”到“car”等。这种操作称为:stemming将单词转变为词根形式,如“drove”到“drive”等。这种操作称为:lemmatization第四步:将得到的词(Term)传给索引组件(Indexer)利用得到的词(Term)创建一个字典对字典按字母顺序进行排序合并相同的词(Term)成为文档倒排(PostingList)链表1.一些要索引的原文档文件一:Studentsshouldbeallowedtogooutwiththeirfriends,butnotallowedtodrinkbeer.文件二:MyfriendJerrywenttoschooltoseehisstudentsbutfoundthemdrunkwhichisnotallowed.2.将原文档传给分词组件将文档分成一个一个单独的单词去除标点符号去除停词(Stopword)得到以下词元(Token):“Students”,“allowed”,“go”,“their”,“friends”,“allowed”,“drink”,“beer”,“My”,“friend”,“Jerry”,“went”,“school”,“see”,“his”,“students”,“found”,“them”,“drunk”,“allowed3.将词元传给语言处理组件语言处理组件(linguisticprocessor)主要是对得到的词元(Token)做一些同语言相关的处理。对于英语,语言处理组件一般做以下几点:1.变为小写(Lowercase)。2.将单词缩减为词根形式,如“cars”到“car”等。这种操作称为:stemming。3.将单词转变为词根形式,如“drove”到“drive”等。这种操作称为:lemmatization。经过语言处理,得到的词(Term)如下:“student”,“allow”,“go”,“their”,“friend”,“allow”,“drink”,“beer”,“my”,“friend”,“jerry”,“go”,“school”,“see”,“his”,“student”,“find”,“them”,“drink”,“allow”4.将词传给索引组件1.利用得到的词创建一个字典。4.将词传给索引组件2.对字典按字母顺序进行排序。4.将词传给索引组件3.合并相同的词成为文档倒排链表。两个概念:•DocumentFrequency即文档频次,表示总共有多少文件包此词(Term)。•Frequency即词频率,表示此文件中包了几个此词(Term)。如何对索引进行搜索第一步:用户输入查询语句(luceneANDlearnedNOThadoop)第二步:对查询语句进行词法分析,语法分析,及语言处理主要用来识别单词和关键字语法分析主要是根据查询语句的语法规则来形成一棵语法树语言处理同索引过程中的语言处理几乎相同第三步:搜索索引,得到符合语法树的文档第四步:根据得e到的文档和查询语句的相关性,对结果进行排序计算权重(Termweight)的过程判断Term之间的关系从而得到文档相关性的过程,也即向量空间模型的算法(VSM)相似度Elasticsearch的相似度算法被定义为检索词频率/反向文档频率,TF/IDF(termfrequency/inversedocumentfrequecy),包括以下内容:检索词频率检索词在该字段出现的频率?出现频率越高,相关性也越高。字段中出现过5次要比只出现过1次的相关性高。反向文档频率每个检索词在索引中出现的频率?频率越高,相关性越低。检索词出现在多数文档中会比出现在少数文档中的权重更低。字段长度准则字段的长度是多少?长度越长,相关性越低。检索词出现在一个短的title要比同样的词出现在一个长的content字段权重更大。向量空间模型实现多词相关性的计算我们把文档看作一系列词(Term),每一个词(Term)都有一个权重(Termweight),不同的词(Term)根据自己在文档中的权重来影响文档相关性的打分计算。于是我们把所有此文档中词(term)的权重(termweight)看作一个向量。Lucene的索引结构是索引(Index):在Lucene中一个索引是放在一个文件夹中的。同一文件夹中的所有的文件构成一个Lucene索引。段(Segment):一个索引可以包含多个段,段与段之间是独立的,添加新文档可以生成新的段,不同的段可以合并。具有相同前缀文件的属同一个段segments_N是段的元数据文件,也即它们保存了段的属性信息文档(Document):文档是我们建索引的基本单位,不同的文档是保存在不同的段中的,一个段可以包含多篇文档。新添加的文档是单独保存在一个新生成的段中,随着段的合并,不同的文档合并到同一个段中。域(Field):一篇文档包含不同类型的信息,可以分开索引,比如标题,时间,正文,作者等,都可以保存在不同的域里不同域的索引方式可以不同词(Term):词是索引的最小单位,是经过词法分析和语言处理后的字符串。Lucene采用的几种数据结构FST(FiniteStateTransducer)差值存储跳跃表FST原理Example:我们对“cat”、“deep”、“do”、“dog”这4个单词进行插入构建FST(注:必须已排序)lucene从4开始大量使用的数据结构是FST(FiniteStateTransducer)。差值存储在Lucene的反向索引中,需要保存很多整型数字的信息,比如文档ID号,比如词(Term)在文档中的位置等等。由上面介绍,我们知道,整型数字是以VInt的格式存储的。随着数值的增大,每个数字占用的Byte的个数也逐渐的增多。所谓差值规则(Delta)就是先后保存两个整数的时候,后面的整数仅仅保存和前面整数的差即可。比如要存储如下整数:16386,16387,16388,16389[(1)000,0010][(1)000,0000][(0)000,0001],[(1)000,0011][(1)000,0000][(0)000,0001],[(1)000,0100][(1)000,0000][(0)000,0001],[(1)000,0101][(1)000,0000][(0)000,0001][(1)000,0010][(1)000,0000][(0)000,0001],[(0)000,0001],[(0)000,0001],[(0)000,0001]如果按照正常方式来存储,需要的空间如下如果应用差值规则来存储,需要的空间如下Skiplist为了提高查找的性能,Lucene在很多地方采取的跳跃表的数据结构。跳跃表(SkipList)是如图的一种数据结构,有以下几个基本特征:元素是按顺序排列的,在Lucene中,或是按字典顺序排列,或是按从小到大顺序排列。跳跃是有间隔的(Interval),也即每次跳跃的元素数,间隔是事先配置好的,如图跳跃表的间隔为3。跳跃表是由层次的(level),每一层的每隔指定间隔的元素构成上一层,如图跳跃表共有2层。NameExtensionBriefDescriptionSegmentsFilesegments_NStoresinformationaboutacommitpointLockFilewrite.lockTheWritelockpreventsmultipleIndexWritersfromwritingtothesamefile.SegmentInfo.siStoresmetadataaboutasegmentCompoundFile.cfs,.cfeAnoptionalvirtualfileconsistingofalltheotherindexfilesforsystemsthatfrequentlyrunoutoffilehandles.Fields.fnmStoresinformationaboutthefieldsFieldIndex.fdxContainspointerstofielddataFieldData.fdtThestoredfieldsfordocumentsTermDictionary.timThetermdictionary,storester
本文标题:Elasticsearch分享
链接地址:https://www.777doc.com/doc-5240278 .html