sphinx简介以及linux环境下安装

时间:2022-02-21 07:19:31

Sphinx的学习

.sphinx的简介

1sphinx简介

    Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检索引擎。意图为其他应用提供高速、低空间占用、高结果 相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。当前系统内置MySQLPostgreSQL 数据库数据源的支持,也支持从标准输入读取特定格式 XML数据。

    Sphinx是一个基于SQL全文检索引擎,可以结合MySQL,PostgreSQL全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件

Sphinx单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引只需 34分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。

Sphinx的主要特性包括:

高速索引 (在新款CPU上,近10 MB/秒)高速搜索 (2-4G的文本量中平均查询速度不到0.1); 高可用性 (单CPU上最大可支持100 GB的文本,100M文档)提供良好的相关性排名 支持分布式搜索; 提供文档摘要生成; 提供从MySQL内部的插件式存储引擎上搜索 支持布尔,短语, 和近义词查询; 支持每个文档多个全文检索域(默认最大32个); 支持每个文档多属性; 支持断词; 支持单字节编码与UTF-8编码;

2 sphinxlucene的比较

lucene是什么:lucene是用java开发的一个支持全文检索的jar包。

1Sphinx建索引速度非常的快;Lucene建索引相比Sphinx要差很多。

同样建1000w数据,Sphinx2分钟以内,Lucene10分钟多。

2Sphinx的结构必须提前预定义好;Lucene的索引结构是比较*的。这点上个人觉得Lucene要比Sphinx好一些。

3Sphinx查询中Attribute(属性)的概念,而且Sphinx在启动Searchd的时候会将所有属性加载到内存中;而Lucene则没有,虽然Lucene也有NumericField,但是底层仍然是作为String处理的。

这点上会导致Sphinx会比Lucene查询性能上快许多。

4Sphinx是用C++开发的;Lucene最初是用Java开发的,目前已经有python版本和C版本的,以及.net版本的

.sphinx的安装

1.下载

可以到官网下载到最新的版本2.2.3

http://sphinxsearch.com/downloads/release/

2所需环境

官方推荐是在linux上进行生产,但是我们可以在windows上做实验。

3安装

Sphinxmysql上的应用有两种方式:

1.    采用API调用,如使用PHPjava等的API函数或方法查询。优点是可不必对mysql重新编译,服务端进程“低耦合”,且程序可灵活、方便的调用;缺点是如已有搜索程序的条件下,需修改部分程序。推荐程序员使用。

2   使用插件方式(sphinxSE)把sphinx编译成一个mysql插件并使用特定的sql语句进行检索。其特点是,在sql端方便组合,且能直接返回数据给客户端。不必二次查询,在程序上仅需要修改对应的sql,但这对使用框架开发的程序很不方便,比如使用了ORM。另外还需要对mysql进行重新编译,且需要mysql-5.1以上版本支持插件存储。

我上周使用的是第一种方式,版本为Sphinx-for-chinesemysql5.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过程中遇到的问题

刚开始安装的是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 -/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

sphinx简介以及linux环境下安装

make这一步报错。

2.索引的名字问题

goods做索引的名字是会自动生成goods.new开头的索引文件,但是在客户端指定搜索goods时又不到。

解决办法:更改了goodsmerchandise后生成索引正常。后来百度也没查到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的问题。

  查了半天,改Makefileconfigure都不可靠。最后在官站上查到:

  ./configure without-iconv,就好了。那干嘛还要这个iconv嘛。

  看出错代码里,是在xmlunknowencode时才用到。我们都用utf-8,很多时候可能压根用不着这个功能!如若需要的话,可以加上这个lib

CentOS6Sphinx2.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

解决:没有安装这个库,需要自己下载后安装。