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

 

posted on 2016-06-18 23:18  gimin  阅读(533)  评论(0)    收藏  举报