Sphinx与Coreseek中文分词技术详解:提升全文检索效率
大家好,我们又见面了,我是全战君。

Sphinx + Coreseek实现中文分词 1.全文检索 1.1 全文检索与数据库
全文检索是对数据库的有力补充,但全文检索不能取代数据库在应用系统中的作用。当应用系统的数据主要是大量文本信息时,利用全文检索技术可以大大提升应用系统的价值。
全文检索和数据库检索各有优势,需要根据具体应用场景灵活选择。
1.2 中文搜索与中文搜索
全文检索一般都支持中文分词。有些人常常认为现有的不支持中文分词的全文检索软件可以通过添加中文分词模块来使用。这个观点本身是正确的,但能用并不代表就能用得好。
国内有大量网站采用Lucene+中文分词作为解决方案,但搜索结果并不乐观。
中文全文检索绝不是简单地在国外全文检索软件包(中文全文检索)中添加中文分词模块。与中文全文搜索相比,中文全文搜索引擎主要有以下优点:
1.3 自建全文搜索与使用Google等第三方网站提供的现场全文搜索的区别
对现场设备有要求。搭建自建全文搜索往往需要站长拥有至少一台独立主机。但使用第三方提供的全文检索对场地要求不高,虚拟主机就足够了。然而,需要全文搜索的网站通常已经有了全文搜索。我自己的独立主持人。
由于搜索服务托管在第三方,因此索引更新更加及时。它往往只是按照一定的规则定期更新索引数据库(往往索引每隔几个小时甚至几天才更新一次)。您网站上的新内容通常无法及时搜索到。使用自建全文搜索可以确保您网站上的新内容可以“立即”被检索到。
更适合您的网站。由于中文分词的特点,不存在可以适用于所有网站的通用词汇。为了获得优秀的搜索结果,您需要定制适合您网站的词汇表;使用第三方搜索服务。您无法修改第三方供应商的词典。但是使用自建全文检索就不存在这个问题。
更有利于你网站的数据整合。有些网站不仅是论坛,还常常包括内容管理(CMS)、购物中心和其他应用程序。然而,使用数据库搜索往往需要用户在各个系统中搜索来查找内容;第三方搜索无法区分系统。自建的全文搜索可以有效区分不同数据源的不同数据,真正实现一次搜索所需的一切,从而提高您的网站访问体验。添加您网站的点击率。
避免让您的访问者感到尴尬 第三方搜索结果页面超出您的控制范围,并且可能会推荐可能使您网站的访问者感到尴尬的搜索短语。
然而使用自建全文检索则完全不存在这个问题。
2. 狮身人面像
Sphinx是一个基于SQL的高性能全文搜索引擎。 Sphinx的性能在众多全文搜索引擎中也是名列前茅的,使用Sphinx。我们可以实现比数据库本身更专业的搜索功能,并且可以有很多有针对性的性能优化。
狮身人面像的特点:
2.Coreseek简介###
Sphinx全文搜索引擎对英语和其他拉丁语言有很好的支持,但对中文和其他语言的支持较差。
Coreseek是一款中文全文检索/搜索软件。它开源并在GPLv2许可协议下发布,基于Sphinx开发并独立发布。专门从事中文搜索和信息处理。适用于行业/垂直搜索、论坛/站点搜索、数据库搜索、文档/文献检索、信息检索、数据挖掘等应用场景。用户可以免费下载并使用。它还具有全面的中文手册,方便部署和使用。
3.Coreseek安装与使用
本章概述了 Coreseek 安装说明。详细环境和详细说明请参见Coreseek官方中文手册:
下面使用MySQL数据源进行说明。
步骤1:安装coreseek。请参考:BSD、Linux、Windows系统安装及测试说明。
安装完成后,请确保安装测试文档中的所有测试都能通过,以便 coreseek 准备就绪。竭诚为您服务!
步骤2:在BSD/Linux安装包的testpack/etc文件夹中配置demo配置文件;
demo配置文件也放在Windows安装包的etc文件夹中;
如果是mysql数据库,可以复制csft_mysql.conf作为自己的配置文件,然后进行更改。其他数据库可以参考python数据源。
查看配置的详细信息,可以访问Coreseek/Sphinx(0.9)中文手册了解详情和详细配置参数。
配置文件的核心。配置source和index,成对出现;如果需要为多种情况或多张数据表设置索引,可以为每种情况编写相应的源和索引配置;
来源表示原始数据的来源。也就是数据源。 Index表示获取数据后如何索引;
在源配置中,请确保可以使用给定的数据库服务器地址、用户和密码连接到相应的数据库,并运行获取数据的SQL语句来获取数据。否则coreseek无法获取数据。将无法再提供服务。
一般情况下,sql_query给出的是读取数据的SQL语句。第一列是自增ID字段,然后它可以包含字符串字段和整数数字字段。稍后需要使用 sql_attr_uint 明确标记整数值字段。如果有多个字段,则分别标记即可。
在索引配置中,需要注意更改path参数,保证不与其他搜索服务冲突。在最终的搜索配置中。还要更改相应的路径参数和端口参数,防止冲突;
第三步:测试
一、索引:使用bin文件夹下的索引器,运行:indexer -c 配置文件的路径索引名。
代码语言:javascript
复制
# /usr/local/coreseek/bin/indexer -c etc/csft.conf --all ##--all表示所有索引
##Windows下面为bin\indexer -c etc\csft.conf --all
##下面为正常索引所有数据时的提示信息:部分数据信息依据实际数据情况变化
Coreseek Fulltext 3.2 [ Sphinx 0.9.9-release (r2117)]
Copyright (c) 2007-2010,
Beijing Choice Software Technologies Inc (http://www.coreseek.com)
using config file 'etc/csft.conf'...
indexing index '索引名称'...
collected 3 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 3 docs, 7585 bytes
total 0.075 sec, 101043 bytes/sec, 39.96 docs/sec
total 2 reads, 0.000 sec, 5.6 kb/call avg, 0.0 msec/call avg
total 7 writes, 0.000 sec, 3.9 kb/call avg, 0.0 msec/call avg
如果出现上面相应的提示。说明配置正确,索引可以正常索引。
然后,开始搜索:使用bin文件夹中的searchd。运行:searchd -c 配置文件路径 –console
代码语言:javascript
复制
# /usr/local/coreseek/bin/searchd -c etc/csft.conf --console
##Windows下面为bin\searchd -c etc\csft.conf --console
##下面为正常开启搜索服务时的提示信息:当中的port能够在配置文件里改动
Coreseek Fulltext 3.2 [ Sphinx 0.9.9-release (r2117)]
Copyright (c) 2007-2010,
Beijing Choice Software Technologies Inc (http://www.coreseek.com)
using config file 'etc/csft.conf'...
listening on all interfaces, port=9312
要继续测试搜索功能,请不要停止 searchd。否则其他程序将无法连接到搜索服务器
在BSD/Linux环境下,测试成功后:
如果要在后台运行该服务,请使用:searchd -c 配置文件的路径。将 searchd 作为后台服务运行;
如果想停止后台服务,使用:searchd -c 配置文件路径 –stop;
假设要更新后台服务的索引,使用:indexer -c 配置文件路径索引名
如果您想将搜索结果应用到自己的程序中,请使用api文件夹下对应的api接口测试。
PHP接口的测试示例如下:
代码语言:javascript
复制
//注意文件的编码格式须要保存为为UTF-8格式
require ( "sphinxapi.php" );
$cl = new SphinxClient ();
$cl->SetServer ( '127.0.0.1', 9312);
//下面设置用于返回数组形式的结果
$cl->SetArrayResult ( true );
/*
//ID的过滤
$cl->SetIDRange(3,4);
//sql_attr_uint等类型的属性字段,须要使用setFilter过滤,相似SQL的WHERE group_id=2
$cl->setFilter('group_id',array(2));
//sql_attr_uint等类型的属性字段,也能够设置过滤范围,相似SQL的WHERE group_id2>=6 AND group_id2<=8
$cl->SetFilterRange('group_id2',6,8);
*/
//取从头開始的前20条数据,0,20相似SQl语句的LIMIT 0,20
$cl->SetLimits(0,20);
//在做索引时,没有进行 sql_attr_类型 设置的字段,能够作为“搜索字符串”,进行全文搜索
$res = $cl->Query ( '搜索字符串', "*" ); //"*"表示在所有索引里面同一时候搜索。"索引名称(比如test或者test,test2)"则表示搜索指定的
//假设须要搜索指定全文字段的内容,能够使用扩展匹配模式:
//$cl->SetMatchMode(SPH_MATCH_EXTENDED);
//$res=cl->Query( '@title (測试)' , "*");
//$res=cl->Query( '@title (測试) @content ('网络')' , "*");
echo '';
print_r($res['matches']);
print_r($res);
print_r($cl->GetLastError());
print_r($cl->GetLastWarning());
echo '
';
搜索结果演示示例:
代码语言:javascript
复制
Array
(
[error] => 【本次查询的错误信息】
[warning] =>
[status] => 0
[fields] => Array
(
[0] => title
[1] => content
)
[attrs] => Array
(
[published] => 2
[author_id] => 1
[a] => 1
)
[matches] => Array 【匹配到的文档信息】
(
[0] => Array
(
[id] => 3 【文档的ID】
[weight] => 1680
[attrs] => Array
(
[published] => 1270094460
[author_id] => 2
[a] => 0
)
)
)
[total] => 1 【本次查询返回的结果数目。比如翻页等使用】
[total_found] => 1 【整个系统包含的结果数目】
[time] => 0.136 【查询使用的时间】
[words] => Array 【分词结果】
(
[server] => Array
(
[docs] => 1 【该词汇匹配到的文档数目】
[hits] => 1 【该词汇出现的次数】
)
)
)