《Sphinx全文检索课件》由会员分享,可在线阅读,更多相关《Sphinx全文检索课件(30页珍藏版)》请在金锄头文库上搜索。
1、sphinx全文检索什么是全文检索什么是全文检索一、生活中的数据总体分为:一、生活中的数据总体分为:结构化数据:结构化数据:指具有固定格式或有限长度的数据,如数据指具有固定格式或有限长度的数据,如数据库,元数据等。库,元数据等。非结构化数据:非结构化数据:指没有固定格式或不定长的数据,如邮件,指没有固定格式或不定长的数据,如邮件,wordword文档等。文档等。半结构化数据:半结构化数据:如如XMLXML,HTMLHTML等,根据需要可按结构化数等,根据需要可按结构化数据处理,也可以抽取纯文本按非结构化数据处理。据处理,也可以抽取纯文本按非结构化数据处理。非非结构化数据还有一种叫法:结构化数据
2、还有一种叫法:全文数据全文数据。二、按数据的分类,搜索也分为两种:二、按数据的分类,搜索也分为两种:对结构化数据的搜索:对结构化数据的搜索:如对数据库的搜索:如对数据库的搜索:SQLSQL语句。语句。再如再如windowswindows的搜索:文件名,类型,修改时间。的搜索:文件名,类型,修改时间。对非结构化数据的搜索:对非结构化数据的搜索:如如windowswindows对文件内容的搜索。对文件内容的搜索。LinuxLinux下得下得grepgrep命令。命令。再如再如GoogleGoogle和百度可以搜素大量内容数据。和百度可以搜素大量内容数据。对于非结构化的数据搜索也叫做对于非结构化的数
3、据搜索也叫做对全文数据的搜索对全文数据的搜索。三、对全文数据的搜索还可以分为两种三、对全文数据的搜索还可以分为两种1 1、顺序扫描、顺序扫描:如要找内容包含某个字符串的文件,会一个如要找内容包含某个字符串的文件,会一个文档一个文档的从头到尾的找,如文档一个文档的从头到尾的找,如 LikeLike查找查找 。2 2、索引扫描:、索引扫描:把非结构化的数据中的内容提取出来一部分把非结构化的数据中的内容提取出来一部分重新组织,让它变的有结构化,这部分我们提取出来的数据重新组织,让它变的有结构化,这部分我们提取出来的数据就叫做就叫做 索引索引模拟词典模拟词典Linux是什么,Linux是一个开源的操作
4、系统。1页Apache是什么?Apache是一个开源的Web服务器。2页MySQL是什么?MySQL是一个开源的数据库。3页PHP是什么?PHP是一个开源的脚本语言。4页Linux1Linux1页页页页PHP4PHP4页页页页MySQL3MySQL3页页页页Apache2Apache2页页页页全文检索大体分两个过程:全文检索大体分两个过程:索引创建索引创建(Indexing)(Indexing)和和 搜索索引搜索索引(Search)(Search)。u索引创建:将现实世界中所有的结构化和非结构索引创建:将现实世界中所有的结构化和非结构化数据提取信息,创建索引的过程。化数据提取信息,创建索引的过
5、程。 u搜索索引:就是得到用户的查询请求,搜索创建搜索索引:就是得到用户的查询请求,搜索创建的索引,然后返回结果的过程。的索引,然后返回结果的过程。 三个重要问题三个重要问题索引里面究竟存些什么?索引里面究竟存些什么?(Index)如何创建索引?如何创建索引?(Indexing)如何对索引进行搜索?如何对索引进行搜索?(Search)一、索引里面究竟存些什么?索引里面究竟存些什么? 为什么顺序扫描的速度慢?为什么顺序扫描的速度慢? 非结构化数据中所存储的信息是非结构化数据中所存储的信息是每个文件包含哪些字符每个文件包含哪些字符串串,已知文件,欲求字符串,从文件到字符串的映射。,已知文件,欲求字
6、符串,从文件到字符串的映射。 而我们想搜索的信息是而我们想搜索的信息是哪些字符串都在哪个文件中有哪些字符串都在哪个文件中有,已知字符串,欲求文件,从字符串到文件的映射。已知字符串,欲求文件,从字符串到文件的映射。如果有个东西总能够保存如果有个东西总能够保存从字符串到文件的映射从字符串到文件的映射?大大提高搜索速度。大大提高搜索速度。总能保存这种关系的东西就是总能保存这种关系的东西就是索引索引。索引所保存的信息一般如下索引所保存的信息一般如下: :假设我现在有假设我现在有100100篇文档,从篇文档,从1 1到到100100表示。表示。SphinxPHPLinux2566172345233287
7、654478 词典 倒排表倒排表二、如何创建索引?二、如何创建索引?全文检索的索引创建过程一般有以下几步:全文检索的索引创建过程一般有以下几步:一些需要创建索引的一些需要创建索引的文档文档(Documents)(Documents)。将原文档传给将原文档传给分词组件分词组件(Tokenizer)。将得到的将得到的词元词元(Token)(Token)传给传给语言处理组件语言处理组件(Linguistic Processor)(Linguistic Processor)。将得到的将得到的词词(Term)(Term)传给传给索引组件索引组件(Indexer)(Indexer)。第一步:一些创建索引的
8、文档。第一步:一些创建索引的文档。文档文档1 1:Studentsshouldbeallowedtogooutwiththeirfriends,butnotallowedtodrinkbeer.文档文档2 2:MyfriendJerrywenttoschooltoseehisstudentsbutfoundthemdrunkwhichisnotallowed.第二步:将原文档传给分词组件第二步:将原文档传给分词组件(Tokenizer)。分词组件分词组件(Tokenizer)会做以下几件事情会做以下几件事情( (此过程称为此过程称为Tokenize)Tokenize):1 1. 将文档分成一个
9、一个单独的单词。2. 去除标点符号。3. 去除停词(Stopword)。所谓停词(Stopword)就是一种语言中最普通的一些单词:英语中的停词(Stopword)如:“the”,“a”,“this”等。中文中的停词 如:是的这个等。对于每一种语言的分词组件(Tokenizer),都有一个停词(stopword)集合。经过分词(Tokenizer)后得到的结果称为词元(Token)。在我们的例子中,便得到以下词元(Token):Students、allowed、go、their、friends、allowed、drink、beer、My、friend、Jerry、went、school、see
10、、his、students、found、them、drunk、allowed。第三步:将得到的词元第三步:将得到的词元( (Token)传给语言处理组件传给语言处理组件(LinguisticProcessor)。语言处理组件主要是对得到的词元做一些同语言相关的处理:对于英语,语言处理组件一般做以下几点:1.变为小写(Lowercase)。2. 将单词缩减为词根形式,如“cars”到“car”等。3. 将单词转变为词根形式,如“drove”到“drive”等。语言处理组件的结果称为语言处理组件的结果称为词词(Term)(Term)。在我们的例子中,经过语言处理,得到的词(Term)如下:Stud
11、ent、allow、go、their、friend、allow、drink、beer、my、friend、jerry、go、school、see、his、student、find、them、drink、allow。也正是因为有语言处理的步骤,才能使搜索drove,而drive也能被搜索出来。第四步第四步:将得到的词将得到的词(Term)传给索引组件传给索引组件(Indexer)索引组件索引组件(Indexer)主要做以下几件事情:主要做以下几件事情:1.利用得到的词利用得到的词(Term)创建一个字典。创建一个字典。2.对字典按字母顺序进行排序。对字典按字母顺序进行排序。步骤步骤1:步骤步骤2
12、:TermDocumentIDstudent1allow1go1their1friend1allow1drink1beer1my2friend2jerry2go2school2see2his2student2find2them2drink2allow2TermDocumentIDallow1allow1allow2beer1drink1drink2find2friend1friend2go1go2his2jerry2my2school2see2student1student2their1them2DocumentFrequency即文档频次表示总共有多少文件包含此词(Term)Frequenc
13、y即词频率表示此文件中包含了几个此词(Term)3.合并相同的词合并相同的词(Term)成为文档倒排成为文档倒排(PostingList)链表。链表。到这里我们找到到这里我们找到“想要得到的文档想要得到的文档”三、如何对索引进行搜索三、如何对索引进行搜索搜索主要分为以下几步:搜索主要分为以下几步:第一步:用户输入查询语句。第一步:用户输入查询语句。第二步:对查询语句进行词法分析,语法分析,及语言处理第二步:对查询语句进行词法分析,语法分析,及语言处理第三步:搜索索引,得到符合语法树的文档。第三步:搜索索引,得到符合语法树的文档。第四步:根据得到的文档和查询语句的相关性,对结果进行第四步:根据得
14、到的文档和查询语句的相关性,对结果进行排序。排序。第一步、用户输入查询语句第一步、用户输入查询语句查询语句同我们普通的语言一样,也是有一定语法的。查询语句同我们普通的语言一样,也是有一定语法的。不同的查询语句有不同的语法,如不同的查询语句有不同的语法,如SQLSQL语句就有一定的语法,语句就有一定的语法,查询语句的语法根据全文检索系统的实现而不同。查询语句的语法根据全文检索系统的实现而不同。最基本的有比如:最基本的有比如:AND, OR, NOTAND, OR, NOT等。等。例子,用户输入语句:例子,用户输入语句:Sphinx AND PHP NOT LinuxSphinx AND PHP
15、NOT Linux。说明用户想找一个包含说明用户想找一个包含SphinxSphinx和和PHPPHP然而不包括然而不包括LinuxLinux的文档的文档第二步:对查询语句进行词法分析,第二步:对查询语句进行词法分析, 语法分析,及语言处理。语法分析,及语言处理。1. 1. 词法分析主要用来识别词法分析主要用来识别单词单词和和关键字关键字。如上述例子中,经过词法分析,得到单词有如上述例子中,经过词法分析,得到单词有SphinxSphinx,PHPPHP,LinuxLinux, 关键字有关键字有 ANDAND,NOTNOT。如果在词法分析中发现不合法的关键字,则会出现错误。如如果在词法分析中发现不
16、合法的关键字,则会出现错误。如Sphinx AMD LinuxSphinx AMD Linux,其中由于,其中由于ANDAND拼错,导致拼错,导致AMDAMD作为一个普作为一个普通的单词参与查询。通的单词参与查询。2 2. . 语法分析主要是根据语法分析主要是根据查询语句的语法规则查询语句的语法规则来形成来形成一棵一棵语法树语法树。3 3. . 语言处理语言处理 同索引过程中的语言处理几乎相同。同索引过程中的语言处理几乎相同。如:如:Sphinx Sphinx 变成变成 Sphin Sphin 除去停词等,我们得到除去停词等,我们得到经过语言处理的语法树经过语言处理的语法树。ANDNOTSph
17、inxPHPLinux第三步:搜索索引,得到符合语法树的文档。第三步:搜索索引,得到符合语法树的文档。此步骤有分几小步:此步骤有分几小步:首先首先,在索引表中,分别找出包含,在索引表中,分别找出包含SphinxSphinx,PHPPHP,LinuxLinux的文的文档链表。档链表。 其次其次,对包含,对包含SphinxSphinx,PHPPHP的链表进行合并操作,得到既包的链表进行合并操作,得到既包含含SphinxSphinx又包含又包含PHPPHP的文档链表。的文档链表。 然后然后,将此链表与,将此链表与LinuxLinux的文档链表进行差操作,去除包含的文档链表进行差操作,去除包含Linu
18、xLinux的文档,从而得到既包含的文档,从而得到既包含SphinxSphinx又包含又包含PHPPHP而且不包含而且不包含LinuxLinux的文档链表。的文档链表。 此文档链表就是我们要找的文档。此文档链表就是我们要找的文档。 第四步:根据得到的文档和查询语句的相关性,对结果第四步:根据得到的文档和查询语句的相关性,对结果 进行排序进行排序首先首先我们得到了想要的文档,我们得到了想要的文档,然后然后我们需要对查询结果按照查我们需要对查询结果按照查询语句的询语句的相关度相关度进行排序,越相关的越靠前。进行排序,越相关的越靠前。如何计算如何计算文档文档和和查询语句查询语句的相关性呢?的相关性呢
19、?我们把查询语句看作一片短小的文档,对文档与文档之间的相我们把查询语句看作一片短小的文档,对文档与文档之间的相关性关性(relevance)(relevance)进行打分进行打分(scoring)(scoring),分数高的相关性好,就,分数高的相关性好,就应该排在前面。应该排在前面。那么又怎么对文档之间的关系进行打分呢?那么又怎么对文档之间的关系进行打分呢?我们先看看生活中的实例:我们先看看生活中的实例:公司与公司之间的关系:公司与公司之间的关系:首先看一个公司是由什么人组成,首先看一个公司是由什么人组成,如总经理,经理,首席技如总经理,经理,首席技术官,普通员工,保安,门卫等。术官,普通员
20、工,保安,门卫等。其次公司与公司之间的关系,不同的人重要性不同:其次公司与公司之间的关系,不同的人重要性不同:总经理,经理,首席技术官可能更重要一些,普通员工,保总经理,经理,首席技术官可能更重要一些,普通员工,保安,门卫可能不重要。所以如果两个公司总经理,经理,首安,门卫可能不重要。所以如果两个公司总经理,经理,首席技术官之间关系比较好,两个公司容易有比较好的关系。席技术官之间关系比较好,两个公司容易有比较好的关系。然而一位普通员工就算与另一家公司的一位普通员工有血海然而一位普通员工就算与另一家公司的一位普通员工有血海深仇,怕也难影响两个公司之间的关系。深仇,怕也难影响两个公司之间的关系。如
21、何判断文档之间的关系:如何判断文档之间的关系:首先,一个文档有很多词首先,一个文档有很多词(Term)(Term)组成,组成,如如search, Sphinx, search, Sphinx, fulltext, this, a, whatfulltext, this, a, what等。等。其次对于文档之间的关系,其次对于文档之间的关系,不同的不同的TermTerm重要性不同,比如对重要性不同,比如对于本篇文档,于本篇文档,search, Sphinx, fulltextsearch, Sphinx, fulltext就相对重要一些,就相对重要一些,this, a , whatthis, a
22、 , what可能相对不重要一些。所以如果两篇文档都可能相对不重要一些。所以如果两篇文档都包含包含search, Sphinxsearch, Sphinx,fulltextfulltext,这两篇文档的相关性好一,这两篇文档的相关性好一些,然而就算一篇文档包含些,然而就算一篇文档包含this, a, whatthis, a, what,另一篇文档不,另一篇文档不包含包含this, a, whatthis, a, what,也不能影响两篇文档的相关性。,也不能影响两篇文档的相关性。因而判断文档之间的关系:因而判断文档之间的关系:1 1、找出哪些词、找出哪些词(Term)(Term)对文档之间的关
23、系最重要对文档之间的关系最重要,2 2、判断这些词、判断这些词(Term)(Term)之间的关系。之间的关系。1 1、找出词、找出词(Term)(Term)对文档的重要性的过程称为对文档的重要性的过程称为计算词的权重计算词的权重(Term weight)(Term weight)的过程。的过程。计算词的权重计算词的权重(term weight)(term weight)有两个参数,有两个参数,第一个是第一个是词词( (Term)Term),第二个是,第二个是文档文档(Document)(Document)。词的词的权重权重(Term weight)(Term weight)表示此词表示此词(T
24、erm)(Term)在此文档中的重要程度,越重要在此文档中的重要程度,越重要的词的词(Term)(Term)有越大的权重有越大的权重(Term weight)(Term weight),因而在计算文档之间的相,因而在计算文档之间的相关性中将发挥更大的作用。关性中将发挥更大的作用。影响一个词影响一个词(Term)(Term)在一篇文档中的重要性主要有两个因:在一篇文档中的重要性主要有两个因:Term Frequency (tf)Term Frequency (tf):即此即此TermTerm在此文档中出现了多少次。在此文档中出现了多少次。tf tf 越大说明越重要。越大说明越重要。 Docume
25、nt Frequency (df)Document Frequency (df):即有多少文档包含次即有多少文档包含次TermTerm。df df 越大说明越不重要。越大说明越不重要。 2 2、判断词、判断词(Term)(Term)之间的关系从而得到文档相关性的过程,之间的关系从而得到文档相关性的过程,应用一种叫做应用一种叫做向量空间模型的算法向量空间模型的算法(Vector Space Model)(Vector Space Model)。判断判断TermTerm之间的关系从而得到文档相关性的过程,之间的关系从而得到文档相关性的过程,也即也即向量空间模型的算法向量空间模型的算法(VSM)(V
26、SM)。我们把文档看作一系列词我们把文档看作一系列词(Term)(Term),每一个词,每一个词(Term)(Term)都有一个都有一个权重权重(Term weight)(Term weight),不同的词,不同的词(Term)(Term)根据自己在文档中的根据自己在文档中的权重来影响文档相关性的打分计算。权重来影响文档相关性的打分计算。于是我们把所有此文档中词于是我们把所有此文档中词(term)(term)的的权重权重(term weight) (term weight) 看看作一个向量作一个向量。对创建索引和搜索做一个总结对创建索引和搜索做一个总结:1. 1. 索引过程:索引过程:1) 1
27、) 有一系列被索引文件有一系列被索引文件2) 2) 被索引文件经过语法分析和语言处理被索引文件经过语法分析和语言处理形成一系列词形成一系列词(Term)(Term)。3) 3) 经过索引创建形成词典和反向索引表。经过索引创建形成词典和反向索引表。4) 4) 通过索引存储将索引写入硬盘。通过索引存储将索引写入硬盘。2. 2. 搜索过程:搜索过程:a) a) 用户输入查询语句。用户输入查询语句。b) b) 对查询语句经过语法分析和语言分析对查询语句经过语法分析和语言分析得到一系列词得到一系列词(Term)(Term)。c) c) 通过语法分析得到一个查询树。通过语法分析得到一个查询树。d) d)
28、通过索引存储将索引读入到内存。通过索引存储将索引读入到内存。e) e) 利用查询树搜索索引,从而得到每个利用查询树搜索索引,从而得到每个词词(Term)(Term)的文档链表,对文档链表进行的文档链表,对文档链表进行交,差,并得到结果文档。交,差,并得到结果文档。f) f) 将搜索到的结果文档对查询的相关性将搜索到的结果文档对查询的相关性进行排序。进行排序。g) g) 返回查询结果给用户。返回查询结果给用户。全文检索技术是目前全文检索技术是目前搜索引擎搜索引擎的关键技术。的关键技术。 全文检索是指计算机索引程序,通过扫描文章中的每全文检索是指计算机索引程序,通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现一个词,对每一个词建立一个索引,指明该词在文章中出现的的次数和位置次数和位置,当用户查询时,检索程序就根据事先建立的,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。个过程类似于通过字典中的检索字表查字的过程。全文检索引擎全文检索引擎是按照全文检索理论建立起来的用于提供是按照全文检索理论建立起来的用于提供全文检索服务的软件系统全文检索服务的软件系统。谢谢