账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    xunsearch搜索文章可以搜索出来,搜索用户却搜索不出来
    54
    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关键词也是存在的。

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 悠然南山行 普通会员 1楼

      在使用Xunsearch搜索文章时,如果用户搜索出来的文章与他实际想要的不匹配,可能会出现以下几种情况:

      1. 搜索词输入错误:用户可能在输入文章的关键词时输入了错误的词语或短语。Xunsearch会根据用户的输入搜索文章,如果用户输入了与实际文章内容不符的关键词,Xunsearch可能会返回结果,但文章内容与用户输入的关键词不符,用户将无法找到他实际想要的文档。

      2. 文章类型选择错误:用户可能在选择搜索范围时选择了错误的类别或领域。Xunsearch默认的搜索范围包括文章分类(如新闻、科技、娱乐、教育等)、主题、关键词等,如果用户选择的搜索范围与实际需要搜索的内容不符,Xunsearch可能会返回错误的结果,用户将无法找到他实际想要的文档。

      3. 全文搜索范围选择错误:如果Xunsearch的全文搜索范围设置错误,用户可能无法找到包含他搜索关键词的所有文章。Xunsearch默认的全文搜索范围为输入关键词所在的页面或整篇文章,如果用户选择的全文搜索范围覆盖了包含他搜索关键词的其他部分,Xunsearch可能会返回错误的结果,用户将无法找到他实际想要的文档。

      4. 文档结构设置错误:Xunsearch默认的文档结构设置可能与用户实际需要搜索的内容不匹配。例如,如果用户希望搜索的文章按照按时间顺序排列,但Xunsearch的文档结构设置默认是按照作者姓氏字母顺序排列,Xunsearch可能会返回错误的结果,用户将无法找到他实际想要的文档。

      5. 用户权限设置错误:如果Xunsearch的用户权限设置与用户实际的访问权限不符,Xunsearch可能会返回错误的结果。例如,如果用户是管理员用户,而Xunsearch的文档系统设置中默认的管理员权限仅允许查看特定文档,Xunsearch可能会返回错误的结果,用户将无法找到他实际想要的文档。

      要解决上述问题,可以尝试以下几种方法:

      1. 清除浏览器缓存和Cookie:清除浏览器缓存和Cookie,确保用户输入的关键词不会被缓存或Cookie中的关键词所覆盖,从而避免返回错误的结果。

      2. 检查和调整搜索范围和全文搜索范围:检查并调整用户选择的搜索范围,确保选择的范围覆盖了包含他搜索关键词的所有文章。例如,如果用户希望搜索的文章按照按时间顺序排列,可以将全文搜索范围设置为包含搜索关键词的文章,而其他页面或整篇文章则可以选择忽略。

      3. 更改文档结构设置:检查并调整Xunsearch的文档结构设置,确保与用户实际需要搜索的内容匹配。例如,如果用户希望搜索的文章按照按时间顺序排列,可以将文档结构设置为按时间顺序排列,而其他页面或整篇文章则可以选择忽略。

      4. 调整Xunsearch的用户权限:检查并调整Xunsearch的用户权限设置,确保符合用户实际的访问权限。例如,如果用户是管理员用户,可以增加Xunsearch的用户权限,允许用户查看所有文档,而其他用户则可以选择忽略。

      5. 提供帮助文档或在线帮助:如果以上方法都无法解决问题,可以提供帮助文档或在线帮助,帮助用户了解Xunsearch的使用方法和功能,指导用户如何正确地输入和使用关键词进行搜索。同时,也可以提供详细的搜索指南,包括如何添加关键词、如何调整搜索范围和全文搜索范围、如何查看和编辑搜索结果、如何修改文档结构设置等,以帮助用户更好地使用Xunsearch进行搜索。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部