迅搜开源中文搜索引擎
本文字数:1.9k 字 | 阅读时长 ≈ 7 min

迅搜开源中文搜索引擎

本文字数:1.9k 字 | 阅读时长 ≈ 7 min

简介

Xunsearch (中文名:迅搜)是一套免费开源的专业中文全文检索解决方案,简单易用而且 功能强大、性能卓越能轻松处理海量数据的全文检索。它包含后端索引、搜索服务程序和前端 脚本语言编写的开发工具包(称之为 SDK) 。

Xunsearch 底层采用 C/C++ 编写,索引设计基于著名而悠久的 Xapian,分词采用 自主研发同样也是开源的 SCWS分词,两者完美结合,理论上单个搜索库支持 40 亿条 记录。可编译运行于 Linux/FreeBSD 等各种 UNIX 类型的系统。

Xunsearch PHP-SDK 是该项目的 PHP 语言开发工具包,面向普通开发者提供简要的 API ,在此基础上快速构建自己的全文检索应用。

优势

开源免费 Xunsearch 全面开源,并使用最流行的开源许可协议 GPL 发布。任何人均可以免费 获取本项目的全部源代码,并在许可条件下修改和再分发。

分布式架构 搜索程序的前端和后端可以分离部署在不同服务器中,对于大规模的搜索应用还可以 对索引进行水平、垂直切割。

开发难度极低 一般开发者只要在安装和设置完成后,通过提供的脚本 SDK 包,便可十分容易的进行 二次开发,打造出自己的全文搜索引擎。

功能强大 支持字段检索、结果高亮、字段排序、布尔语法、区间检索、聚合搜索、相关搜索、 权重微调、拼音搜索、搜索建议等专业搜索引擎具备的各项功能。这也是本项目 相对于其它开源搜索软件的重要优势。

适用领域

适合具备独立服务器(需要Unix 类操作系统)的初、中型规模的网站,作为完整全文检索技术 解决方案。

支持 MySQL 数据库全文检索、Web站内/论坛搜索、行业门户/垂直搜索、企业级的站内搜索、 计算机文件搜索等,各种专业搜索引擎(如购物搜索,旅游搜索、游戏搜索)、文档/文献检索 等各种领域。

安装

Xunsearch PHP-SDK 是与 xunsearch 后端服务协同工作的,所以后先必须先在您的服务器 上安装服务端,服务器操作系统要求必须是 Linux、BSD 或其它类 UNIX 系统,同时安装了 gcc、make 等基础编译环境。

  1. 安装xunsearch
 wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2
 tar -xjf xunsearch-full-latest.tar.bz2
 cd xunsearch-full-1.3.0/
 sh setup.sh
  1. 启动(命令中的 $prefix 请务必替换为您的安装目录)
  cd $prefix ; bin/xs-ctl.sh restart

安装PHP-SDK(这里主要是Yii2.0的安装以及使用Composer安装)

直接运行

composer require --prefer-dist hightman/xunsearch "*@beta"

或者将以下内容添加到您的项目根目录 composer.json 中的 require 章节, 然后运行 composer install

"hightman/xunsearch": "*@beta"

Yii2.x用法

在 yii2 中,支持 ActiveRecord 方式来操作。首先, 请在应用配置文件的 components 中添加以下代码,通常是 common/config/main.php

// application components
    'components' => [
        // ... other components ...
        'xunsearch' => [
            'class' => 'hightman\xunsearch\Connection',  // 此行必须
            'iniDirectory' => '@app/config', // 搜索 ini 文件目录,默认:@vendor/hightman/xunsearch/app
            'charset' => 'utf-8',    // 指定项目使用的默认编码,默认即时 utf-8,可不指定
        ],
    ],

Xunsearch项目配置

项目名称:要求用纯小写字母和小划线组成,长度控制在 2-31 个字符,这也是 xunsearch 服务器内用于保存索引数据的目录名称, 所以同一 xunsearch 服务器内的不同项目名称不可重复。默认为不含后缀的配置文件名, 如:xyz.ini 则项目名默认为 xyz 。

默认字符集:默认字符集范围涵盖服务端交互时的输入数据、输出数据,实际使用时索引文档、 检索服务器仍可重新指定字符集。

服务端连接参数:一般默认的索引服务器的配置是8384,搜索服务器的配置为8384。

关于项目配置的具体参数信息以及字段设计请看这里。项目配置

这里放上一个配置的案例:

project.name = demo
project.default_charset = utf-8
server.index = 8383
server.search = 8384
[id]
type = id
[name]
type = title
[detail]
type = body
[chrono]
type = numeric

Yii2.0用法创建AR对象

首先必须创建一个继承自 hightman\xunsearch\ActiveRecord 的模型类,默认情况下会以全小写的类名字作为 ini 文件名。如需指定,请自行覆盖编写 hightman\xunsearch\ActiveRecord::projectName()。通常代码如下:

class Demo extends \hightman\xunsearch\ActiveRecord
{
    /*public static function projectName() {
        return 'another_name';  // 这将使用 @app/config/another_name.ini 作为项目名
    }*/
}

添加或更新索引

// 添加索引,也可以通过 $model->setAttributes([...]) 批量赋值
$model = new Demo;
$model->pid = 321;
$model->subject = 'hello world';
$model->message = 'just for testing...';
$model->save();

// 更新索引
$model = Demo::findOne(321);
$model->message .= ' + updated';
$model->save();

// 如需删除数据则可直接
$model->delete();

检索对象

和 yii2 其它的 ActiveRecord 类似:

$query = Demo::find(); // 返回 ActiveQuery 对象
$condition = 'hello world'; // 字符串原样保持,可包含 subject:xxx 这种形式
$condition = ['WILD', 'key1', 'key2' ... ]; // 通过空格将多个查询条件连接
$condition = ['AND', 'key1', 'key2' ... ]; // 通过 AND 连接,转换为:key1 AND key2
$condition = ['OR', 'key1', 'key2' ... ]; // 通过 OR 连接
$condition = ['XOR', 'key1', 'key2' ... ]; // 通过  XOR 连接
$condition = ['NOT', 'key']; // 排除匹配 key 的结果
$condition = ['pid' => '123', 'subject' => 'hello']; // 转换为:pid:123 subject:hello
$condition = ['pid' => ['123', '456']]; // 相当于 IN,转换为:pid:123 OR pid:456
$condition = ['IN', 'pid', ['123', '456']]; // 转换结果同上
$condition = ['NOT IN', 'pid', ['123', '456']]; // 转换为:NOT (pid:123 OR pid:456)
$condition = ['BETWEEN', 'chrono', 14918161631, 15918161631]; // 相当于 XSSearch::addRange(...)
$condition = ['WEIGHT', 'subject', 'hello', 0.5]; // 相当于额外调用 XSSearch::addWeight('subject', 'hello', 0.5);
$query->where($condition);

对于 hightman\xunsearch\ActiveQuery 对象,主要支持以下几个方法获取和操作:

asArray(): 以数组形式返回数据
one(): 返回一行数据
all(): 返回全部数据
count(): 统计数据匹配数据,是估算的并不是完全准确
exists(): 判断查询条件是否存在数据
where(): 指定搜索条件
orderBy(): 指定排序方式,默认为相关性排序
limit(), offfset(): 指定获取数据量和偏移,用于分页检索
with(), indexBy ...
buildOther(function(\XSSearch $search){}) 可通过此方法定制检索选项

ActiveRecord 对象实现了绝大多数据接口,完全可以像使用普通数据库模型一样使用它。如果需要 访问原始的 xunsearch 对象,请通过以下方式获取 Database 对象:

$db = Demo::getDb();
$search = $db->getSearch();
$index = $db->getIndex();
// 如有必要,还可以获得 scws 分词对象
$scws = $db->getScws();

相关的 AR 索引操作均非实时的,如需实时更新索引,请通过 Database::getIndex()->flushIndex() 刷新。 关于查询日志有关的功能,也建议通过原生的 XSSearch 和 XSIndex 对象来操作。