小白如何使用 迅搜(xunsearch)
闲来无事打算把博客的搜索功能加上便于日后的文章搜索
在使用msyql进行模糊查询的时候,很自然的会用到like语句,通常情况下,在数据量小的时候,不容易看出查询的效率,但在数据量达到百万级,千万级的时候,查询的效率就很容易显现出来。这个时候查询的效率就显得很重要!
所以我们打算使用分词中间件来提高搜索的效率和友好性
分词中间件有 sphinx、coreseek、xunsearch、solr等
此次为了达到简单学习及装逼的效果我们使用Xunsearch举例
1、Xunsearch是什么?
Xunsearch 是一个高性能、全功能的全文检索工具。
Xunsearch 旨在帮助一般开发者针对既有的海量数据,快速而方便地建立自己的全文搜索引擎。
Xunsearch 中文译名为“迅搜”,代码中的经常被缩写为 XS,既是英文名称的缩略也是中文声母缩写。 这儿的“迅”是快速的意思,至少包含了两层涵义:其一代表了搜索结果的响应能力,其二则为二次开发难度、速度。
2、需要了解Xunsearch 工作原理 及 使用流程
1. Xunsearch 原理官网有
2. 流程:安装Xunsearch -> 引入SDK包 -> 创建索引 -> 关键字分词 -> 搜索索引数据 -> 干你想干的 -> End
3、源代码实例
索引操作方法
/** * 索引操作 仅供参考 */ public function actionXunsearch($act){ try { // 定义配置文件地址 (ini文件设计辅助工具 http://www.xunsearch.com/tools/iniconfig) define('XS_APP_ROOT',dirname(dirname(__DIR__)).'/common/config'); $xs = new \XS('demo'); // demo 为项目名称,配置文件是:$sdk/app/demo.ini $index = $xs->index; // 获取索引对象 if($act == 'create-index'){ //清空索引 $index->clean(); echo 'clean index successful'."<br/>"; $list = "查询数据 Array"; if($list){ $doc = new \XSDocument; // 创建文档对象 foreach ($list as $_k=>$_v){ $doc->setFields([ //创建 XSDocument 'id' => $_v['id'], 'title' => $_v['title'], 'content' => '', ]); // 添加文档,不检测便索引库内是否已有同一主键数据 $index->update($doc) echo 'insert index successful :'.$_v['id']."<br/>"; } //告诉服务器重建索引完成 $index->endRebuild(); $index->flushIndex(); echo 'flush index successful'; } }elseif ($act == 'clean-index'){ //清空索引 $index->clean(); // 一执行立即生效 echo 'clean index successful'; }elseif ($act == 'flush-index'){ //同步索引 $index->flushIndex(); echo 'flush index successful'; } } catch (XSException $e) { echo $e . "\n" . $e->getTraceAsString() . "\n"; // 发生异常,输出描述 } }
查询方法
//模糊查询 (Xunsearch 分词) if(!empty($where['keyword'])){ $xs = new \XS('demo'); // demo 为项目名称,配置文件是:$sdk/app/demo.ini $tokenizer = new \XSTokenizerScws; // 直接创建分词Scws实例 $words = $tokenizer->getResult($where['keyword']); $query = 'title:'.implode(' OR ',array_column($words,'word')); $search = $xs->search; // 获取搜索对象 $search->setQuery($query); // 设置搜索语句 // $search->setLimit(2, 0); // 设置返回结果最多为 5 条,并跳过前 10 条 $docs = $search->setFuzzy()->search(); //setFuzzy() 模糊搜索 $ids = []; if($docs){ foreach ($docs as $_k=>$_v){ $ids[] = $_v->id; } } }
4、总结
索引可以通过定时任务重建索引 也可以实时的单条更新索引 官方提供了Indexers索引管理器
本文操作仅为简单基础操作 更多功能请参考官方文档