1、什么是xunsearch?它是用来做什么的?
Xunsearch 是免费开源的专业全文检索解决方案,简单易用而且 功能强大、性能卓越能轻松处理海量数据的全文检索。它包含后端索引、搜索服务程序和前端 脚本语言编写的开发工具包(称之为 SDK),旨在帮助一般开发者针对既有的海量数据,快速而方便地建立自己的全文搜索引擎。全文检索可以帮助您降低服务器搜索负荷、极大程度的提高搜索速度和用户体验。
并且最新版本 1.4.11 已支持通过 composer 管理 PHP-SDK,并加入 yii2 扩展支持。
官方文档:http://www.xunsearch.com/doc/php
2、xunsearch有什么特点?
高性能:后端是采用 C/C++ 开发多线程服务端,索引设计基于 Xapian 和 scws 中文分词。单库最多支持 40 亿条数据,在 5 亿网页大约 1.5TB 的数据中检索时间不超过 1 秒(非缓存)。
简单易用:前端是使用脚本语言编写的开发工具 (SDK),目前仅支持 PHP 语言。API 简单清晰,开发难度极低,提供全中文的示例代码、文档、辅助脚本工具等。
全功能:除支持基础的自定义分词、字段检索、布尔搜索外,还直接支持用户急需的相关搜索、拼音搜索、搜索建议等专业功能。
3、适合哪些应用领域?
适合具备独立服务器(需要Unix 类操作系统)的初、中型规模的网站,作为完整全文检索技术 解决方案。
支持 MySQL 数据库全文检索、Web站内/论坛搜索、行业门户/垂直搜索、企业级的站内搜索、 计算机文件搜索等,各种专业搜索引擎(如购物搜索,旅游搜索、游戏搜索)、文档/文献检索 等各种领域。
4、安装服务端
Xunsearch PHP-SDK 是与 xunsearch 后端服务协同工作的,所以后先必须先在您的服务器 上安装服务端,服务器操作系统要求必须是 Linux、BSD 或其它类 UNIX 系统,同时安装了 gcc、make 等基础编译环境。
注意:即便您之前已经安装过 xunsearch,您也可以安装放心的使用该教程进行覆盖安装,会自动 完成升级操作,而不用担心会删除任何已存在的数据。我们制作的安装脚本包含了智能检测功能。 并且 xunsearch 的安装和运行都不需要 root 权限,强烈推荐单独设置一个系统用户用于安装 执行相关指令。
1)、运行下面指令下载、解压安装包
[root@localhost src]# wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2
[root@localhost src]# tar -xjf xunsearch-full-latest.tar.bz2
2、执行安装脚本,根据提示进行操作,主要是输入 xunsearch 软件包的安装目录,强烈建议单独 规划一个目录,而不是混到别的软件目录中
[root@localhost src]# cd xunsearch-full-1.4.11/
[root@localhost xunsearch-full-1.4.11]# sh setup.sh
+==========================================+
| Welcome to setup xunsearch(full) |
| 欢迎使用 xunsearch (完整版) 安装程序 |
+------------------------------------------+
| Follow the on-screen instructions please |
| 请按照屏幕上的提示操作以完成安装 |
+==========================================+
Please specify the installation directory
请指定安装目录 (默认为中括号内的值)
[/usr/local/xunsearch]:
Confirm the installation directory
请确认安装目录:/usr/local/xunsearch [Y/n]y
Checking scws ... no
Installing scws (1.2.3) ...
Extracting scws package ...
Configuring scws ...
Compiling & installing scws ...
Checking scws dict ... no
Extracting scws dict file ...
Checking libuuid ... no, try to install it
Extracting libuuid package ...
Configuring libuuid ...
Compiling & installing libuuid ...
Checking xapian-core-scws ... no
Installing xapian-core-scws (1.2.22) ...
Extracting xapian-core-scws package ...
Configuring xapian-core-scws ...
Compiling & installing xapian-core-scws ...
Checking libevent ... no
Installing libevent (2.0.21-stable) ...
Extracting libevent package ...
Configuring libevent ...
Compiling & installing libevent ...
Extracting xunsearch package (1.4.11) ...
Configuring xunsearch ...
Compiling & installing xunsearch ...
Cleaning ... done
+=================================================+
| Installation completed successfully, Thanks you |
| 安装成功,感谢选择和使用 xunsearch |
+-------------------------------------------------+
| 说明和注意事项: |
| 1. 开启/重新开启 xunsearch 服务程序,命令如下: |
| /usr/local/xunsearch/bin/xs-ctl.sh restart
| 强烈建议将此命令写入服务器开机脚本中 |
| |
| 2. 所有的索引数据将被保存在下面这个目录中: |
| /usr/local/xunsearch/data
| 如需要转移到其它目录,请使用软链接。 |
| |
| 3. 您现在就可以在我们提供的开发包(SDK)基础上 |
| 开发您自己的搜索了。 |
| 目前只支持 PHP 语言,参见下面文档: |
| /usr/local/xunsearch/sdk/php/README
+=================================================+
注意:第一次安装的话,过程可能会稍显漫长,请不必着急,您大可泡杯茶一边喝一边等待即可。
3)、待命令运行结束后,如果没有出错中断,则表示顺利安装完成,然后就可以启动/重新启动 xunsearch 的后台服务,下面命令中的 $prefix 请务必替换为您的安装目录,而不是照抄。
[root@localhost xunsearch-full-1.4.11]#cd /usr/local/xunsearch;
[root@localhost xunsearch]# bin/xs-ctl.sh restart
注意:强烈建议您将此命令添加到开机启动脚本中,以便每次服务器重启后能自动启动搜索服务程序, 在 Linux 系统中您可以将脚本指令写进 /etc/rc.local 即可。
4)、安装完毕后,您就可以通过自带的脚本 ($prefix/bin/xs-ctl.sh) 启动/关闭 xunsearch 服务端了。用法举例:
$prefix/bin/xs-ctl.sh start # 默认启动,绑定本地的 8383/8384 端口
$prefix/bin/xs-ctl.sh -b inet start # 绑定全部 IP ,适合 SDK/服务端 不同服务器的情况
$prefix/bin/xs-ctl.sh stop # 停止服务器,若启动时指定了 -b inet 此处也必须指定
[root@localhost xunsearch]# bin/xs-ctl.sh -b local start
WARNING: server[xs-indexd] is running (BIND:127.0.0.1:8383, PID:37599)
WARNING: server[xs-searchd] is running (BIND:127.0.0.1:8384, PID:37601)
5)、没错,安装就是这么简单。特别提示,搜索的所有索引数据将被保存到 $prefix/data 目录,因此如果您希望数据目录另行安排,请采用软连接形式确保 $prefix/data 链至真实数据目录。此外,如果服务端启动时使用了 -b inet 参数,那么请借助 iptables 或其它防火墙工具进行保护,xunsearch 本身出于性能考虑不做其它验证处理。
5、安装 PHP-SDK
PHP-SDK 的代码不需要另行下载,已经包含在 xunsearch 的安装结果中了,在此假设您将 xunsearch 安装在 $prefix 目录,那么 $prefix/sdk/php 即是 PHP-SDK 的代码目录。目录结构及功能逻列如下:
_
|- doc/ 离线 HTML 版相关文档
|- app/ 用于存放搜索项目的 ini 文件
|- lib/XS.php 入口文件,所有搜索功能必须且只需包含此文件
\- util/ 辅助工具程序目录
|- RequireCheck.php 用于检测您的 PHP 环境是否符合运行条件
|- IniWizzaard.php 用于帮助您编写 xunsearch 项目配置文件
|- Quest.php 搜索测试工具
\- Indexer.php 索引管理工具
1)、 如果您的搜索应用程序和 xunsearch 在同一台服务器,则无需复制任何代码,在开发的时候直接包含 入口文件 $prefix/sdk/php/lib/XS.php 即可
2)、 如果您的搜索应用和服务端不在同一机器,则请复制 $prefix/sdk/php 目录到相应的搜索应用服务器,同时出于安全考虑,建议不要放到 WEB 可访问的目录。
当 xunsearch 升级安装后必须重新复制安装后的 SDK 代码 去覆盖,否则可能造成版本不匹配导致错误。
3)、使用 SDK 中的 util 工具要求您的 php(cli) 位于可执行文件默认搜索路径中 ( 即用 which php 可以检测到),如不在请做好软链接至 /usr/local/bin/php 。
6、检测运行环境
基础运行条件要求 PHP 最低版本为 5.2.0,随着功能需求的不同可能还会用到一些其它扩展,具体请在 命令行环境里运行我们提供的检测脚本。运行方式如下:/path/to/bin/php $prefix/sdk/php/util/RequiredCheck.php。
运行结果输出的中文编码默认为 UTF-8 ,如果您使用 GBK 环境请在运行命令最后加上 -c GBK 。 运行结果会给出一个可视化的表格说明检测结果,并在最终给出检测结论,告诉您是否符合运行的基础要求。
[root@localhost xunsearch]# php sdk/php/util/RequiredCheck.php
至此,安装和准备工作已经完成了,您可以开始使用 Xunsearch PHP-SDK 开发自己的搜索应用了。
7、DEMO 服务器
某些情况下,部分用户未能自己部署安装服务端,而又想体验 xunsearch 。因此,我们从发布 1.3.3 版本起,提供了一台供用户测试的 DEMO 服务器。用户无需安装服务端,直接下载 PHP-SDK 就可以开发测试。特别提示,DEMO 服务器只用于测试目的,并会不定期重置数据。
具体操作可参考:http://www.xunsearch.com/doc/php/guide/start.demo
8、开发流程
为便于讲解说明,假定 PHP-SDK 代码目录为 $sdk 。
分析搜索需求,设计搜索应用必需的字段。
编写项目配置文件,项目配置 ini 文件存放在 $sdk/app 目录。
引入 $sdk/lib/XS.php 进行搜索功能和界面开发,借助 $sdk/util/*.php 工具进行测试或调试。
9、认识对象
XS — 搜索项目总对象,所有相关操作均基于此对象及子方法。
XSDocument — 搜索结果或索引文档,包括一组字段及值,相当于 SQL 表中的一条记录。
XSIndex — 索引管理,通过 XS 对象的 index 属性取得。
XSSearch — 搜索功能,通过 XS 对象的 search 属性取得。
XSException — 异常类型,必须捕捉此异常以判断操作是否正确,例:
require '$sdk/lib/XS.php'; // 引入 xunsearch sdk try { $xs = new XS('demo'); // demo 为项目名称,配置文件是:$sdk/app/demo.in i // ... 此外为其它 XSIndex/XSSearch 的相关功能代码 } catch (XSException $e) { echo $e . “n” . $e->getTraceAsString() . “n”; // 发生异常,输出描述 }
编写配置文件:
推荐使用我们的在线工具编写:http://www.xunsearch.com/tools/iniconfig
demo 项目的配置如下:
创建索引:
获取 XSIndex 对象
require '$sdk/lib/XS.php'; try { $xs = new XS('test'); // 创建 XS 对象,项目名称为:test $index = $xs->index; // 获取索引对象 // ... 在此编写过索引处理代码 ... } catch (XSException $e) { }
增删改
$doc = new XSDocument(array( // 创建 XSDocument 'pid' => 123, // 主键字段,必须指定 'subject' => '测试文档标题', 'message' => '测试文档内容', 'chrono' => time() )); $index->add($doc); // 添加文档,不检测便索引库内是否已有同一主键数据 $index->update($doc); // 更新文档,若有同主键数据则替换之 $index->del('123'); // 删除主键值为 234 的文档 $index->del(array('123','456')); // 删除主键值为 123 及 456 的文档
清空索引
当搜索字段文件变更或出现严重不同步时,建议清空索引。
$index->clean(); // 一执行立即生效
索引同步
出于性能优化设计,上面所看到的索引操作都是异步操作。也就是说您通过 PHP 调用的 API 返回后,索引变动是先保存在服务端的队列中,由服务端根据负荷延迟一并写入索引库。这个时间差我们控制在合理范围内,通常是几秒钟时间。但如果您在批量更新后希望立即同步,可以这样:
$index->flushIndex();
使用搜索:
获取 XSSearch 对象
require '$sdk/lib/XS.php'; try { $xs = new XS('test'); // 创建 XS 对象,项目名称为:test $index = $xs->search; // 获取搜索对象 // ... 在此编写过搜索处理代码 ... } catch (XSException $e) { }
搜索语法
查询语句和流行的搜索引擎相似,通过空格把搜索词、句连接起来即可,字段检索使用 field:XXX 的格式。
允许使用 AND/OR/NOT/XOR 等显式地布尔关系组合,可以使用小括号 () 包围表达优先级。
支持使用双引号对较长搜索词进行精确匹配,要求字段设计时勾选“精确”项。
$search->search('杭州 西湖'); // 搜索同时包含这2个词的结果 $search->search('杭州 OR 西湖'); // 搜索包含其中一个词的结果 $search->search('subject:杭州 西湖'); // 包括西湖并且标题包含杭州的结果
获取结果
设置数量及偏移
$search->setLimit(5, 15); // 设置最多返回 5 条,并跳过前 15 条,即返回第 16-20 条结果
获取搜索结果
$docs = $search->setQuery('测试')->search(); // 搜索 '测试' foreach ($docs as $doc) { $subject = $search->highlight($doc->subject); // 高亮处理标题 echo $doc->rank() . '. ' . $subject . ' [' . $doc->percent() . '%] - ' . date('Y-m-d’) . "n"; echo $doc->message . "nn"; }
获取搜索结果数量 ( 估算值)
$count = $search->getLastCount(); // 获取最后一次 $search->search() 的匹配数量 $count = $search->count(‘测试’); // 直接检索包含 ‘ 测试’ 的数量
搜索日志
关于日志---系统内部会自动记录并分析搜索关键词日志,通过日志衍生出相关的扩展功能。日志同样是异步更新的并且延迟较大,如需要强制刷新请调用以下指令或索引 API 。
php $sdk/util/Indexer.php -p demo –flush-log # 通过辅助工具刷新日志 $index->flushLogging(); // 通过索引 API 更新
热门搜索---通过 XSSearch::getHotQuery 方法获取热门搜索词,返回的数组以关键词为键名,搜索指数为值。
$words = $search->getHotQuery(); // 获取前 6 个总热门搜索词 $words = $search->getHotQuery(6, ‘lastnum’); // 获取前 10 个上周热门词
相关搜索---通过 XSSearch::getRelatedQuery 方法获取热门搜索词,返回相关搜索词组成的数组。
$words = $search->getRelatedQuery(); // 获取前 6 个和最近一次 setQuery() 相关的搜索词 $words = $search->getRelatedQuery(‘测试’, 10); // 获取 10 个和 ‘ 测试’ 相关的搜索词
搜索纠错---由于输入过快或拼音输入中文很容易出现错误,XSSearch::getCorrectedQuery 方法返回纠正后的关键词组成的数组。
$docs = $search->setQuery('测试')->search(); // 正常进行搜索误打的 '测试' $corrected = $search->getCorrectedQuery(); // 尝试修正 if (count($corrected) > 0) { // 有修正词则列出 echo "您是不是要找:n"; foreach ($corredted as $word) echo $word . "n"; }
搜索建议---类似常见搜索引擎那样,当用户在输入框键入少量字、拼音、声母时进行智能补全,可以节省用户的输入时间。
$words = $search->getExpandedQuery("c"); // 返回 array('测试') $words = $search->getExpandedQuery("测"); // 返回 array('测试') $words = $search->getExpandedQuery("cs"); // 返回 array('测试')
demo:
1、编写test.ini 配置文件 ,放到文件夹/usr/local/xunsearch/sdk/php/app/ 目录下:
project.name = test project.default_charset = utf-8 server.index = 8383 server.search = 8384 [pid] type = id [subject] type = title [message] type = body [chrono] type = numeric
2、创建索引
<?php require '/usr/local/xunsearch/sdk/php/lib/XS.php'; // 引入 xunsearch sdk try { $xs = new XS('test'); // test 为项目名称,配置文件是:$sdk/app/test.ini // ... 此外为其它 XSIndex/XSSearch 的相关功能代码 $index = $xs->index; // 获取索引对象 $index->clean(); // 一执行立即生效 $doc = new XSDocument( array( // 创建 XSDocument 'pid' => 123, // 主键字段,必须指定 'subject' => '测试文档标题', 'message' => '测试文档内容', 'chrono' => time() ) ); $index->add($doc); // 添加文档,不检测便索引库内是否已有同一主键数据 // $index->update($doc); // 更新文档,若有同主键数据则替换之 // $index->del('123'); // 删除主键值为 234 的文档 // $index->del(array('123','456')); // 删除主键值为 123 及 456 的文档 $index->flushIndex(); } catch (XSException $e) { echo $e . "n" . $e->getTraceAsString() . "n"; // 发生异常,输出描述 }
浏览器访问文件:http://www.ck.com/demo.php
3、搜索
<?php require '/usr/local/xunsearch/sdk/php/lib/XS.php'; // 引入 xunsearch sdk try { $xs = new XS('test'); // test 为项目名称,配置文件是:$sdk/app/test.ini // ... 此外为其它 XSIndex/XSSearch 的相关功能代码 //$docs = $xs->search->search('测试'); $docs = $xs->search->search('文档'); echo"<pre>"; var_dump($docs); } catch (XSException $e) { echo $e . "n" . $e->getTraceAsString() . "n"; // 发生异常,输出描述 }
再次访问浏览器:http://www.ck.com/demo.php
即可看到输出结果:
本文为崔凯原创文章,转载无需和我联系,但请注明来自冷暖自知一抹茶ckhttp://www.cksite.cn