xunsearch介绍以及简单使用

28次阅读
没有评论

共计 4191 个字符,预计需要花费 11 分钟才能阅读完成。

最近接了个项目,有个功能是要在搜索时可以高亮展示,其实当时只是说了这个功能,刚好那时候研究了一点 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 深入了解。

正文完
 0
admin
版权声明:本站原创文章,由 admin 于2018-02-27发表,共计4191字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码