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 ...
随机推荐
- ELF学习--可执行文件
承接上一篇.我们来看看可执行文件和重定位文件的不同点. readelf -h test 相比较重定位文件,可执行文件的ELF header中入口地址是0x8048320.而且除了section hea ...
- 关于mysql存储过程的definer的问题
由于对mysql了解不够透彻,导致对definer问题查了好久才解决问题 记录自己的一些理解! 问题描述: 在数据库写,为一个表写了一个触发器,此触发器调用一个存储过程:由公司写的一个c程序自动往该表 ...
- Castle IOC容器构建配置详解(一)
主要内容 1.配置什么 2.几种配置方式 3.Include 介绍 4.Properties介绍 5.条件状态 一.配置什么 Castle IOC中并不像Spring.net那样贯穿着一个思想就是一切 ...
- Pyqt5.2.1生成的.ui文件转换成.py
cmd C:\>pyuic5 ui文件路径 -o 要生成的py文件路径 如下: C:\>pyuic5 c:\python33\lib\site-packages\pyqt5\uic\log ...
- easyui combobox筛选(拼音)
1.combobox本身的筛选 $('#cc').combobox({ filter: function(q, row){ var opts = $(this).combobox('options') ...
- EasyMock使用说明
来自官网的使用说明,原文见http://www.easymock.org/EasyMock2_0_Documentation.html 1.1. 准备 大多数的软件系统都不是单独运行的,它们都需要于其 ...
- 一条结合where、group、orderby的linq语法
DataTable dt = (from x in dsResult.Tables[0].AsEnumerable() where DataTrans.CBoolean(x["IsCheck ...
- nginx 配置虚拟主机(支持php)
配置步骤: 1.在nginx安装目录下,找到nginx.conf所在文件夹,新建vhost文件夹 2.在nginx.conf http{} 末端加入 include vhost/*.conf; 3.进 ...
- canvas绘制直线和多边形基本操作
<!DOCTYPE HTML> <html lang="en"> <body> <canvas id="canvas" ...
- 习总强调网络安全 ,咱们国产SSL证书必须加快普及速度
上海(2014 年 2 月 27 日)—— 央视新闻联播 27 日报道中央网络安全和信息化领导小组于当日成立的消息及习总在该小组首次会议上的重要讲话.据悉,该小组由习总任小组长,李克强.刘云山任副组长 ...