xunsearch在thinkphp5中的使用
2019-05-30 本文已影响0人
哎哟我去
安装xunsearch的服务器端,不会的话点这里
通过composer安装sdk
composer require --prefer-dist hightman/xunsearch "*@beta"
建立xunsearch的索引
这里我们以eacms
项目为例:
- 利用官方php-sdk工具来实现:
在\xunsearch\sdk\php\app下新建一个名为“eacms”的配置文件;
-
ini文件怎么写配置,可以使用官方提供的工具(请我前往)
cd 到sdk-php的目录下执行:
util/Indexer.php --rebuild --source=mysql://www_ceshi_gov:Y58SdWiXFF8DDxKj@127.0.0.1/www_ceshi_gov --sql="SELECT id,title,content FROM xphp_posts" --filter=debug --project=eacms >log.txt
参数就不具体解释了,看两下就懂。
导入结果
2.自己写一个导入数据的方法: -
在下图位置配置项目文件
composer包中的配置文件位置
-
新建一个控制器用于导入数据:
/**
* @param $data 需要导入的数据
* @param string $file 配置文件名称
* @return bool|string
* 添加、更新数据
*/
public function xunAdd($data, $file = 'eacms')
{
try {
$xs = new \XS($file);
$doc = new \XSDocument();
$doc->setFields($data);
$index = $xs->index;
$index->update($doc);
$result = $index->flushIndex();
return $result;
} catch (\Exception $exception) {
return $exception->getMessage();
}
}
这个我没有测试过,理论是OK的。。。。
推荐第一种方法,方便定时任务。
- 编写搜索控制器
/**
* @param int $limit_num 显示的结果条数
* @param int $limit_begin 跳过前N位的结果
* @param bool $fuzzy 是否模糊查询
* @param bool $synon 否开启同义词查询
* @throws \XSException
*/
public function xunSearch($limit_num = 20, $limit_begin = 0, $fuzzy = true, $synon = true)
{
$keyword = \input('keyword');
if (empty($keyword)) {
$this->error('请输入关键字');
}
$keyword = \trim($keyword);
$xs = new \XS('eacms');
$search = $xs->getSearch();
$s_time = \microtime(true);
//结果集
$docs = $search
//设置是否开启模糊查询
->setFuzzy($fuzzy)
//设置是否开启同义词查询
->setAutoSynonyms($synon)
//设置查询结果显示条数
->setLimit($limit_num, $limit_begin)
//查询关键字
->setQuery($keyword)
->search();
//高亮处理,因为$docs的结果集不让修改,所以自己建一个数组并组装需要的字段
$res = [];
foreach ($docs as $k => $doc) {
$res[$k]['id'] = $doc['id'];
$res[$k]['title'] = $search->highlight($doc['title']);
$res[$k]['content'] = $search->highlight($doc['content']);
}
$e_time = \microtime(true);
//获得本次查询的结果总数(这是个估值)
$matched = $search->getLastCount();
//获得搜索数据库中数据的总量
$total = $search->getDbTotal();
//搜索耗时
$cost_time = $e_time - $s_time;
$result = [
'count' => \count($res),
'cost_time' => \round($cost_time, 4),
'result' => $res,
];
\halt($result);
}
测试结果:
我键入关键字:谷歌OR我们
搜索规则可以参看官方文档
结果如下:

有一点小弟不是很明白
搜索“我们”出来结果,但是搜索“我”却没有结果,这是为嘛呢!?
恳请(女装)大佬不吝赐教~_~