我的经历
下午正热,亮得发白的太阳使得室内的空调都感觉吃力。
经过一个小时的面试,面试官有些倦怠,他坐在椅子上微微后仰,嘴角露出一丝不屑,突然,啪得一声!面试官将手中的水性笔扔到他面前的桌子上,之后轻轻地对我说:
“你有什么实力?老弟?”
“。。。”
我怔了一下,怒火很快填满了内心,我快速打开电脑,当着面试官的面,将键盘敲得噼里啪啦。
几分钟后,一个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~~谢谢大家!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。