Sphinx全文检索
什么是全文检索
一、生活中的数据总体分为:
结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。
非结构化数据:指没有固定格式或不定长的数据,如邮件,word文档等。
非结构化数据还有一种叫法:全文数据。
二、按数据的分类,搜索也分为两种:
对结构化数据的搜索:
如对数据库的搜索:SQL语句。
再如windows的搜索:文件名,类型,修改时间。
对非结构化数据的搜索:
如windows对文件内容的搜索。
Linux下的grep命令。
再如Google和百度可以搜索大量内容数据。
对非结构化的数据搜索也叫做对全文数据的搜索。
三、对全文数据的搜索还可以分为两种
1、顺序扫描:如要找内容包含某个字符串的文件,会一个文档一个文档的从头到尾的找,如Like查找。
2、索引扫描:把非结构化的数据中的内容提取出来一部分重新组织,让它变的有结构化,这部分我们提取出来的数据叫做索引。
全文检索大体分两个过程
索引创建(Indexing)和搜索索引(Search)。
索引创建:将现实世界中所有结构化和非结构化数据提取信息,创建索引的过程。
搜索索引:就是得到用户的查询请求,搜索创建的索引,然后返回结果的过程。
如果对索引进行搜索
搜索主要分为以下几步:
第一步:用户输入查询语句
第二步:对查询语句进行词法分析,语法分析,及语言处理
第三步:搜索索引,得到符合符合语法树的文档
第四步:根据得到的文档和查询语句的相关性,对结果进行排序。
创建索引和搜索流程:
什么是Sphinx
Sphinx是SQL Phrase Index(查询词组索引)的缩写,Sphinx是一个基于SQL的全文检索引擎
Sphinx 全文检索引擎
Coreseek 支持中文的全文检索引擎
Spninx优缺点
优点:
高速的建立索引(在当代CPU上,可达到10MB/秒);
高性能的搜索(在2-4GB的文本数据上,平均每次检索响应时间小于0.1秒);
可处理海量数据(目前已知可以处理超过100GB的文本数据,在单一CPU的系统上可处理100M文档);
提供了邮箱的相关算法,基于短语相似度和统计BM2的符合Ranking方法;
支持分布式搜索;
提供文档片段(摘要以及高亮) 生成功能;
可作为MySQL的存储引擎提供搜索服务;
支持布尔、短语、词语相似度等多种检索模式;
文档支持多个全文检索字段(最大不超过32个);
缺点:
必须要有主键
主键必须为整型
不负责数据存储
配置不灵活
MySQL和Sphinx的全文检索区别:
1、它可以提高比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。
2、它是一个单独的服务器,具有很多MySQL自身不具备的扩展功能,性能更高,它存在于MySQL之前,更好的缓解数据库压力等...
什么是中文分词
用户搜索 —> Sphinx —> 中文文档 —> 中文分词
1、全文索引:是指计算机索引程序通过扫描文档中的每个词,对每个词建立索引,记录词在文档中的位置及次数,当用户查询时,直接搜索索引,并返回结果的检索方式。
2、中文分词:对于英文,可以自然的把文档按空格分隔成词,但是对于中文来说,Sphinx并不认识中文的字,或词。
英文:I am a teacher。自然分隔成 I/am/a/teacher
中文:我是一个老师。 不能分割成 我/是/一个/老师
Sphinx不认识'我'是什么、'老师'是一个词吗?
所以我们要让Sphinx认识这些词。
安装Sphinx
# tar xzf sphinx-0.9.9.tar.gz # cd sphinx-0.9.9 # ./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql/ # make && make install
Sphinx中重要的三个命令(Sphinx安装的bin目录下)
Indexer创建索引命令。Searchd 启动进程命令。 Search 命令行搜索命令。
配置sphinx.conf配置文件
[root@localhost etc]# cp sphinx.conf.dist sphinx.conf [root@localhost etc]# vi sphinx.conf 主数据源: source main{ } 增量数据源: source delta:main{ } 主数据索引: index mian{ } 增量数据索引: index delta:main{ } 分布式索引: index dist1{ } 索引器: index { } 服务进程 searchd{ }
--主数据源 source main{ sql_host = localhost sql_user = root sql_pass =root sql_db = test sql_port = 3306 # optional, default is 3306 sql_sock = /tmp/mysql.sock sql_query_pre = SET NAMES utf8 sql_query_pre = SET SESSION query_cache_type=OFF sql_query=select id,title,content from post #sql_attr_uint = group_id #sql_attr_timestamp = date_added sql_query_info = SELECT * FROM post WHERE id=$id } --增量数据源暂时关闭 #source src1throttled : src1 #{ # sql_ranged_throttle = 100 #} --主数据索引 index main { source = main #索引源声明 path = /usr/local/sphinx/var/data/main charset_type = utf-8 #数据编码(设置成utf8) charset_table = #上面指定了utf-8,这里需要开启 } --增量索引(暂时注释:480,484s/^/#/g) --分布式(暂时注释:491,522s/^/#/g) --索引器 indexer { mem_limit = 128M }
创建配置文件
Sphinx的配置文件配置完成,数据也就导进去了,接下来就用下面命令来创建索引:
创建索引命令:indexer
-c 指定配置文件
-all 对所有索引重新编制索引
--rorate 用于轮换索引,主要是在不停止服务的时候,增加索引。
--merge 合并索引
/usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/sphinx.conf --all
报错:
/usr/local/sphinx/bin/indexer: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory
可以用下面的方法解决:
locate libmysqlclient 运行该命令找到关于libmysqlclient.so.16的文件,然后把该文件的一个链接复制到在环境变量的文件夹/usr/lib下
[root@localhost etc]# locate libmysqlclient [root@localhost etc]# cp /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /usr/lib/
再次执行命令,可以看到生成索引情况。
利用search命令测试
[root@localhost bin]# ./search php1 displaying matches: 1. document=2, weight=1 id=2 title=php1 content=php111111111 words: 1. 'php1': 1 documents, 1 hits
浙公网安备 33010602011771号