标签归档:全文检索

迫不及待发布 xunsearch-1.4.6 正式稳定版

这一周多以来,努力的调试和测试,终于消除了迄今发现的所有异常退出、死锁、内存泄露等BUG,因此迫不及待地在今天发布 xunsearch-1.4.6 正式稳定版,以便让大家立即享受最畅快稳定的 xunsearch 搜索。

最近版本发布有点快,带来不便甚感抱歉,但这次真的是稳定下来了。在此强烈强烈地建议所有用户升级到这个最新稳定版!!

Xunsearch 是免费开源的专业全文检索解决方案,旨在帮助一般开发者针对既有的海量数据,快速而方便地建立自己的全文搜索引擎。全文检索可以帮助您降低服务器搜索负荷、极大程度的提高​​搜索速度和用户体验。

官方网站:http://www.xunsearch.com

Snip20130321_2

xunsearch-1.4.3 中文搜索,大幅提升扛压能力

非常开心能在今天发布 xunsearch-1.4.3 正式稳定版,这是一个 bugfix 版本。

上个版本很大程度解决了死锁问题,但用户陆续反应仍然会出现进程假死的问题。在多名网友用户的热心配合和反馈下和我们的不断努力下,做了多项改进和调整,加强了多线程下的锁机制。经过高强度的多次压力测试,不再出现任何死锁的情况。

强列建议所有的 xunsearch 用户升级使用这个最新的稳定版本!!!

主要更新如下:

1. 加强 scws_fork 在多线程下的锁机制
2. 再度完善搜索线程池大压力下的死锁问题(感谢几位热心用户的配合反馈)
3. 美化 util.SearchSkel 生成的搜索骨架效果(采用 bootstrap)
4. 加入 Yii 扩展的包装代码,位于 sdk/php/wrapper/yii-ext/

官方网站:http://www.xunsearch.com
下载地址:http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2
代码仓库:https://github.com/hightman/xunsearch
修改日志:https://github.com/hightman/xunsearch/commits/1.4.3
CHM手册:http://www.xunsearch.com/download/xs_php_manual.chm

Xunsearch 是免费开源的专业全文检索解决方案,旨在帮助一般开发者针对既有的海量数据,快速而方便地建立自己的全文搜索引擎。全文检索可以帮助您降低服务器搜索负荷、极大程度的提高搜索速度和用户体验。

高性能:后端是采用 C/C++ 开发多线程服务端,索引设计基于 Xapian 和 scws 中文分词。单库最多支持 40 亿条数据,在 5 亿网页大约 1.5TB 的数据中检索时间不超过 1 秒(非缓存)。

简单易用:前端是使用脚本语言编写的开发工具 (SDK),目前仅支持 PHP 语言。API 简单清晰,开发难度极低,提供全中文的示例代码、文档、辅助脚本工具等。

全功能:除支持基础的自定义分词、字段检索、布尔搜索外,还直接支持用户急需的相关搜索、拼音搜索、搜索建议等专业功能。

DEMO 截图:

 

xunsearch-1.0.0 正式版 (基于xapian/scws/php的开源中文全文搜索引擎)

经过 2 周如火如荼的测试和修正,很高兴如期发布 xunsearch-1.0.0 正式稳定版,这也是 xunsearch 的第一个正式版本。

Xunsearch 是免费开源的专业全文检索解决方案,旨在帮助一般开发者针对既有的海量数据,快速而方便地建立自己的全文搜索引擎。全文检索可以帮助您降低服务器搜索负荷、极大程度的提高搜索速度和用户体验。

高性能:后端是采用 C/C++ 开发多线程服务端,索引设计基于 Xapian 和 scws 中文分词。单库最多支持 40 亿条数据,在 5 亿网页大约 1.5TB 的数据中检索时间不超过 1 秒(非缓存)。

简单易用:前端是使用脚本语言编写的开发工具 (SDK),目前仅支持 PHP 语言。API 简单清晰,开发难度极低,提供全中文的示例代码、文档、辅助脚本工具等。

全功能:除支持基础的自定义分词、字段检索、布尔搜索外,还直接支持用户急需的相关搜索、拼音搜索、搜索建议等专业功能。

官方网站:http://www.xunsearch.com/
下载地址:http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2
代码仓库:https://github.com/hightman/xunsearch
修改日志:https://github.com/hightman/xunsearch/commits/1.0.0

[2009献礼] 发布MySQL-5.1.30的scws-1.x分词插件(090611最新修订)

** MySQL-5.1.30 中文分词插件 **

@Author: hightman
@Website: http://www.hightman.cn
@download: http://www.hightman.cn/down/myft-5.1.30-090611.tgz
注意: 20090611 最新修订, 修正停止服务器时, 释放停用词列表内存指针错误的bug.

[ 基本说明 ]

这是以 mysql-5.1.30 为环境开发制作的 mysql 全文检索分词插件。原则上应该适用整个 5.1.x 系列。

mysql 内置的全文检索仅支持 myisam 类型的表,默认的不支持中文分词。本插件依托 scws-1.0.1 分词系统,

scws 是由我开发的免费开源的中文分词系统,纯 C 开发的函数库。安装本插件必须先安装 scws-1.x。

安装本插件后,系统会注册一个名为 scws_parser 的分词器,可以在 mysql 中直接使用它,对于小型全文检索
需求,十分方便。

MyFT 系列之前曾发过布 5.1.11 和 4.0.27 的版本,旧版是简单的分词算法并不理想,建议改为本版。

[ 安装 & 测试]

1. 首先确定您在您的服务器上以源码方式安装了 mysql 5.1.x/ ,
假设您的 mysql-5.1.x 安装在 $prefix 目录 (通常为 /usr/local/mysql5)

务必是源码方式,里头一些自定义函数功能还需要对代码打补丁。

2. 接下来您必须先安装 scws-1.0.x 系统,相关的安装说明及下载文件请访问:
http://www.xunsearch.com/scws 假设安装在 $scws_dir 目录(建议为 /usr/local/scws)

注意要同步下载相应的词典档和规则集并放到 $scws_dir/etc 目录中去。
否则相应的字符集词典/规则集文件不存在的话则会自动采用默认的简易分词法。

3. 下载本插件代码:http://www.hightman.cn/down/myft-5.1.30-081231.tgz

4. 下载后将 tgz 文件复制到您安装的 mysql-5.1 的源代码所在目录里,然后解开:

tar xvzf myft-5.1.30-081231.tgz

解开后有一个 scws 目录被放到 plugin/ 目录里
还有一个 myft_scws_udf_5.1.30.patch 补丁文件及本文件 README.myft-hightman

5. 对 mysql 源码打补丁,以支持自定义函数中获取正确的字符集
在 mysql 源码目录执行 patch -p0 < myft_scws_udf_5.1.30.patch 即可

6. 打完补丁后需要重新编译并安装一下 mysql,这不需要重新 configure ,只需在该目录
执行 make ; make install 即可

7. 开始编译 scws 插件,进入到 mysql 源码目录里的 plugin/scws 目录

先配置:./configure –prefix=$prefix –with-scws=$scws_dir
其中 $prefix 为 mysql-5.1.x 的安装目录,$scws_dir 是 scws-1.x 的安装目录

配置完毕执行 make 和 make install
如果没有错误,至此已经安装完成了。

强烈建议您修改 my.cnf 在 [mysqld] 字段里加入 ft_min_word_len = 2
因为默认是 4,太长了点。

8. 这时您需要重启一下 mysql server,运行以下命令:

$prefix/share/mysql/mysql.server restart

9. 开始测试该插件,主要是全文索引的分词插件,下面以 utf8 编码进行测试。
您可以用命令行或 phpMyAdmin 之类的工具执行 SQL 命令,测试中是采用命令行。

1) 连接:mysql -u root -pxxxxx -h localhost

2) 设置字符集:SET NAMES ‘utf8′;

3) 选用测试库:USE test;

4) 安装插件(只需一次):INSTALL PLUGIN scws_parser SONAME ‘libftscws.so';

5) 建表测试(注意 with parser 指令):

CREATE TABLE `test_utf8` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(200) DEFAULT NULL,
`body` mediumtext,
PRIMARY KEY (`id`),
FULLTEXT KEY `ft_utf8` (`title`,`body`) WITH PARSER scws_parser
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `test_utf8` VALUES (1, ‘MySQL Tutorial’, ‘DBMS stands for DataBase …’);
INSERT INTO `test_utf8` VALUES (2, ‘How To Use MySQL Efficiently’, ‘After you went through a …’);
INSERT INTO `test_utf8` VALUES (3, ‘Optimising MySQL’, ‘In this tutorial we will show …’);
INSERT INTO `test_utf8` VALUES (4, ‘1001 MySQL Tricks’, ‘1. Never run mysqld as root. 2. …’);
INSERT INTO `test_utf8` VALUES (5, ‘MySQL vs. YourSQL’, ‘In the following database comparison …’);
INSERT INTO `test_utf8` VALUES (6, ‘MySQL Security’, ‘When configured properly, MySQL …’);
INSERT INTO `test_utf8` VALUES (7, ‘中国测试’, ‘这样可以吗’);
INSERT INTO `test_utf8` VALUES (8, ‘疯狂测中国测试’, ‘这样总应该可以吗’);
INSERT INTO `test_utf8` VALUES (9, ‘中国语言测试’, ‘这样又是行不行呢’);
INSERT INTO `test_utf8` VALUES (10, ‘我爱china’, ‘china是我的祖国’);

6) 测试查询:

— 第一句因为 mysql 出现的次数太多(默认超过1半)被忽略了
SELECT * FROM test_utf8 WHERE MATCH(title, body) AGAINST (‘mysql’);
SELECT * FROM test_utf8 WHERE MATCH(title, body) AGAINST (‘mysql’ IN BOOLEAN MODE);

SELECT * FROM test_utf8 WHERE MATCH(title, body) AGAINST (‘中国’);
SELECT * FROM test_utf8 WHERE MATCH(title, body) AGAINST (‘+中国 -疯狂’ IN BOOLEAN MODE);

10. 自定义函数 SCWS_SEGMENT(),将输入的字符串分词并返回以空格相连的字符串;

1) 创建函数(只需一次):CREATE FUNCTION scws_segment RETURNS STRING SONAME ‘libftscws.so';

2) 该函数接受至少一个参数,最多四个参数,依次表示:
<要分词的字符串,可为表达式> <复合分词参数 1~15(整型)> <自动将散字二字分词,1或0> <忽略标点符号,1或0>

3) 在返回结果太长(特别是开启 multi的情况下)会被裁断,以 … 结尾(不必担心!)

4) 测试:
mysql> SELECT SCWS_SEGMENT(‘我是中国人’);
+———————————+
| SCWS_SEGMENT(‘我是中国人’) |
+———————————+
| 我 是 中国人 |
+———————————+
1 row in set (0.00 sec)

mysql> SELECT SCWS_SEGMENT(title) FROM test_utf8;
+——————————-+
| SCWS_SEGMENT(title) |
+——————————-+
| MySQL Tutorial |
| How To Use MySQL Efficiently |
| Optimising MySQL |
| 1001 MySQL Tricks |
| MySQL vs . YourSQL |
| MySQL Security |
| 中国 测试 |
| 疯狂 测 中国 测试 |
| 中国 语言 测试 |
| 我爱 china |
+——————————-+
10 rows in set (0.00 sec)

11. 自定义函数 SCWS_TOPWORDS(),该函数返回字符串中的核心关键词列表;

1) 创建函数(只需一次):CREATE FUNCTION scws_topwords RETURNS STRING SONAME ‘libftscws.so';

2) 接受 1~3 个参数,分别为:<字符串> <词数(整数)> <词性包含或排除(字符串)>
词性多个之间用,分隔,以~开头则表示除这些词性以外。。。和 scws 用法一样。

3) 返回结果是由符合条件的关键词及其词性和次数组成,各词之间用空格连接
<词>/<词性>/<词数>

4) 测试:
mysql> SELECT SCWS_TOPWORDS(‘我是中国人,中国人很有志气’);
+———————————————————-+
| SCWS_TOPWORDS(‘我是中国人,中国人很有志气’) |
+———————————————————-+
| 中国人/n/2 志气/n/1 |
+———————————————————-+
1 row in set (0.00 sec)

mysql> SELECT SCWS_TOPWORDS(CONCAT(title, ‘ ‘, body)) FROM test_utf8;
+————————————————————————————————–+
| SCWS_TOPWORDS(CONCAT(title, ‘ ‘, body)) |
+————————————————————————————————–+
| DataBase/en/1 Tutorial/en/1 stands/en/1 MySQL/en/1 DBMS/en/1 for/en/1 |
| Efficiently/en/1 through/en/1 After/en/1 MySQL/en/1 went/en/1 How/en/1 Use/en/1 you/en/1 To/en/1 |
| Optimising/en/1 tutorial/en/1 MySQL/en/1 this/en/1 show/en/1 will/en/1 In/en/1 we/en/1 |
| Tricks/en/1 mysqld/en/1 MySQL/en/1 Never/en/1 1001/en/1 root/en/1 run/en/1 as/en/1 |
| comparison/en/1 following/en/1 database/en/1 YourSQL/en/1 MySQL/en/1 the/en/1 In/en/1 vs/en/1 |
| MySQL/en/2 configured/en/1 Security/en/1 properly/en/1 When/en/1 |
| 中国/ns/1 这样/r/1 测试/vn/1 可以/v/1 |
| 中国/ns/1 应该/v/1 疯狂/an/1 这样/r/1 测试/vn/1 可以/v/1 |
| 中国/ns/1 不行/a/1 语言/n/1 这样/r/1 测试/vn/1 又是/n/1 |
| china/en/2 祖国/n/1 我爱/n/1 |
+————————————————————————————————–+
10 rows in set (0.00 sec)

12. 全文检索中的停用词表,类似词典和规则集一样放在 $scws_dir/etc 中
分别为:stops.[$charset.]txt
rules.[$charset.]ini
dict.[$charset.]xdb

如果 $charset 没有指定,则默认即为 gbk
rules dict 采用 scws-1.x 的格式, stops.txt 用的是每行一个词即可,自行建立。

hightman,更多需要请访问 http://www.hightman.cn

2009 大家新年快乐!