Menu Close

xunsearch介绍以及简单使用

最近接了个项目,有个功能是要在搜索时可以高亮展示,其实当时只是说了这个功能,刚好那时候研究了一点ElasticSearch,就想着用ES来做这个,顺便巩固巩固。在接下来的一个月,踩了一些坑,又因为今天线上的ES节点突然挂掉了,所以准备换掉它。说一下ES在本项目中的问题(不是缺点)。

1、对内存要求高一些,1个G起不来。小项目还是算了吧。
2、学习还是需要花费一些时间的,尤其是全家桶。
3、搜索的时候,不能把《匹配到的高亮全文》展示出来,很是让我花费了一些功夫。

之前在项目中用过讯搜、斯芬克斯,上手简单,即开即用,就想着重新试试讯搜,并且庄严的写一篇使用笔记。

背景调查:

基于之前遇到的情况,需要满足以下要求
1.上手简单
2.对内存要求不高,占用小。
3.可以高亮展示
4.对Yii支持友好
5.对中文支持友好

• 打开讯搜首页,全中文,备案是浙,看文档应该没问题了。
看了下更新日志,在2015-04-02已经支持Yii2了,支持Yii2就意味着支持Composer。
分词采用scws,对中文支持友好,demo有高亮的例子。内存占用在官网没有找到,论坛搜索也没有找到,略尴尬,回头看看线上内存使用情况再来报告。
• 目前后端服务器只支持 UNIX (含Linux/BSD/MacOS等) 操作系统,前端开发包只支持 PHP 语言。

整体架构

架构分为两个部分,后端和前端,后端采用 C/C++ 开发的守护进程,也就是前后台是可以分离的。
前台就是各种脚本语言比如python、php、java,不过目前仅支持PHP。

服务端安装

在使用之前可以看一下官方提供的10分钟入门,然后再看一下API,最后看一下原理实现。
首先,下载服务端,也就是后端。
去官网点击下载,除了下载压缩包还支持git,地址是

git clone https://github.com/hightman/xunsearch.git

我倾向于git,一个是下载省事,一个是更新省事(但是git下不下来)
官方推荐的目录有 $HOME/xunsearch 或 /usr/local/xunsearch ,我在这里使用的第二种

  1. cd /opt

将文件下载到/opt

  1. wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2

下载

  1. tar xvf xunsearch-full-latest.tar.bz2

解压

  1. mv xunsearch-full-1.4.11 xunsearch

改名,可选

  1. cd xunsearch
  2. ./setup.sh

运行

  1. 请指定安装目录 (默认为中括号内的值),选择默认,然后回车,开始安装.

等待一会,就安装成功了。

如果mac出现找不到bio.h的错误,请执行

sudo ln -s /usr/local/Cellar/openssl/1.0.2n/include/openssl/ /usr/local/include/openssl

1.0.2n根据自身机器修改

安装后会出现一些信息,其中

  1. 开启/重新开启 xunsearch 服务程序,强烈建议将此命令写入服务器开机脚本中,命令如下:

/usr/local/xunsearch/bin/xs-ctl.sh restart

  1. 所有的索引数据将被保存在下面这个目录中,如需要转移到其它目录,请使用软链接。

/usr/local/xunsearch/data

将开启命令写入服务器开机脚本

echo "/usr/local/xunsearch/bin/xs-ctl.sh restart" >> /etc/rc.d/rc.local

除此之外,入门还提供了一些命令:

  1. $prefix/bin/xs-ctl.sh start # 默认启动,绑定本地的 8383/8384 端口
  2. $prefix/bin/xs-ctl.sh -b inet start # 绑定全部 IP,适合 SDK/服务端 不同服务器的情况
  3. $prefix/bin/xs-ctl.sh stop # 停止服务器,若启动时指定了 -b inet 此处也必须指定

测试:
1./usr/local/xunsearch/bin/xs-ctl.sh stop 关闭服务

INFO: stopping server[xs-indexd] (BIND:127.0.0.1:8383) .... [OK]

INFO: stopping server[xs-searchd] (BIND:127.0.0.1:8384) .... [OK]

2./usr/local/xunsearch/bin/xs-ctl.sh start 开启服务

INFO: starting server[xs-indexd] ... (BIND:127.0.0.1:8383)

INFO: starting server[xs-searchd] ... (BIND:127.0.0.1:8384)

  1. netstat -an | grep 8383

tcp 0 0 127.0.0.1:8383 0.0.0.0:* LISTEN

至此,服务端安装完毕.

前端配置

首先将SDK复制到我们的项目,sdk的路径是

/usr/local/xunsearch/sdk/php

然后设计字段,也就是需要存储那些数据,接下来是编写配置文件,配置文件有工具可以简化工作,最后就是编码工作啦。

在线配置地址: http://www.xunsearch.com/tools/iniconfig

在编码前认识对象
• XS -- 搜索项目总对象,所有相关操作均基于此对象及子方法。
• XSDocument -- 搜索结果或索引文档,包括一组字段及值,相当于 SQL 表中的一条记录。
• XSIndex -- 索引管理,通过 XS 对象的 index 属性取得。
• XSSearch -- 搜索功能,通过 XS 对象的 search 属性取得。
• XSException -- 异常类型,必须捕捉此异常以判断操作是否正确,例:

1.首先打开在线配置地址,将需要的字段填入,通过选择类型,会自动匹配后面的选项。然后点击“>>”获取配置信息,将配置信息粘贴到一个文件,文件名为在线配置地址填写的项目名.ini ,然后粘贴到xunsearch/app/下.

2.创建索引 && 新增文档

try {
            # 创建 XS 对象,项目名称为:taobao
            $xs = new \XS('taobao');
            #获取索引对象
            $index = $xs->index;
            #新增一个文档
            $doc = new \XSDocument(array(
                'id'=>'',
                'project_id' => 123, // 主键字段,必须指定
                'q' => '玉溪是什么?',
                'a' => '玉溪,由红塔烟草集团生产的香烟,属于清香型卷烟,是红塔集团的高端品牌。售价依种类而不同。
中文名 玉溪 属    性 香烟 生产商 红塔烟草集团 用    途 消费
由红塔烟草集团生产。玉溪属于清香型卷烟,是红塔集团的高端品牌,20元-200元一包不等。
“玉溪”牌系列产品鉴别
1.鉴别《玉溪》牌产品有:84mm硬包 2.包装 a.小盒、条盒均采用激光打码技术,打印有玉溪红塔烟草(集团)有限责任公司的质量编码。小盒打在底面,条盒打在中文面左边,上下居中。
b.小盒、条盒所使用的白卡纸,在造纸过程中加入了彩色纤维,打开包装后可以看到有一根根的彩色纤维,而且这种纤维在纸张中同样能够找到。 c.卷烟纸为印有“YXCF”字样的螺纹纸,该字母是在造纸过程中产生的,有字母的地方螺纹是断开的。 d.采用印有“YXCF”字样的打孔水松纸,并印有双金钱和双菱形符号,从抽吸第二口开始到结束,抽吸端滤嘴颜色内深外浅。 e.高科技、高口味、高安全性、低焦油11mg硬包玉溪,产品外包装主体图案采用红色菱形镭射设计,并衬于大面的金色水晶底纹,装潢设计明快、高雅、富贵。',
            ));
            #添加文档,不检测便索引库内是否已有同一主键数据,就算是主键相关,也能存进去
            $index->add($doc);
        } catch (\XSException $e) {
        }

3.搜索 、分页、排序

   #如果输入玉溪中华依然不识别, 因为拆次的结果要求全部匹配,例如玉溪中华拆分为玉溪\中华,可是索引里并没有同时包含玉溪和中华的文档,则不识别。可以加上模糊条件 ,$search->setFuzzy();
   try {
            # 创建 XS 对象,项目名称为:taobao
            $xs = new \XS('taobao');
            #获取搜索对象
            $index = $xs->search;
            #搜不到,搜索同时包含玉溪和中华的文档
            $res = $index->search('玉溪 中华');
            #搜的到 搜索包含玉溪或者中华
            $res = $index->search('玉溪 OR 中华');
            #field:XXX格式 搜索字段q中包含玉溪或者中华的文档
            $res = $index->search('q:玉溪 OR 中华');
            var_dump($res);
        } catch (\XSException $e) {
        }
#分页
$search->setLimit(5); // 设置返回结果为前 5 条
$search->setLimit(5, 15); // 设置返回结果为 5 条,但要先跳过 15 条,即第 16~20 条。
#排序
$search->setSort('id'); // 按 id 字段的值倒序
$search->setSort('id', true); // 按 id 字段的值正序排列
#高亮,高亮的字段会被em嵌套,只需要在style实现em的颜色即可
 try {
            # 创建 XS 对象,项目名称为:taobao
            $xs = new \XS('taobao');
            $text = "玉溪";
            $search = $xs->search;
            $search->setFuzzy();
            $search->setQuery($text);
            $docs = $search->search();
            foreach ($docs as $doc)
            {
                $subject = $search->highlight($doc->q); // 高亮处理 subject 字段
                $message = $search->highlight($doc->a); // 高亮处理 message 字段
            }
        } catch (\XSException $e) {
        }

总结

以上介绍了讯搜的架构特点,包括后端和前端两个部分,后端是守护进程,一般不需要我们去配置,主要是实现前端脚本的构建,包括如何设置字段的类型,以及如何创建配置文件。最后给出了几个简单的例子,包括如何索引文档,如何搜索文档,分词&&全文博大精深,如果需要深入了解可以通过官方文档以及API深入了解。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注