,什么是倒排索引?Elasticsearch是面向文档的。它将文档序列化为JSON格式。订单小型化的过程是已知文件。它调查和处理文档中的安全字符串,从文件到字符串的映射,但elasticsearch搜索已知字符串的文档,即建立字符串和文档之间的映射。这种映射称为倒排索引。二、elasticsearch如何使用倒排索引完成全文搜索功能1、创建索引:1.1知道文档,将文档交给tokenizer进行分词,分级,去除标点符号和停用词等1.2将词交给语言处理组件,词根提取1.3将词传给索引组件,处理成字典,按字母排序,合并相同的词,形成倒排列表2,搜索索引:2.1进行词法,根据用户输入的数据进行语法和语言处理,提取关键词和常用词,得到语法树2.2使用语法树进行索引搜索,并对结果与搜索内容的相关性进行排序回到基本思路Elasticsearch的全文搜索:非结构化数据的顺序扫描很慢,而结构化数据的搜索相对较快(因为结构化数据有一定的结构和一定的搜索算法可以用来加快速度),我们可以想办法让我们的非结构化数据具有一定的结构,也就是非结构化数据。将部分信息抽取重组,使其具有一定的结构,然后我们将这些数据按照一定的结构进行重组进行搜索,从而达到比较快速搜索的目的。这部分信息是从非结构化数据中提取出来,然后重新组织的,我们称之为索引。全文检索一般分为两个过程:1.索引(Indexing);2.搜索索引(Search)。1.索引创建:从现实世界中所有结构化和非结构化数据中提取信息并创建索引的过程。2、搜索索引:是获取用户的查询请求,搜索创建的索引,然后返回结果的过程。倒排索引:顺序查找是指已知文件,查找字符串的过程,即文件到字符串的映射。而我们要搜索的信息是哪些文件包含这个字符串,即已知字符串,以及想要的文件,即字符串到文件的映射。两者恰恰相反。由于字符串到文件的映射是文件到字符串映射的逆过程,所以保存这些信息的索引称为倒排索引。如果索引能一直保存字符串到文件的映射,搜索会大大提高。速度。索引中包含的内容如下。反向索引存储的信息一般是这样的:假设我的文档集合中有100个文档。为了表示方便,我们将文档编号从1到100,下面结构的左边是一系列字符串,称为字典。每个字符串指向包含该字符串的文档链表,这个文档链表称为发布列表。有了索引,保存的信息和要查找的信息是一致的,可以大大加快查找速度。例如,我们要查找同时包含字符串“lucene”和字符串“solr”的文档,只需要如下步骤:取出包含字符串“lucene”的文档链表。获取包含字符串“solr”的文档列表。通过合并链接列表查找同时包含“lucene”和“solr”的文件。虽然创建索引库也需要一个过程,但是如果使用顺序扫描,每次都需要扫描,而创建索引的过程只需要做一次,一劳永逸。每次搜索都不需要经过创建索引的过程,只需要搜索创建的索引即可。如何建立索引第一步:将一些原始文档(Document)建立索引。先说说Elasticsearch的文件存储。Elasticsearch是一个面向文档的数据库。这里的一条数据就是一个文档。JSON用作文档序列化格式。例如,以下用户数据:{"name":"John","sex":"Male","age":25,"birthDate":"1990/05/01","about":"Ilovetogorockclimbing","interests":["sports","music"]}为了便于描述索引创建过程,这里以两个文件为例:文件1:应该允许学生和他们的朋友出去,但不准喝啤酒。档案2:我的朋友Jerry去学校看望他的学生,但发现他们喝醉了,这是不允许的。第二步:将原始文档传递给分词器(Tokenizer)。分词器(Tokenizer)会做以下事情(这个过程叫做Tokenize):把文档分成一个个单词。去掉标点符号。去除停用词(Stopword)。所谓的停用词是一种语言中最常见的一些词。由于它们没有特殊含义,因此在大多数情况下不能用作搜索关键字。因此,在创建索引时,会去除此类词以减少索引。的大小。英文停用词(Stopword)如:“the”、“a”、“this”等。对于每种语言的分词器,都有一组停用词。标记化(Tokenizer)后得到的结果称为标记(Token)。在我们的示例中,获取了以下标记:“Students”、“allowed”、“go”、“their”、“friends”、“allowed”、“drink”、“beer”、“My”、“friend”、“Jerry”、“went”、“school”、“see”、“his”、“students”、“found”、“them”、“drunk”、“allowed”。第三步:将获得的令牌(Token)传递给语言处理组件(LinguisticProcessor)。语言处理组件(linguisticprocessor)主要是对得到的令牌(Token)进行一些与语言相关的处理。对于英语,语言处理组件(LinguisticProcessor)一般会做以下事情:转为小写(Lowercase)。将单词缩减为词根形式,例如“cars”缩减为“car”等。这种操作称为:词干提取。将单词转换为词根形式,如“drove”转换为“drive”等。这种操作称为:词形还原。Stemming和lemmatization的相同点和不同点:两种方式不同:Stemming采用了一种“归约”的方式:“cars”到“car”,“driving”到“drive”。词形还原采用“转化”的方法:“驱”到“驱”,“驱”到“驱”。语言处理组件(语言处理器)的结果称为字典(Term)。在我们的例子中,经过语言处理后,得到的词(Term)如下:["student","allow","go","their","friend","allow","drink","beer","my","friend","jerry","go","school","see","his","student","find","them","drink","allow"]步骤4:将获取的词(Term)传递给索引组件(Indexer)。索引组件(Indexer)主要做了以下几件事:将得到的词(Term)创建字典。在我们的示例中,字典如下所示:TermDocumentIDstudent1allow1go1their1friend1allow1drink1beer1my2friend2jerry2go2school2see2his2student2find2them2drink2allow2按字母顺序对字典进行排序。TermDocumentIDallow1allow1allow2beer1drink1drink2find2friend1friend2go1go2his2jerry2my2school2see2student1student2their1them2将同一个词(Term)合并到一个文档发布列表(PostingList)中。在这个表中,有几个定义:DocumentFrequency:文档频率,表示有多少文档包含这个词(Term)。Frequency:词频,表示这个文件中包含了多少个词(Term)。因此,对于单词(Term)“allow”,一共有两个文档包含这个单词(Term),所以单词(Term)后面的文档列表一共有两个项,第一项代表第一个包含“允许”的文档。文件,即1号文件。在这个文件中,“允许”出现了两次。第二项表示第二个包含“allow”的文件,即2号文件。在这个文件中,“allow”出现了一次。至此,索引就创建好了,我们可以通过它快速的找到我们想要的文档。并且在这个过程中,我们惊喜的发现搜索“drive”、“driving”、“drive”、“driven”也可以搜索到。因为在我们的索引中,“driving”、“drive”、“driven”会经过语言处理转化为“drive”。搜索的时候,如果输入“driving”,输入的查询语句也会经过我们到第三步,变成查询“drive”,这样就可以搜索到想要的文档了。如何搜索索引?第一步:用户输入查询语句。例如,用户输入句子:luceneANDlearnedNOThadoop。第二步:对查询语句进行词法分析、语法分析和语言处理。词法分析主要用于识别单词和关键词。如上例,经过词法分析,词为lucene、learned、hadoop,关键字为AND、NOT。如果在词法分析过程中发现非法关键字,则会发生错误。比如luceneAMD了解到,这里由于AND的拼写错误,AMD作为普通词参与查询。语法分析主要是根据查询语句的语法规则形成语法树。如果发现查询语句不满足语法规则,就会报错。比如luceneNOTANDlearned,就会出现错误。如上例,luceneANDlearnedNOThadoop形成的语法树如下:语言处理与索引过程中的语言处理几乎相同。比如learned就变成learn等等。第二步之后,我们得到了一个经过语言处理的语法树。第三步:搜索索引得到符合语法树的文档。这一步分为几个子步骤:首先,在倒排索引表中,找出分别包含lucene、learn、hadoop的文档链表。其次,合并包含lucene和learn的链表,得到同时包含lucene和learn的文档链表。然后将这个链表和hadoop的文档链表进行差分操作,去掉包含hadoop的文档,得到一个同时包含lucene和learn但不包含hadoop的文档链表。这个文件链表就是我们要找的文件。更多技术资料请关注:gzitcast
