`
cppmule
  • 浏览: 447342 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Sphinx中文分词详细安装配置及API调用实战手册

 
阅读更多

Sphinx中文分词详细安装配置及API调用实战手册

技术 2011-08-23 16:34:59 阅读:501 评论:0

  这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词。对我来说Sphinx是个全新的技术,所以花了不少时间来研究它,在网上查阅了许多资料,有些认为有参考价值的便收藏到博客中来,以便于随时再次查看。

  Sphinx for chinese和coreseek建议这两个中选择一个,暂时不要选择原版Sphinx(对中文的支持不是很好).又因为服务器所用MySQL在当时编译时并没有编译Sphinx扩展,而重新编译MySQL并加入Sphinx暂时又无法实现(项目用到了多台服务器,在不影响现有业务的情况下不可能去重新编译MySQL的),所以采用的是程序通过API来外部调用Sphinx.Sphinx自带的API有PHP,Python,Ruby,Java等众多版本,所以基本也够用了,本人使用的编程语言是PHP所以下文的条用示例采用的是PHP版的API.

一.安装及配置Sphinx及准备测试数据

1.安装前的准备工作

(1)请确认安装了MySQL,Gcc及常用的开发环境包

(2)下载sphinx-for-chinese-1.10.1及中文分词词典xdict_1.1(下面两个方式,选一个即可)

[1]到sphinx-for-chinese官方下载(强烈推荐使用这个)

cd /usr/local/src 
wget -c http://sphinx-for-chinese.googlecode.com/files/sphinx-for-chinese-1.10.1-dev-r2287.tar.gz
wget -c http://sphinx-for-chinese.googlecode.com/files/xdict_1.1.tar.gz

2.安装sphinx-for-chinese-1.10.1

cd /usr/local/src
tar zxvf sphinx-for-chinese-1.10.1-dev-r2287.tar.gz
cd sphinx-for-chinese-1.10.1-dev-r2287

#MySQL安装在默认位置的使用如下命令

./configure --prefix=/usr/local/sphinx-for-chinese-1.10.1 --with-mysql

如果出现如下图所示错误,表明MySQL不是安装在默认位置,请执行下面的命令

#如果MySQL不是安装在默认位置(特别是自己编译MySQL的,请注意),请指定MySQL的相关位置

主要是MySQL的include和lib目录(Sphinx编译的时候要用到里面的.h头文件),--with-mysql-includes及--with-mysql-libs就是为了指定这两个位置的

./configure --prefix=/usr/local/sphinx-for-chinese-1.10.1 --with-mysql-includes=/usr/local/webserver/mysql/include/mysql --with-mysql-libs=/usr/local/webserver/mysql/lib/mysql

显示如下图所示内容时,表示可以接着执行下面的make及make install命令

make 
make install

#最后执行命令

ls /usr/local/sphinx-for-chinese-1.10.1/

如果显示bin,etc和var三个目录表示安装成功

3.让Sphinx支持中文分词

cd /usr/local/src
tar zxvf xdict_1.1.tar.gz
/usr/local/sphinx-for-chinese-1.10.1/bin/mkdict xdict_1.1.txt xdict_1.1

如果提示bin/mkdict: error while loading shared libraries: libmysqlclient.so.16等错误(以下命令中的libmysqlclient.so.16.0.0的位置取决于我们mysql编译安装的位置)

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

再次执行

/usr/local/sphinx-for-chinese-1.10.1/bin/mkdict xdict_1.1.txt xdict_1.1 
#提示Chinese dictionary was successfully created!表示中文分词词典生成成功 
cp xdict_1.1 /usr/local/sphinx-for-chinese-1.10.1/etc/xdict_1.1 
4.配置Sphinx

vi /usr/local/sphinx-for-chinese-1.10.1/etc/sphinx.conf 
输入以下内容

# sphinx基本配置

# 索引源 
source goods_src 

# 数据库类型 
type = mysql

    # MySQL主机IP 
sql_host = localhost

    # MySQL用户名 
sql_user = sphinxuser

    # MySQL密码 
sql_pass = sphinxpass

    # MySQL数据库 
sql_db = sphinx

    # MySQL端口(如果防火墙有限制,请开启) 
sql_port= 3306

    # MySQL sock文件设置(默认为/tmp/mysql.sock,如果不一样,请指定) 
sql_sock = /tmp/mysql.sock

    # MySQL检索编码(数据库非utf8的很可能检索不到) 
sql_query_pre = SET NAMES UTF8

    # 获取数据的SQL语句 
sql_query = SELECT goods_id,goods_id AS goods_id_new,goods_name,goods_color,goods_name AS goods_name_search,goods_color AS goods_color_search From goods_test

    # 以下是用来过滤或条件查询的属性(以下字段显示在查询结果中,不在下面的字段就是搜索时要搜索的字段,如SQL语句中的goods_color_search,goods_name_search) 
# 无符号整型 
#goods_id为主键,如果加在这里在生成索引的时候会报attribute 'goods_id' not found,这里用goods_id_new来变通 
sql_attr_uint = goods_id_new

    # 字符串类型 
sql_attr_string = goods_name 
sql_attr_string = goods_color 
# 用于命令界面端(CLI)调用的测试(一般来说不需要) 
#sql_query_info = SELECT * FROM goods_test Where goods_id = $goods_id;

}

# 索引 
index goods 

# 索引源声明 
source = goods_src 
# 索引文件的存放位置 
path = /usr/local/sphinx-for-chinese-1.10.1/var/data/goods

    # 文件存储模式(默认为extern) 
docinfo = extern

    # 缓存数据内存锁定 
mlock = 0

    # 马氏形态学(对中文无效) 
morphology = none

    # 索引词最小长度 
min_word_len = 1

    # 数据编码(设置成utf8才能索引中文) 
charset_type = utf-8

    # 中文分词词典 
chinese_dictionary = /usr/local/sphinx-for-chinese-1.10.1/etc/xdict_1.1

    # 最小索引前缀长度 
min_prefix_len = 0

    # 最小索引中缀长度 
min_infix_len = 1

    # 对于非字母型数据的长度切割(for CJK indexing) 
ngram_len = 1

    # 对否对去除用户输入查询内容的html标签 
html_strip = 0

}

# 索引器设置 
indexer 

# 内存大小限制 默认是 32M, 最大 2047M, 推荐为 256M 到 1024M之间 
mem_limit = 256M 
}

# sphinx服务进程search的相关配置 
searchd 

# 监测端口及形式,一下几种均可,默认为本机9312端口 
# listen = 127.0.0.1 
# listen = 192.168.0.1:9312 
# listen = 9312 
# listen = /var/run/searchd.sock

    # search进程的日志路径 
log = /usr/local/sphinx-for-chinese-1.10.1/var/log/searchd.log

    # 查询日志地址 
query_log = /usr/local/sphinx-for-chinese-1.10.1/var/log/query.log

    # 读取超时时间 
read_timeout = 5

    # 请求超时市时间 
client_timeout = 300

    # searche进程的最大运行数 
max_children = 30

    # 进程ID文件 
pid_file = /usr/local/sphinx-for-chinese-1.10.1/var/log/searchd.pid

    # 最大的查询结果返回数 
max_matches = 1000

    # 是否支持无缝切换(做增量索引时需要) 
seamless_rotate = 1

    # 在启动运行时是否提前加载所有索引文件 
preopen_indexes = 0

    # 是否释放旧的索引文件 
unlink_old = 1

    # MVA跟新池大小(默认为1M) 
mva_updates_pool = 1M

    # 最大允许的网络包大小(默认8M) 
max_packet_size = 8M

    # 每个查询最大允许的过滤器数量(默认256) 
max_filters = 256

    #每个过滤器最大允许的值的个数(默认4096) 
max_filter_values = 4096

    # 每个组的最大查询数(默认为32) 
max_batch_queries = 32

}

# Sphinx配置文件结束

中文在linux下可能会看到乱码,不用管

5.创建测试数据库并添加测试内容(请先连上自己的MySQL数据库),在MySQL中执行如下命令

mysql> create database sphinx collate 'utf8_general_ci';
mysql> grant all privileges on sphinx.* to 'sphinxuser'@'' identified by 'sphinxpass';
mysql> grant all privileges on sphinx.* to 'sphinxuser'@'localhost' identified by 'sphinxpass';
mysql> use sphinx;
mysql> CREATE TABLE IF NOT EXISTS `goods_test` (
`goods_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品id',
`goods_name` varchar(255) NOT NULL COMMENT '商品名称',
`goods_color` varchar(60) NOT NULL COMMENT '商品颜色',
PRIMARY KEY (`goods_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='商品表,sphinx示例' AUTO_INCREMENT=11 ;
mysql> INSERT INTO `goods_test` (`goods_id`, `goods_name`, `goods_color`) VALUES
(1, '热卖时尚双肩背包', '黑色'),
(2, '热卖时尚电脑双肩背包', '灰色'),
(3, '缤纷炫动时尚化妆包', '黑色'),
(4, '缤纷炫动时尚化妆包', '蓝色'),
(5, '缤纷炫动时尚化妆包', '粉红'),
(6, '极致性感 女款衬衫', '黑色'),
(7, '个性宣言 男款短袖衬衫', '蓝色'),
(8, '个性宣言 男款短袖衬衫', '红色'),
(9, '个性宣言 男款短袖衬衫', '绿色'),
(10, '个性宣言 男款短袖衬衫', '黑色');

好了,万事俱备了,可以开始实战操作Sphinx了

[!--pagesplit--]实战操作Sphinx中文分词全文检索[/!--pagesplit--]

二.实战操作Sphinx中文分词全文检索

1.建立索引(如果配置文件有改动,应该重新生成索引文件,如果下面第3点中的searchd进程已经开启的话,应先关闭)

#生成goods索引[需要确保要连接的主机的MySQL数据库正常运行,并且3306端口可以访问]

/usr/local/sphinx-for-chinese-1.10.1/bin/indexer -c /usr/local/sphinx-for-chinese-1.10.1/etc/sphinx.conf goods

#如果配置文件里有多个索引,需要一次生成使用--all参数

/usr/local/sphinx-for-chinese-1.10.1/bin/indexer -c /usr/local/sphinx-for-chinese-1.10.1/etc/sphinx.conf --all

2.在linux命令行下测试搜索

/usr/local/sphinx-for-chinese-1.10.1/bin/search -c /usr/local/sphinx-for-chinese-1.10.1/etc/sphinx.conf 个性黑色

搜索结果如下图示

3.开启守护进程(供API调用,如果配置文件改动,应重新启动这个进程,不然搜到的数据不是最新)

/usr/local/sphinx-for-chinese-1.10.1/bin/searchd -c /usr/local/sphinx-for-chinese-1.10.1/etc/sphinx.conf &
#执行后记得再按回车

# 防火墙需要开放9312端口供外部访问9312端口(3306是MySQL的端口)

/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 9312 -j ACCEPT
/etc/rc.d/init.d/iptables save

[!--pagesplit--]Sphinx外部API调用PHP版[/!--pagesplit--]

三.外部API调用(PHP版)

注意使用时前提是执行了如下命令,而且防火墙也开启了9312端口

/usr/local/sphinx-for-chinese-1.10.1/bin/searchd -c /usr/local/sphinx-for-chinese-1.10.1/etc/sphinx.conf &      #执行后记得再按回车

1.把/usr/local/src/sphinx-for-chinese-1.10.1-dev-r2287/api/sphinxapi.php弄出来,和下面第2点中的search.php放在同级目录(这个只是示例,放在哪里都可以,包含的时候找到正确的sphinxapi.php的位置即可)

2.编辑search.php文件,内容如下(具体内容请读者自己定,我这里只是示例)

<?php
header('Content-Type: text/html;charset="UTF-8"');
if ($_GET) {
// 关键词
$keyword = urldecode(trim(strip_tags($_GET['keyword'])));
if ($keyword) {
// 包含Sphinx的api文件
require_once 'sphinxapi.php';
// sphinx服务器地址
$server = '192.168.128.130';
// 端口
$port   = 9312;
// 索引名 为*时表示搜索所有索引
$indexName = 'goods';
// 分页页码
$page = intval($_GET['page']) > 1 ? intval($_GET['page']) : 1;
// 每页显示的数量
$pageSize = 30;
$sphinx = new SphinxClient();
// 建立连接
$sphinx->SetServer($server, $port);
// 连接超时时间(非常必要,比如sphinx服务器挂了等异常情况) 单位为s,秒
$sphinx->SetConnectTimeout(3);
// 最大查询时间 单位为ms,毫秒
$sphinx->SetMaxQueryTime(2000);
// 按分页取结果
$sphinx->SetLimits(($page-1)*$pageSize, $pageSize); //第一个参数为offset,第二个参数为limit
// 模式
// $sphinx->SetMatchMode(SPH_MATCH_EXTENDED);
// 取到的原始数据
$orgDatas = $sphinx->Query($keyword, $indexName);
// 调试用,如果有错误的话,可以打印$errors的值
$errors = $sphinx->GetLastError();
var_dump($errors);

echo '<pre>';
var_dump($orgDatas);
/* // 下面是对结果的处理
$datas = array('goods'=>array(),'total'=>0);
if ($orgDatas['total'] > 0) {
$datas['total'] = $orgDatas['total'];
foreach ($orgDatas['matches'] AS $val) {
$val['attrs']['goods_id'] = $val['attrs']['goods_id_new'];
unset($val['attrs']['goods_id_new']);
$datas['goods'][] = $val['attrs'];
}
}
var_dump($datas);
*/
}
} else {
echo '<form method="get"><input type="type" name="keyword"><input type="submit" value="商品搜索"></form>';
}
?>

  代码可以点此处下载 http://b332.com/source/soft/sphinx-for-chinese-1.10.1/sphinxapi.tar.gz

  更多详细配置请参看/usr/local/sphinx-for-chinese-1.10.1/etc/sphinx.conf.dist文件里面有包括实时索引,增量索引等很多内容,英文原版的,很详细

分享到:
评论

相关推荐

    sphinx中文分词 xdict_1.1.tar.gz

    《Sphinx中文分词与xdict_1.1:打造高效搜索引擎》 Sphinx是一款开源全文搜索引擎,以其高效、灵活和可扩展性受到广大开发者喜爱。在处理中文文本时,分词是至关重要的一步,因为它直接影响到搜索结果的准确性和...

    sphinx 中英文分词检索介绍

    3. **中文搜索支持**:Sphinx通过内置的MMSEG等工具提供了较好的中文分词支持,而Lucene则需要额外配置中文分词器。 4. **部署简易程度**:Sphinx的部署过程相对简单,支持MySQL作为数据源,减少了代码层面的修改...

    sphinx+coreseek安装配置

    本文将详细介绍如何在Linux环境中安装和配置Sphinx和CoreSeek,以及如何通过PHP进行调用。 ### 1. Sphinx介绍 Sphinx是一款开源的实时全文搜索引擎,具有高效、灵活和高度可定制的特点。它支持多种编程语言的API,...

    搭建Sphinx+MySQL5.1x+SphinxSE+mmseg中文分词搜索引擎架构

    #### 二、Sphinx中文分词 中文分词是全文搜索中非常重要的一步,特别是对于中文这种没有明确单词分隔的语言。mmseg是一种常用的中文分词工具,它能够有效地处理中文文本,帮助Sphinx更好地理解并索引中文内容。 ##...

    sphinx社区全文搜索平台配置手册.docx

    4. **安装 CSFT**:下载并编译 CSFT,将其配置与Sphinx 集成,以实现中文分词。 5. **解决编译错误**: - 如果遇到找不到 mysql 路径的问题,需要设置 `MYSQL_HOME` 环境变量指向 MySQL 的安装路径。 - 如果找不到...

    sphinx+xdict+安装说明.zip

    6. **创建索引**:使用Sphinx的`indexer`工具对数据源进行索引,此时会调用XDict进行中文分词。 7. **启动搜索服务**:运行Sphinx的`searchd`服务,以提供实时的全文检索功能。 8. **测试搜索**:编写一个简单的...

    sphinx+mysql 安装手册

    本手册将详细讲解如何在生产环境中安装和配置Sphinx以及与MySQL的集成。 ### 一、Sphinx简介 Sphinx提供实时索引、低延迟查询、布尔运算、短语搜索以及同义词支持等功能,适合于大数据量的搜索引擎应用。其主要...

    Sphinx-完整中文手册

    Sphinx是一款强大的开源全文检索引擎,而Coreseek是基于Sphinx的免费开源中文全文检索引擎。...而提供的中文手册则为中文用户提供了一本详尽的指导手册,无论是在安装、配置还是开发集成方面,都能提供帮助。

    sphinx中文语音训练手册

    将本文档所在的文件夹解压或拷贝到d:\,即本文档路径是d:\sphinxtrain\Sphinx中文训练教程.txt 1)点击安装ActivePerl-5.16.3.1603-MSWin32-x86-296746.msi和ActivePython-2.7.2.5-win32-x86.msi; 2)解压Sphinx中除...

    sphinx社区全文搜索平台配置手册.pdf

    【Sphinx社区全文搜索平台配置手册】 Sphinx是一款源自俄罗斯的高性能开源全文搜索引擎,它以其高效、快速的索引能力和出色的查询性能而受到广泛应用。在处理像Discuz!这样的大型论坛系统时,MySQL的LIKE %关键词%...

    CoreSeek/Sphinx中文手册

    Sphinx的安装过程涉及多个方面,包括选择支持的操作系统、安装必要的工具、配置环境变量、以及如何在不同的操作系统(如Linux、BSD、Windows)上安装。安装过程中可能会遇到一些问题,文档中也提供了一些已知问题的...

    sphinx 安装及使用

    ### Sphinx 安装及使用详解 #### 一、Sphinx简介 Sphinx是一款高性能的全文搜索引擎,主要用于提高大型数据集的搜索效率。它能够独立运行,也可以作为应用程序的一部分嵌入到其他软件中。Sphinx主要适用于对性能...

    sphinx 的安装及使用 windws centos coreseek

    总之,Sphinx是一个强大的全文搜索引擎,其安装和配置涉及到多个步骤,包括选择合适的分词器(对于中文数据至关重要),设置数据源,创建和维护索引,以及开发搜索接口。在Windows和Linux环境下,这些过程可能会有所...

    Sphinx 在 windows 下安装使用.docx

    【Sphinx 在 Windows 下安装使用】的文档主要涵盖了在Windows操作系统上安装和配置Sphinx全文检索引擎的过程。Sphinx是一个高性能、开源的全文搜索引擎,它提供了多种编程语言的API,如PHP、Python、Perl和Ruby,...

    sphinx在linux的安装和使用方法

    ### Sphinx在Linux下的安装与使用方法 #### 一、Sphinx简介 Sphinx是一款开源的全文检索引擎,它可以提供快速的、高效率的全文搜索功能。Sphinx支持多种数据库(如MySQL、PostgreSQL等)以及文件系统等多种数据源...

    sphinx开源的搜索引擎的PHP模块扩展包(linux) sphinx.1.1.0版本

    因为sphinx只支持英文和俄文(即只能进行英文分词和俄文分词),所以如果要使用sphinx做中文搜索的话,再引入一个中文词库,可以在我的文章里搜索 基于sphinx的开源搜索引擎coreseek的安装。

    Sphinx中文参考手册.rar

    2.3. 安装 Sphinx 2.4. 已知的问题和解决方法 2.5. Sphinx 快速入门教程 3. 建立索引 3.1. 数据源 3.2. 属性 3.3. 多值属性 ( MVA : multi-valued attributes) 3.4. 索引 3.5. 数据源的限制 3.6. 字符集 ,...

    window 下sphinx 2.2.11安装 及coreseek3.1 安装包及安装说明 ,简单php调试

    - 修改`sphinx.conf`,添加CoreSeek的特定配置,如字符集、词典等,以支持中文全文检索。 3. **创建全文索引**: - 使用Sphinx提供的`indexer`工具,根据`sphinx.conf`中的定义,对数据源进行索引。这通常涉及...

Global site tag (gtag.js) - Google Analytics