美文网首页数据库
xunsearch在thinkphp5中的使用

xunsearch在thinkphp5中的使用

作者: 哎哟我去 | 来源:发表于2019-05-30 14:54 被阅读0次

    安装xunsearch的服务器端,不会的话点这里

    通过composer安装sdk

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

    建立xunsearch的索引

    这里我们以eacms项目为例:

    1. 利用官方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我们
    搜索规则可以参看官方文档
    结果如下:

    搜索结果

    有一点小弟不是很明白

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

    相关文章

      网友评论

        本文标题:xunsearch在thinkphp5中的使用

        本文链接:https://www.haomeiwen.com/subject/acxvtctx.html