您的位置:首页 > 其它

windows下使用sphinx全文检索

2017-09-20 16:47 309 查看


Sphinx的特性
 高速的建立索引(在当代CPU上,峰值性能可达到10 MB/秒);
 高性能的搜索(在2 – 4GB 的文本数据上,平均每次检索响应时间小于0.1秒);
 可处理海量数据(目前已知可以处理超过100 GB的文本数据, 在单一CPU的系统上可处理100 M 文档);
 提供了优秀的相关度算法,基于短语相似度和统计(BM25)的复合Ranking方法; 支持分布式搜索;
 provides document exceprts generation;
 可作为MySQL的存储引擎提供搜索服务;
 支持布尔、短语、词语相似度等多种检索模式;
 文档支持多个全文检索字段(最大不超过32个);
 文档支持多个额外的属性信息(例如:分组信息,时间戳等);
 停止词查询;
 支持单一字节编码和UTF-8编码;
 原生的MySQL支持(同时支持MyISAM 和InnoDB );
原生的PostgreSQL 支持.

安装Sphinx全文检索服务器

Sphinx默认不支持中文索引及检索, 以前用Coreseek的补丁来解决,目前Coreseek
不单独提供补丁文件,而基于sphinx开发了Coreseek
全文检索服务器,Coreseek应该是现在用的最多的sphinx中文全文检索,它提供了为Sphinx设计的中文分词包LibMMSeg包含mmseg中文分词,其实coreseek-3.2.14.tar.gz中已经包含了sphinx,前面安装SphinxSE时也可以使用这个压缩包里的mysqlse。

我们来看一下的安装过程:

安装autoconf

Bzip2 –d autoconf-2.65.tar.bz2

tar xvf autoconf-2.65.tar

cd autoconf-2.65

./configure --prefix=/usr

make

make install

cd ..

安装Coreseek

tar zxvf coreseek-3.2.14.tar.gz

cd coreseek-3.2.14

cd mmseg-3.2.14/

./bootstrap

./configure --prefix=/usr/local/mmseg3

make

make install

cd ../csft-3.2.14/

sh buildconf.sh

./configure --prefix=/usr/local/coreseek --without-python --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql=/usr/local/webserver/mysql --host=arm

make

make install

ln -s /usr/local/webserver/mysql/lib/mysql/libmysqlclient.so.16 /usr/lib

cd /usr/local/coreseek/etc

进入配置目录通过命令ls可以看到3个文件

example.sql  sphinx.conf.dist  sphinx-min.conf.dist

其中example.sql是示例sql脚本我们将其导入到数据库中的test数据库中作为测试数据(会创建两张表 documents和tags)

vi sphinx.conf

输入以下内容

# 定义一个数据库源,名字为src1

source src1

{

type = mysql

sql_host = localhost

sql_user = root

sql_pass =

sql_db     = test

sql_port = 3306 # optional, default is 3306

sql_sock                              = /tmp/mysql.sock

sql_query_pre           = SET NAMES utf8

sql_query = \

SELECT id,title,content FROM songs

sql_query_info = SELECT * FROM songs WHERE id=$id

}

 

# 定义建立索引项

index test1

{

source = src1

path = /usr/local/coreseek/var/data/test1

    charset_type = zh_cn.utf-8

charset_dictpath = /usr/local/mmseg3/etc/

}

 

# 建索引程序的设置

indexer

{

    # 建索引时所用的内存限制

mem_limit = 32M

}

 

# 提供服务的进程配置

searchd

{

port = 9312

log = /usr/local/coreseek/var/log/searchd.log

query_log = /usr/local/coreseek/var/log/query.log

read_timeout = 5

max_children = 30

pid_file = /usr/local/coreseek/var/log/searchd.pid

max_matches = 1000

seamless_rotate = 1

preopen_indexes = 0

unlink_old = 1

}

说明:

代码段source src1{***} 代表数据源里面主要包含了数据库的配置信息,src1表示数据源名字,可以随便写。

代码段index test1{***} 代表为哪个数据源创建索引,与source *** 是成对出现的,其中的source参数的值必须是某一个数据源的名字。

其他参数可以查看手册,这里不再赘述。

生成索引

/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf --all

其中参数--all表示生成所有索引

当然也可以是索引的名字例如:/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf test1

执行后可以在/usr/local/coreseek/var/data目录中看到多出一些文件,是以索引名为文件名的不同的扩展名的文件

在不启动sphinx的情况下即可测试命令:

  /usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/sphinx.conf number

们可以通过搜索API调用来执行搜索,搜索API支持PHP、Python、Perl、Rudy和Java。如果从PHP
4000
脚本检索需要先启动守护进程searchd,PHP脚本需要连接到searchd上进行检索:

/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/sphinx.conf

在解压后的sphinx-0.9.9/api目录下的sphinxapi.php就是sphinx官方为我们提供的API文件(其实也可以使用PHP的sphinx扩展),只需将其包含进自己的PHP脚本文件就可以了。

示例代码:

<?php

include('sphinxapi.php');

 

  $cl =
new SphinxClient();

  //设置sphinx服务器地址与端口,如果是本机则可以为localhost

  $cl->SetServer(
"192.168.16.6",
9312 );

  //以下设置用于返回数组形式的结果

 $cl->SetArrayResult (
true );

 //$cl->SetMatchMode( SPH_MATCH_ANY  );//匹配模式

 //$cl->SetFilter( 'group_id', array( 2 ) );

 

  $result
= $cl->Query(
'研究生创业',
'test1' );  //参数 关键字  索引名

 

  if (
$result ===
false ) {

      echo
"Query failed: " .
$cl->GetLastError() .
".\n";

  }

  else {

      if (
$cl->GetLastWarning() ) {

          echo
"WARNING: " .
$cl->GetLastWarning() .
"";

      }

   

          echo
'<pre>';

          print_r( $result
);

  }

 ?>

执行后的结果:

Array

(

    [error] =>

    [warning] =>

    [status] => 0

    [fields] => Array

        (

            [0] => title

            [1] => content

        )

 

    [attrs] => Array

        (

            [group_id] => 1

            [date_added] => 2

        )

 

    [matches] => Array

        (

            [5] => Array

                (

                    [weight] => 2

                    [attrs] => Array

                        (

                            [group_id] => 2

                            [date_added] => 1296491832

                        )

 

                )

 

        )

 

    [total] => 1

    [total_found] => 1

    [time] => 0.078

    [words] => Array

        (

            [研究生] => Array

                (

                    [docs] => 1

                    [hits] => 2

                )

 

            [创业] => Array

                (

                    [docs] => 2

                    [hits] => 2

                )

 

        )

 

)

 

在matches中的就是查询结果,我们注意到sphinx是将记录中的主键ID值返回而不是返回所有数据,上面的例子中的键名5就是记录的ID(如果在查询前执行$cl->SetArrayResult ( true );则数组结构会有些许差异)。至此搜索服务器已经为我们完成了大部分工作,接下来我们通过主键ID值来查询我们想要的数据就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息