- 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 条
- 全部回答
-
悠然南山行 普通会员 1楼
在使用Xunsearch搜索文章时,如果用户搜索出来的文章与他实际想要的不匹配,可能会出现以下几种情况:
-
搜索词输入错误:用户可能在输入文章的关键词时输入了错误的词语或短语。Xunsearch会根据用户的输入搜索文章,如果用户输入了与实际文章内容不符的关键词,Xunsearch可能会返回结果,但文章内容与用户输入的关键词不符,用户将无法找到他实际想要的文档。
-
文章类型选择错误:用户可能在选择搜索范围时选择了错误的类别或领域。Xunsearch默认的搜索范围包括文章分类(如新闻、科技、娱乐、教育等)、主题、关键词等,如果用户选择的搜索范围与实际需要搜索的内容不符,Xunsearch可能会返回错误的结果,用户将无法找到他实际想要的文档。
-
全文搜索范围选择错误:如果Xunsearch的全文搜索范围设置错误,用户可能无法找到包含他搜索关键词的所有文章。Xunsearch默认的全文搜索范围为输入关键词所在的页面或整篇文章,如果用户选择的全文搜索范围覆盖了包含他搜索关键词的其他部分,Xunsearch可能会返回错误的结果,用户将无法找到他实际想要的文档。
-
文档结构设置错误:Xunsearch默认的文档结构设置可能与用户实际需要搜索的内容不匹配。例如,如果用户希望搜索的文章按照按时间顺序排列,但Xunsearch的文档结构设置默认是按照作者姓氏字母顺序排列,Xunsearch可能会返回错误的结果,用户将无法找到他实际想要的文档。
-
用户权限设置错误:如果Xunsearch的用户权限设置与用户实际的访问权限不符,Xunsearch可能会返回错误的结果。例如,如果用户是管理员用户,而Xunsearch的文档系统设置中默认的管理员权限仅允许查看特定文档,Xunsearch可能会返回错误的结果,用户将无法找到他实际想要的文档。
要解决上述问题,可以尝试以下几种方法:
-
清除浏览器缓存和Cookie:清除浏览器缓存和Cookie,确保用户输入的关键词不会被缓存或Cookie中的关键词所覆盖,从而避免返回错误的结果。
-
检查和调整搜索范围和全文搜索范围:检查并调整用户选择的搜索范围,确保选择的范围覆盖了包含他搜索关键词的所有文章。例如,如果用户希望搜索的文章按照按时间顺序排列,可以将全文搜索范围设置为包含搜索关键词的文章,而其他页面或整篇文章则可以选择忽略。
-
更改文档结构设置:检查并调整Xunsearch的文档结构设置,确保与用户实际需要搜索的内容匹配。例如,如果用户希望搜索的文章按照按时间顺序排列,可以将文档结构设置为按时间顺序排列,而其他页面或整篇文章则可以选择忽略。
-
调整Xunsearch的用户权限:检查并调整Xunsearch的用户权限设置,确保符合用户实际的访问权限。例如,如果用户是管理员用户,可以增加Xunsearch的用户权限,允许用户查看所有文档,而其他用户则可以选择忽略。
-
提供帮助文档或在线帮助:如果以上方法都无法解决问题,可以提供帮助文档或在线帮助,帮助用户了解Xunsearch的使用方法和功能,指导用户如何正确地输入和使用关键词进行搜索。同时,也可以提供详细的搜索指南,包括如何添加关键词、如何调整搜索范围和全文搜索范围、如何查看和编辑搜索结果、如何修改文档结构设置等,以帮助用户更好地使用Xunsearch进行搜索。
-
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

