我的经历

下午正热,亮得发白的太阳使得室内的空调都感觉吃力。

经过一个小时的面试,面试官有些倦怠,他坐在椅子上微微后仰,嘴角露出一丝不屑,突然,啪得一声!面试官将手中的水性笔扔到他面前的桌子上,之后轻轻地对我说:

“你有什么实力?老弟?”

。。。

我怔了一下,怒火很快填满了内心,我快速打开电脑,当着面试官的面,将键盘敲得噼里啪啦。
几分钟后,一个PHP全文检索引擎便从我的手中诞生。看着屏幕上的无数行代码,面试官怔了一下,好一会儿没缓过神,随后面试官颤抖着手摘下搭在鼻梁上的金丝眼镜,他刚要说什么,我立即向前俯身笑着问道:

“这个搜索引擎叫什么名字好呢?”

就叫WindSearch吧。”没等面试官反应过来,我便脱口而出。

这时,坐在桌子里面的面试官,额头上已经有不少汗珠了。

我起身一脚踢开身后的椅子,整理了一下略有褶皱的格子衬衫,笑着对面试官说:

“椅子有点硬,我坐着很不舒服。”

说完,我便合起电脑,转身向门外走去。

“等等...

“请留步!”

“可以...可以...让我看看WindSearch吗?”

我停下脚步,但并没有转身,我慢慢闭上眼睛,随后迅速举起左手,用力向身后一挥,狭窄的办公室瞬间刮起一阵让人无法呼吸的狂风,桌子上的文件被这股狂风卷得纷纷扬扬,霎那间,一道刺眼的闪电劈在面试官面前的桌面上,他吓得连连后退,最后被椅子绊倒,整个人摔在墙上,又重重地砸在地上...

半分钟后,一切都开始平静下来,地上、桌子上、面试官的身上,都布满了各种纸张文件...
这时,桌子上被闪电劈过的地方,慢慢显现出一行内容,面试官惊恐地扶着墙站起来,颤颤巍巍地走到桌子面前,发现桌面上是一个链接:

https://github.com/rock365/windsearch

窗外红得像一团火的残阳,也开始消退,一切都结束了。

“杀鸡焉用牛刀?快换掉你那沉重的ES吧。”

说完,我收起似笑非笑的表情,继续向办公室外面走去。

这时,面试官立刻大声对我喊道:

“我懂了!

“我懂了!!”

“我这就点进去给你点一个star!!”

--- 完 ---

WindSearch到底是什么啊?

WindSearch是我用PHP开发的一个搜索引擎,是一个基于中文分词、由数据结构跟算法驱动的全文检索引擎,拥有高速的索引跟搜索能力,什么单字段检索、多字段检索、前缀匹配、bool检索、搜索过滤等功能,WS都支持。开发这个引擎的目的,就是为了用WS在PHP中小站点上替换掉过重的ES,一个小网站,用一个java程序实现搜索,上来就占用一半内存,不太合适吧,而且还需要一大堆配置。

废什么话,到底怎么用?

1,简单到令人发指的安装

1,将代码从github上下载下来,放在你喜欢的文件夹内;

2,以下面这种方式引入,注意具体路径

require_once 'yourdirname/windsearch/vendor/autoload.php';

到这里所有安装已经全部完成,再无其它任何配置。

2,还配置个毛线,直接导入数据

WindSearch 2.0版本有即用模式、专业模式这两种模式。

即用模式在简单搜索场景下,导入、搜索等操作,更加简单直接,无需任何配置。

即用模式

即用模式 导入、搜索操作的代码示例:

导入数据

// 实例化对象
$Wind = new \WindSearch\Index\Wind('test'); //test 当前索引库的名称
// 清空之前的数据(如果之前使用即用模式导入过数据)
$Wind->deleteFastIndex();
// 批次导入数据
// $res 是从数据库查询的数据
foreach($res as $v){
    $text = $v['title'];
    $primarykey = $v['id'];
    // $text是需要搜索的具体内容,比如title;$primarykey是主键值,比如id的值
    $Wind->fastIndexer($text, $primarykey);
}
//每导入一批数据,就调用此方法进行保存
$Wind->fastBatchWrite();

// 所有数据全部导入完成后,接着构建索引(不一定非得紧接着调用,也可以在其它地方单独调用)
$Wind->fastBuildIndex();

开始搜索

// 开始搜索
$Wind = new \WindSearch\Index\Wind('test');
// 调用搜索方法
// $page 第几页 $listRows 每页多少条
$res = $Wind->fastSearch($text,$page,$listRows)
// $res:返回的主键(比如id)集合,你可以使用id集合从MySQL等数据库查询原始数据

专业模式

如果即用模式无法满足你的搜索需求,那么开始使用专业模式吧!

安装跟上面是一样的:

require_once 'yourdirname/windsearch/vendor/autoload.php';

建索引库:

复制修改粘贴即可,跟mysql建表差不多

$mapping = [
      //设置索引库的名称,比如对应的表名
    'name' => 'test', 
    // 字段配置
    'field' => [ 
        [
            'name' => 'id',// 主键名称 主键必须设置
            'type' => 'primarykey', //数据类型为主键 必须设置
            'primarykey_type' => 'Int_Incremental', // int递增;Int_Incremental或者UUID
        ],
        [
            'name' => 'title',
            'index' => true, // 是否索引词字段
            'type' => 'text',
            'analyzer' => 'segment',// 配置分词方式
        ],
        [
            'name' => 'tags',
            'index' => true,
            'type' => 'keyword', 
        ]
        [
            'name' => 'score',
            'type' => 'numeric', 
        ],
        [
            'name' => 'time',
            'type' => 'date'
        ],

        [
            'name' => 'descr',
            'type' => 'text',
        ],

    ]

];

// 实例化对象
$Wind = new \WindSearch\Index\Wind('test'); //test 当前索引库的名称
//检查是否存在此索引库
$is_index = $Wind->checkIndex();
// 如果存在此索引库
if ($is_index) {
    //删除索引库
    $Wind->delIndex();
}
//创建索引库
$Wind->createIndex($mapping);

导入数据:

//实例化引擎
$Wind = new \WindSearch\Index\Wind('test');
// 初始化
$Wind->buildIndexInit();
// 开启分词,导入数据时,加true可加快速度
$Wind->loadAnalyzer(true);

// 数据量小(内容少于一万条),则可以一次性全部导入
// selectAll...
// $result:一次性查询的所有内容
foreach ($result as $v) {
    $Wind->indexer($v);
}
// 批量写入文件保存
$Wind->batchWrite();

构建索引:

// 数据导入结束后,接着可立即调用此方法构建索引
// 注意,数据量大时,此步骤会比较耗时
$Wind->buildIndex();

开始搜索:

//实例化引擎
$Wind = new \WindSearch\Index\Wind('test');

//开启分词功能
$Wind->loadAnalyzer();

//开始搜索

// 搜索单个字段
$query = [
    'match' => [
        'field' => [
            'name' => 'title',
            'query' => $text,
        ],
        'list_rows' => $listRows, //每页多少条数据
        'page' => $page, //第几页

    ]

];

// 搜索接口
$res = $Wind->search($query, $page, $listRows);
// 返回的最终结果,可直接渲染到前台页面
$resArr = $res['result']['_source'];

当然,这些只是餐前小菜,WindSearch还有更深入、更丰富的搜索功能等你挖掘。

在线开发文档:https://rock365.github.io/ 偶尔访问不稳定,多刷新几次即可

👏 让PHP再次伟大!

github上点个star吧亲亲O(∩_∩)O~~谢谢大家!


会飞的鸟
4 声望1 粉丝

v: azg555666