0

1. 我使用xunsearch做搜索功能,为两张表建立了文档索引,一个是文章表,一个是用户表
2. 我的配置文件有两个user.ini article.ini 内容如下

project.name = user
project.default_charset = utf-8
server.index = xxx:8383
server.search = xxx:8384

[id]
type = id

[nickname]
index = self
phrase = yes

[avatar]

[article_numbers]
type = numeric

[follow_numbers]
type = numeric

[fans_numbers]
type = numeric

[createtime]
type = numeric
project.name = article
project.default_charset = utf-8
server.index = xxx:8383
server.search = xxx:8384

[id]
type = id

[author]
type = string

[user_id]

[category_id]
index = self
tokenizer = full

[category]
type = both

[title]
type = title

[cover_url]
type = both

[content]
type = body

[reply_numbers]
type = numeric

[star_numbers]
type = numeric

[read_numbers]
type = numeric

[createtime]
type = numeric

3. 建立索引文档

    /**
     * 根据文章生成或者更新索引文档
     * @param $type string 根据参数判断是更新(update)还是重新生成文章文档(add)
     * @param $subject string 根据参数判断是生成文章索引(article)还是生成用户索引(user)
     * @return bool
     * @throws \XSException
     * @throws \think\exception\DbException
     */
    public function makedoc()
    {
        $request = Request::instance();
        $type = $request->param('type');
        $subject = $request->param('subject');
        switch ($subject){
            case 'article':
                $map = [
                    'status' => ExtraConst::NORMAL
                ];
                $order = 'collect_numbers desc,reply_numbers desc,star_numbers desc,read_numbers desc,id desc';
                $articles = Article::all(function ($query) use ($map, $order) {
                    $query->where($map)->order($order);
                });
                if (!$articles) {
                    return false;
                }
                $xs = new \XS(file_get_contents(ROOT_PATH . 'docs' . DIRECTORY_SEPARATOR . 'article.ini'));
                $doc = new \XSDocument();
                foreach ($articles as $article) {
                    $doc->setFields([
                        'id'            => $article->id,
                        'author'        => $article->author,
                        'user_id'       => $article->user_id,
                        'category_id'   => $article->category_id,
                        'category'      => $article->category,
                        'title'         => $article->title,
                        'content'       => $article->content,
                        'cover_url'     => $article->cover_url,
                        'reply_numbers' => $article->reply_numbers,
                        'star_numbers'  => $article->star_numbers,
                        'read_numbers'  => $article->read_numbers,
                        'createtime'    => $article->createtime,
                    ]);
                    if ($type === 'add') {
                        $result = $xs->index->add($doc);
                    } elseif ($type === 'update') {
                        $result = $xs->index->update($doc);
                    }
                }
                break;
            case 'user':
                $map = [
                    'status' => 'normal'
                ];
                $order = 'id desc';
                $users = User::all(function ($query) use ($map, $order){
                    $query->where($map)->order($order);
                });
                if (!$users) {
                    return false;
                }
                $xs = new \XS(file_get_contents(ROOT_PATH . 'docs' . DIRECTORY_SEPARATOR . 'user.ini'));
                $doc = new \XSDocument();
                foreach ($users as $user){
                    $doc->setFields([
                        'id'                => $user->id,
                        'nickname'          => $user->nickname,
                        'avatar'            => $user->avatar,
                        'article_numbers'   => $user->article_numbers,
                        'follow_numbers'    => $user->follow_numbers,
                        'fans_numbers'      => $user->fans_numbers,
                        'createtime'        => $user->createtime,
                    ]);
                    if ($type === 'add') {
                        $result = $xs->index->add($doc);
                    } elseif ($type === 'update') {
                        $result = $xs->index->update($doc);
                    }
                }
                break;
        }

        if ($result) {
            echo '--------success  ----------';
        }
    }

4. 根据关键词搜索内容

    /**
     * 按照关键词搜索内容
     * @return array
     * @throws \XSException
     */
    public function search()
    {
        $request = Request::instance();
        $query = $request->post('key');
        $article_ini = file_get_contents(ROOT_PATH . 'docs' . DIRECTORY_SEPARATOR . 'article.ini');
        $user_ini = file_get_contents(ROOT_PATH . 'docs' . DIRECTORY_SEPARATOR . 'user.ini');
        // 加载文章配置 初始化文章索引
        $a_xs = new \XS($article_ini);
        $a_search = $a_xs->search;
        $a_search->setQuery($query)->setSort('createtime', true)->setLimit(20, 0);
        $a_docs = $a_search->search();
        $a_count = $a_search->count();
        // 加载用户配置 初始化用户索引
        $u_xs = new \XS($user_ini);
        $u_search = $u_xs->search;
        $u_search->setQuery($query)->setSort('createtime', true)->setLimit(20, 0);
        $u_docs = $u_search->search();
        $u_count = $u_search->count();
        dump($a_docs);
        dump($u_docs);die;
        // 初始化变量

5. 使用postman测试接口

array(3) {
  ["code"] => int(1024)
  ["users"] => array(0) {
  }
  ["articles"] => array(4) {
    [1] => array(10) {
      ["id"] => string(10) "jo1gn7l9b8"
      ["title"] => string(36) "啦啦啦这也是一篇测试文章"
      ["author"] => string(22) "区块链学院-文杰"
      ["user_id"] => string(10) "xenp87gyvk"
      ["read_numbers"] => string(3) "123"
      ["reply_numbers"] => string(4) "3445"
      ["star_numbers"] => string(4) "1322"
      ["cover_url"] => string(41) "/uploads/cover/20180423/5add3c3664db9.jpg"
      ["content"] => string(57) "这是一篇测试文章啊哈哈哈哈啊哈哈哈哈哈"
      ["createtime"] => string(11) "04-11 18:52"
    }
    [2] => array(10) {
      ["id"] => string(10) "jo1gn7l9b8"
      ["title"] => string(36) "啦啦啦这也是一篇测试文章"
      ["author"] => string(22) "区块链学院-文杰"
      ["user_id"] => string(10) "xenp87gyvk"
      ["read_numbers"] => string(3) "123"
      ["reply_numbers"] => string(4) "3445"
      ["star_numbers"] => string(4) "1322"
      ["cover_url"] => string(41) "/uploads/cover/20180423/5add3c3664db9.jpg"
      ["content"] => string(57) "这是一篇测试文章啊哈哈哈哈啊哈哈哈哈哈"
      ["createtime"] => string(11) "04-11 18:52"
    }

6.我测试了很多次
文章的关键词很轻松的就可以搜索出来,而用户表的得nickname数据,怎么样都搜不出来,
我尝试到linux的/usr/local/xunsearch/data/db中去找索引文档,是有user和article文档的,请问我的代码到底是哪里出了问题?我的UserModel中我断点调试过,是有数据的,nickname关键词也是存在的。

幼儿猿 154
2018-04-30 提问
0 个回答

撰写答案

推广链接