Sphinx的学习
一.sphinx的简介
1sphinx简介
Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎。意图为其他应用提供高速、低空间占用、高结果 相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。当前系统内置MySQL和PostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式 的XML数据。
Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。
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编码;
2 sphinx和lucene的比较
lucene是什么:lucene是用java开发的一个支持全文检索的jar包。
1)Sphinx建索引速度非常的快;Lucene建索引相比Sphinx要差很多。
同样建1000w数据,Sphinx2分钟以内,Lucene10分钟多。
2)Sphinx的结构必须提前预定义好;Lucene的索引结构是比较*的。这点上个人觉得Lucene要比Sphinx好一些。
3)Sphinx查询中Attribute(属性)的概念,而且Sphinx在启动Searchd的时候会将所有属性加载到内存中;而Lucene则没有,虽然Lucene也有NumericField,但是底层仍然是作为String处理的。
这点上会导致Sphinx会比Lucene查询性能上快许多。
4)Sphinx是用C++开发的;Lucene最初是用Java开发的,目前已经有python版本和C版本的,以及.net版本的
二.sphinx的安装
1.下载
可以到官网下载到最新的版本2.2.3
http://sphinxsearch.com/downloads/release/
2所需环境
官方推荐是在linux上进行生产,但是我们可以在windows上做实验。
3安装
Sphinx在mysql上的应用有两种方式:
(1). 采用API调用,如使用PHP、java等的API函数或方法查询。优点是可不必对mysql重新编译,服务端进程“低耦合”,且程序可灵活、方便的调用;缺点是如已有搜索程序的条件下,需修改部分程序。推荐程序员使用。
(2) 使用插件方式(sphinxSE)把sphinx编译成一个mysql插件并使用特定的sql语句进行检索。其特点是,在sql端方便组合,且能直接返回数据给客户端。不必二次查询,在程序上仅需要修改对应的sql,但这对使用框架开发的程序很不方便,比如使用了ORM。另外还需要对mysql进行重新编译,且需要mysql-5.1以上版本支持插件存储。
我上周使用的是第一种方式,版本为Sphinx-for-chinese,mysql为5.1.39-standard,然后在应用里使用java客户端API去调用。
a. 下载所需的安装包
sphinx-for-chinese-0.9.9-r2117.tar.gz
xdict_1.1.tar.gz
下载地址:http://code.google.com/p/sphinx-for-chinese/downloads/list
b. 解压 tar -zxvf sphinx-for-chinese-0.9.9-r2117.tar.gz
c. 编译安装
$ cd sphinx-for-chinese-0.9.9-r2117.tar.gz
$ ./configure
$ make
$ sudo make install
d. 解压字典文件 xdict_1.1.tar.gz
$ tar zxvf xdict_1.1.tar.gz
e. 借助先前安装的 mkdict 工具生成字典
$ /usr/local/sphinx/bin/mkdict xdict.txt xdict
f. 将字典 xdict 拷贝到 /usr/local/sphinx/etc目录下
三.sphinx 的配置
source src1
{
type= mysql
sql_host= 172.19.34.77
sql_user= root
sql_pass= root
sql_db= testshopsp1
sql_port= 3306# optional, default is 3306
sql_query= SELECT newsid as id,updateauthor,title,subtitle,author,content,nodeid,isdelete,dateline,displayorder,top,iscommend from news
# 只有select语句中有的字段才会进行全文匹配搜索。
#只有在下边sql属性中配过的字段才可以做排序,当然下边属性可以配置字符串类型的sql_attr_str2ordinal,但是它会进行优化转换为int型存储,最后搜索到的也是int值。这个属性类型(简称为字串序数)的设计是为了允许按字符串值排序,但不存储字符串本身
sql_attr_uint= nodeid
sql_attr_uint= isdelete
sql_attr_uint= displayorder
sql_attr_uint= top
sql_attr_uint= iscommend
sql_attr_timestamp= dateline
sql_ranged_throttle= 0
sql_query_pre = SET NAMES utf8
}
index news
{
source= src1
path= /usr/local/sphinx0.9/data/news #news为文件名
charset_type = utf-8
chinese_dictionary = /usr/local/sphinx0.9/etc/xdict
}
indexer
{
mem_limit= 64M
}
searchd
{
port= 9312
log= /usr/local/sphinx0.9/var/log/searchd.log
query_log= /usr/local/sphinx0.9/var/log/query.log
read_timeout= 5
max_children= 30
pid_file= /usr/local/sphinx0.9/var/log/searchd.pid
max_matches= 1000
seamless_rotate= 1
preopen_indexes= 0
unlink_old= 1
}
至于详细配置在安装包下sphinx.conf.dist文件中有全部的配置。sphinx-min.conf.dist是一个最小的配置。
四.我使用sphinx过程中遇到的问题
1 刚开始安装的是sphinx2.1.9,安装完后并不支持中文,这是安装coreseek
coreseek-4.1-beta.tar.gz 包含了分词包 mmseg-3.2.14 和搜索包 csft-4.1。
安装 mmseg
$ cd /usr/local/src/
$ sudo tar xf /path/to/coreseek-4.1-beta.tar.gz
$ cd coreseek-4.1-beta/mmseg-3.2.14/
$ ./bootstrap ##输出的warning信息可以忽略,如果出现error则需要解决
$ ./configure --prefix=/usr/local/mmseg3
$ make
$ sudo make install
测试:
$ /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc ../testpack/var/test/test.xml
安装 csft
$ cd ../csft-4.1/
$ ./buildconf.sh ##输出的warning信息可以忽略,如果出现error则需要解决
$ ./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql ##如果提示mysql问题
$ make
$ sudo make install
在make这一步报错。
2.索引的名字问题
用goods做索引的名字是会自动生成goods.new开头的索引文件,但是在客户端指定搜索goods时又不到。
解决办法:更改了goods为merchandise后生成索引正常。后来百度也没查到goods是关键字什么的。
网上有说如果硬盘空间不够了也会报这样的错误。
3安装时的其他问题:
问题1:安装sphinx/mmseg时编译:
$ make
在这个步骤,可能遇到一个问题,就是报 sphinx undefined reference to 'libiconv' 的错误,解决办法是修改 /src/MakeFile(注意 是src下的Makefile不是csft下的Makefile),编辑LIBS = -lm -lexpat 后面添加-liconv,即将该行该为:
LIBS = -lm -lexpat -liconv -L/usr/local/lib
安装
安装csft时
make[2]: Leaving directory `/usr/local/sphinx/src’
make[1]: * [all] Error 2
make[1]: Leaving directory `/usr/local/sphinx/src’
make: * [all-recursive] Error 1
官网解决办法:
In the meantime I’ve change the configuration file and set
#define USE_LIBICONV 0 in line 8179.
修改 configure 文件把 #define USE_LIBICONV 0 最后的数值由1改为0
重新编译。
问题2:安装sphinx时:
V_LINUX -DUNIV_LINUX -Wall -g -D_FILE_OFFSET_BITS=64 -O3 -DNDEBUG -MT tests.o -MD -MP -MF .deps/tests.Tpo -c -o tests.o tests.cpp
mv -f .deps/tests.Tpo .deps/tests.Po
g++ -Wall -g -D_FILE_OFFSET_BITS=64 -O3 -DNDEBUG -o tests tests.o libsphinx.a -rdynamic -L/usr/lib64/mysql -lmysqlclient -lz -lcrypt -lnsl -lm -lssl -lcrypto -lm -lz -lexpat -L/usr/local/lib -lrt -lpthread
make[2]: Leaving directory `/usr/local/sphinx-0.9.9/src'
make[1]: Leaving directory `/usr/local/sphinx-0.9.9/src'
sphinx安装make时,碰到libiconv的问题。
查了半天,改Makefile,configure都不可靠。最后在官站上查到:
./configure –without-iconv,就好了。那干嘛还要这个iconv嘛。
看出错代码里,是在xmlunknowencode时才用到。我们都用utf-8,很多时候可能压根用不着这个功能!如若需要的话,可以加上这个lib
CentOS6下Sphinx2.1.9编译错误undefined reference to 'libiconv'
sphinxmakefilelibiconv
CentOS6下面编译Sphinx2.1.9报错:
/root/sphinx-2.1.9-release/src/sphinx.cpp:26852: undefined reference to `libiconv_open'
/root/sphinx-2.1.9-release/src/sphinx.cpp:26870: undefined reference to `libiconv'
/root/sphinx-2.1.9-release/src/sphinx.cpp:26876: undefined reference to `libiconv_close'
原因是g++没有添加 -libiconv选项
cd sphinx-2.1.9-release
vi src/MakeFile
把LIBS = -lm -lz -lexpat -L/usr/local/lib -lrt -lpthread
改成
LIBS = -lm -lz -lexpat -L/usr/local/lib -lrt -lpthread -liconv
即可。
Making all in test
make[1]: Entering directory `/usr/local/sphinx-0.9.9/test'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/usr/local/sphinx-0.9.9/test'
make[1]: Entering directory `/usr/local/sphinx-0.9.9'
make[1]: Nothing to be done for `all-am'.
make[1]: Leaving directory `/usr/local/sphinx-0.9.9'
解决: 编辑:
./src/MakeFile文件
将
LIBS = -lm -lexpat -L/usr/local/lib
改成
LIBS = -lm -lexpat -liconv -L/usr/local/lib
然后又有问题:lm -lz -lexpat -liconv -L/usr/local/lib
/usr/bin/ld: cannot find -liconv
collect2: ld returned 1 exit status
make[1]: *** [indexer] Error 1
make[1]: Leaving directory `/usr/local/sphinx-0.9.9/src'
make: *** [all] Error 2
解决:没有安装这个库,需要自己下载后安装。