elasticsearch搜索引擎

一,什么事倒排序索引
elaticsearch是面向文档型的,将文档序列化未JSON形式,顺序缩影的过程是已知文档,查处文档中保航的字符串,从文件到字符串的映射,但是elaticsearch是已知字符串查找文档,即建立字符串和文档的映射,这种映射被称为倒排索引。


二,elasticsearch如何使用倒排序索引完成全文检索功能
1,创建索引:
1.1 已知文档,将文档交给分词器进行分词处理,分成一个一个档次,去除标点符号和停用词等
1.2 将单词交给语言处理组件,提取词根
1.3 将单词传给索引组件,处理成字典,按照字母顺序排序,合并相同的单词,成文倒排链表


2,搜索索引:
2.1 根据用户输入的数据进行词法,语法和语言处理,提取关键字和普通单词,得到语法树
2.2 利用语法树进行索引搜索,将结果与搜索内容的相关性进行排序返回






Elasticsearch
全文检索的基本思路:对非结构化数据顺序扫描很慢,对结构化数据的搜索却相对较快(由于结构化数据有一定的结构可以采取一定的搜索算法加快速度),把我们的非结构化数据想办法弄得有一定结构,也就是将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后我们重新组织的有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引 。


全文检索大体分两个过程:1.索引创建 (Indexing) ;2. 搜索索引 (Search) 。
1.索引创建:将现实世界中所有的结构化和非结构化数据提取信息,创建索引的过程。
2.搜索索引:就是得到用户的查询请求,搜索创建的索引,然后返回结果的过程。


倒排索引:
顺序查找的意思就是已知文件,欲求字符串的过程,也即是从文件到字符串的映射。而我们想搜索的信息是哪些文件包含此字符串,也即已知字符串,欲求文件,也即从字符串到文件的映射。两者恰恰相反。由于从字符串到文件的映射是文件到字符串映射的反向过程,于是保存这种信息的索引称为倒排索引 ,如果索引总能够保存从字符串到文件的映射,则会大大提高搜索速度。
索引里面包含的东西如下
反向索引的所保存的信息一般如下:
假设我的文档集合里面有100篇文档,为了方便表示,我们为文档编号从1到100,得到下面的结构

 


左边保存的是一系列字符串,称为词典 。
每个字符串都指向包含此字符串的文档(Document)链表,此文档链表称为倒排表 (Posting List)。
有了索引,便使保存的信息和要搜索的信息一致,可以大大加快搜索的速度。
比如说,我们要寻找既包含字符串“lucene”又包含字符串“solr”的文档,我们只需要以下几步:
1. 取出包含字符串“lucene”的文档链表。
2. 取出包含字符串“solr”的文档链表。
3. 通过合并链表,找出既包含“lucene”又包含“solr”的文件。

 


虽然创建索引库也需要流程,但是如果采用顺序扫描的话,是每次都要扫描,而创建索引的过程仅仅需要一次,以后便是一劳永逸的了,每次搜索,创建索引的过程不必经过,仅仅搜索创建好的索引就可以了。
如何创建索引
第一步:一些要索引的原文档(Document)。
先说Elasticsearch的文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据:
{    "name" :     "John",    "sex" :      "Male",    "age" :      25,    "birthDate": "1990/05/01",    "about" :    "I love to go rock climbing",    "interests": [ "sports", "music" ]}
为了方便说明索引创建过程,这里特意用两个文件为例:
文件一:Students should be allowed to go out with their friends, but not allowed to drink beer.
文件二:My friend Jerry went to school to see his students but found them drunk which is not allowed.
第二步:将原文档传给分词器(Tokenizer)。
分词器(Tokenizer)会做以下几件事情( 此过程称为Tokenize) :
1. 将文档分成一个一个单独的单词。
2. 去除标点符号。
3. 去除停词(Stop word) 。
所谓停词(Stop word)就是一种语言中最普通的一些单词,由于没有特别的意义,因而大多数情况下不能成为搜索的关键词,因而创建索引时,这种词会被去掉而减少索引的大小。
英语中停词(Stop word)如:“the”,“a”,“this”等。
对于每一种语言的分词组件(Tokenizer),都有一个停词(stop word)集合。
经过分词(Tokenizer) 后得到的结果称为词元(Token) 。
在我们的例子中,便得到以下词元(Token):
“Students”,“allowed”,“go”,“their”,“friends”,“allowed”,“drink”,“beer”,“My”,“friend”,“Jerry”,“went”,“school”,“see”,“his”,“students”,“found”,“them”,“drunk”,“allowed”。
第三步:将得到的词元(Token)传给语言处理组件(Linguistic Processor)。
语言处理组件(linguistic processor)主要是对得到的词元(Token)做一些同语言相关的处理。
对于英语,语言处理组件(Linguistic Processor) 一般做以下几点:
1. 变为小写(Lowercase) 。
2. 将单词缩减为词根形式,如“cars ”到“car ”等。这种操作称为:stemming 。
3. 将单词转变为词根形式,如“drove ”到“drive ”等。这种操作称为:lemmatization 。
Stemming 和 lemmatization的异同:
相同之处:Stemming和lemmatization都要使词汇成为词根形式。
两者的方式不同:
Stemming采用的是“缩减”的方式:“cars”到“car”,“driving”到“drive”。
Lemmatization采用的是“转变”的方式:“drove”到“drove”,“driving”到“drive”。
语言处理组件(linguistic processor)的结果称为词典(Term) 。
在我们的例子中,经过语言处理,得到的词(Term)如下:
【“student”,“allow”,“go”,“their”,“friend”,“allow”,“drink”,“beer”,“my”,“friend”,“jerry”,“go”,“school”,“see”,“his”,“student”,“find”,“them”,“drink”,“allow”】
第四步:将得到的词(Term)传给索引组件(Indexer)。
索引组件(Indexer)主要做以下几件事情:
1. 利用得到的词(Term)创建一个字典。
在我们的例子中字典如下:

TermDocument ID
student1
allow1
go1
their1
friend1
allow1
drink1
beer1
my2
friend2
jerry2
go2
school2
see2
his2
student2
find2
them2
drink2
allow2


2. 对字典按字母顺序进行排序。
 

TermDocument ID
allow1
allow1
allow2
beer1
drink1
drink2
find2
friend1
friend2
go1
go2
his2
jerry2
my2
school2
see2
student1
student2
their1
them2


3. 合并相同的词(Term) 成为文档倒排(Posting List) 链表。

 


在此表中,有几个定义:
Document Frequency: 即文档频次,表示总共有多少文件包含此词(Term)。
Frequency :即词频率,表示此文件中包含了几个此词(Term)。
所以对词(Term) “allow”来讲,总共有两篇文档包含此词(Term),从而词(Term)后面的文档链表总共有两项,第一项表示包含“allow”的第一篇文档,即1号文档,此文档中,“allow”出现了2次,第二项表示包含“allow”的第二个文档,是2号文档,此文档中,“allow”出现了1次。
到此为止,索引已经创建好了,我们可以通过它很快的找到我们想要的文档。
而且在此过程中,我们惊喜地发现,搜索“drive”,“driving”,“drove”,“driven”也能够被搜到。因为在我们的索引中,“driving”,“drove”,“driven”都会经过语言处理而变成“drive”,在搜索时,如果您输入“driving”,输入的查询语句同样经过我们这里的一到三步,从而变为查询“drive”,从而可以搜索到想要的文档。




如何对索引进行搜索?
第一步:用户输入查询语句。
举个例子,用户输入语句:lucene AND learned NOT hadoop。
第二步:对查询语句进行词法分析,语法分析,及语言处理
1. 词法分析主要用来识别单词和关键字。
如上述例子中,经过词法分析,得到单词有lucene,learned,hadoop, 关键字有AND, NOT。
如果在词法分析中发现不合法的关键字,则会出现错误。如lucene AMD learned,其中由于AND拼错,导致AMD作为一个普通的单词参与查询。
2. 语法分析主要是根据查询语句的语法规则来形成一棵语法树。
如果发现查询语句不满足语法规则,则会报错。如lucene NOT AND learned,则会出错。
如上述例子,lucene AND learned NOT hadoop形成的语法树如下:

 


3. 语言处理同索引过程中的语言处理几乎相同。
如learned变成learn等。
经过第二步,我们得到一棵经过语言处理的语法树。

 


第三步:搜索索引,得到符合语法树的文档。
此步骤有分几小步:

  • 首先,在反向索引表中,分别找出包含lucene,learn,hadoop的文档链表。
  • 其次,对包含lucene,learn的链表进行合并操作,得到既包含lucene又包含learn的文档链表。
  • 然后,将此链表与hadoop的文档链表进行差操作,去除包含hadoop的文档,从而得到既包含lucene又包含learn而且不包含hadoop的文档链表。
  • 此文档链表就是我们要找的文档。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值