Sphinx 全文检索
什么是全文检索:
全文检索是指以文档的全部文本信息作为检索对象的一种信息检索技术。检索的对象有可能是文章的标题,也有可能是文章的作者,也有可能是文章摘要或内容。
简介:
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
Sphinx 全文检索的更多相关文章
- Coreseek/sphinx全文检索的了解
Coreseek/sphinx全文检索的了解 概述: 全文检索是一种将文件里全部文本与检索项匹配的文字资料检索方法,全文检索是将存储于数据库中整本书.整篇文章中的随意内容信息查找出来的检索.它能够依据 ...
- Sphinx全文检索
全文检索 一.生活中的数据总体分为: 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等. 非结构化数据:指没有固定格式或不定长的数据,如邮件,word文档等. 非结构化数据还有一种叫法: ...
- Sphinx全文检索引擎测试
数据表 1.documents CREATE TABLE `documents` ( `id` int(13) NOT NULL auto_increment, `group_id` int(11) ...
- sphinx全文检索 安装配置和使用
公司项目刚刚导入大量产品数据,然后发现网站的产品搜索很卡,原本是原生sql的like来做模糊搜索,数据量20W的时候还可以接受,但是上百万就很卡了,所以需要做优化. 经过考虑,打算采用全文检索 sph ...
- sphinx全文检索功能 | windows下测试 (一)
前一阵子尝试使用了一下Sphinx,一个能够被各种语言(PHP/Python/Ruby/etc)方便调用的全文检索系统.网上的资料大多是在linux环境下的安装使用,当然,作为生产环境很有必要部署在* ...
- sphinx全文检索之PHP使用(转)
基础 数据结构: CREATE TABLE email ( emailid mediumint(8) unsigned NOT NULL auto_increment COMMENT '邮件id', ...
- sphinx全文检索引擎
今天刚刚学习了一下,就直接分享上去,有些还没有接触,如果有问题请指正,谢谢 sphinx是什么? Sphinx是一个全文检索引擎.主要为其他应用提供高速.低空间占用.高结果 相关度的全文搜索功能. S ...
- centos7下搭建sphinx全文检索引擎
Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用 程序更容易实现专业化的全文检索.Sphinx特别为一些 ...
- discuz sphinx全文检索搜索引擎方案
基于discuz的索引配置文件,这个配置文件比较灵活,可以根据不同的需求来配置 # # linuxTone full index search configure file # source lt_p ...
随机推荐
- input value的值不可改变
同样是东钿微信服务平台,使用积分的问题,原来的版本是,默认用户不使用积分,也就没有给input赋值,后面华总说默认让用户使用积分,于是我就信誓旦旦把从后台得到用户可使用的积分赋在input上,后来,用 ...
- C# 支付宝接口
生成URL链接 1using System; 2using System.Data; 3using System.Configuration; 4using System.Collectio ...
- baseDao 使用spring3+hibernate3方式
package cn.zk.pic.service.dao; import java.io.Serializable; import java.util.List; import java.util. ...
- 新唐M0 ISP下载要点
http://blog.csdn.net/rejoice818/article/details/7736029 一.注意:官方光盘内“Software Utilities”目录下,可找到ICP或ISP ...
- PostgreSQL的注释嵌套的例子
pgsql=# -- Multiline comments pgsql=# SELECT 'Multi' /* This comment extends across pgsql*# * number ...
- MPIO配置
设置好两块网卡的IP(实用同一段IP,或者不同网段IP均可以配置多路径)iSCSI发起程序配置:1.添加发现(默认设置即可)2.目标-连接-高级:分别配置 本地适配器.发起程序IP.目标门户IP(此处 ...
- 资源管理更新系统V2.0版的一些问题
1.在上传文件夹时现在只能传给吴缤进行上传,不够友好,也降低了上传速度, 办法:用C#写一个WINFORM程序,为用户提供上传功能,登录也使用JAVA提供的WEBSERVICE提供登录验证,然后选择一 ...
- C++ Code_ScrollBar
主题 1. ScrollBar的使用 2. 3. 4. 5. 属性 HScrollBar VScrollBar 直接拖拽1其中任意空间到对话框上面是,你一拖拽滚动条,它立即回到原始位置 ...
- innodb_io_capacity >=innodb_lru_scan_depth*inoodb_buffer_pool_instances。与 checkpoint
innodb_lru_scan_depth:每个缓冲池刷脏页的能力 innodb_io_capacity: iops inoodb_buffer_pool_instances=8 :缓冲池的个数 . ...
- Oracle中关于清除数据和释放表空间
一.表的重命名 flashback table test2 to before drop rename to test3;--[to test3]将表重命名 drop table test3 purg ...