什么是全文检索:
全文检索是指以文档的全部文本信息作为检索对象的一种信息检索技术。检索的对象有可能是文章的标题,也有可能是文章的作者,也有可能是文章摘要或内容。
简介:
Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎。意图为其他应用提供高速、低空间占用、高结果 相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。
当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式 的XML数据。通过修改源代码,用户可以自行增加新的数据源(例如:其他类型的DBMS 的原生支持);
它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件(SphinxEx)。
Sphinx单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引只需 3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。
特性:
Sphinx的主要特性包括:
高速索引 (在新款CPU上,近10 MB/秒);
高速搜索 (2-4G的文本量中平均查询速度不到0.1秒);
高可用性 (单CPU上最大可支持100 GB的文本,100M文档);
提供良好的相关性排名
支持分布式搜索;
提供文档摘要生成;
提供从MySQL内部的插件式存储引擎上搜索
支持布尔,短语, 和近义词查询;
支持每个文档多个全文检索域(默认最大32个);
支持每个文档多属性;
支持断词;
支持单字节编码与UTF-8编码。
全文检索基本原理实现过程:
索引创建(Indexing)和搜索索引(Search)
索引创建:将现实世界中所有的结构化和非结构化数据提取信息,创建索引的过程;
搜索索引:就是得到用户的查询请求,搜索创建的索引,然后返回结果的过程;
如何创建索引?(Indexing)
1.一些需要创建索引的文档(Documents);
2.将原文档传给分词组件(Tokenizer);
3.将得到的词元(Token)传给语言处理组件(Linguistic Processor);
4.将得到的词(Term)传给索引组件(Indexer);
第一步:一些创建索引的文档;
文档1: Students should be allowed to go out with their friends,but not allowed to drink beer;
文档2: 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);
语言处理组件主要是对得到的词元做一些同语言相关的处理,对于英语,语言处理组件一般做以下几点:
1.将单词变为小写(Lowercase);
2.将单词缩减为词根形式,如“cars”到“car”等;这种操作称为:stemming
3.将单词转变为词根形式,如“drove”到“drive”等,这种操作称为:lemmatization
语言处理组件的结果称为词(Term);
在我们的例子中,经过语言处理,得到的词(Term)如下:
Student,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.对字典按字母顺序进行排序(文档与对应的ID);
3.合并相同的词(Term)成为文档倒排(Posting List)链表
如何对索引进行搜索?(Search)
1.用户输入查询语句;
2.对查询语句进行词法分析,语法分析,及语言处理;
3.搜索索引,得到符合语法树的文档;
4.根据得到的文档和查询语句的相关性,对结果进行排序;
总结:
1.索引过程
1).有一系列被索引文件
2).被索引文件经过语法分析和语言处理形成一系列词(Term);
3).经过索引创建形成词典和反向索引表;
4).经过索引存储将索引写入硬盘;
2.搜索过程:
1).用户输入查询语句;
2).对查询语句经过语法分析和语言分析得到一系列词(Term);
3).通过语法分析得到一个查询树;
4).通过索引存储将索引读入到内存;
5).利用查询树搜索索引,从而得到每个词(Term)的文档链表,对文档链表进行交,差,并得到结果文档;
6).将搜索到的结果文档对查询的相关性进行排序;
7).返回查询结果给用户;
如我们在百度里进行搜索PHP环境搭建,它能把包含PHP、环境、搭建,环境搭建的文档都能搜索出来,在这个过程中首先它会把要搜索的词交给sphinx处理,然后sphinx通过分词处理组件把PHP、环境、搭建,环境搭建这几个词拆出来得到词元,通过语言处理组件把得到的词元进行时态转换得到词(PHP、环境、搭建,环境搭建),接着把得到的词交给sphinx索引表进行搜索,这时就会把这些词对应的文档索引就给找出来了;
(基本原理实现来源兄弟连资料)
更多参考资料:
http://sphinxsearch.com/wiki/doku.php?id=sphinx_manual_chinese
http://sphinxsearch.com/wiki/doku.php?id=sphinx_chinese_tutorial
http://www.sphinxsearch.org
https://code.google.com/p/sphinx-for-chinese
http://www.coreseek.cn