MongoDB利用aggregate在PHP下进行词组权重搜索方法 2021-01-30 - PHP版本:7.3.21 - Mongo版本: 4.2 **mongodb表内容:** ```shell db.goods.insertMany([ {'name' : '回力男鞋小白鞋2020新款板鞋男士百搭基础休闲韩版运动鞋子男潮鞋秋冬季', 'price' : 89, 'quantity' : 99 }, {'name' : '特步男鞋板鞋男运动鞋子男官方网店秋冬季小白鞋高帮男鞋皮面休闲鞋户外情侣鞋防滑耐磨滑板鞋 黑白', 'price' : 159, 'quantity' : 78 }, {'name' : '361度板鞋小白鞋男运动板鞋2020年春秋季新款时尚舒适耐磨易搭运动鞋 POP S 微妙灰/墨青色', 'price' : 159, 'quantity' : 86 }, {'name' : '回力女鞋小白鞋女2020秋冬季新款加绒女鞋休闲运动鞋潮鞋百搭学生厚底板鞋紫色鞋子 米紫-皮面', 'price' : 79, 'quantity' : 88 }, {'name' : '鳄鱼恤 CROCODILE 男鞋子高帮韩版潮流板鞋时尚百搭小白鞋休闲鞋子 H80115 白灰', 'price' : 238, 'quantity' : 88 }, {'name' : '安踏板鞋男士2020冬季轻便皮面韩版潮耐磨学生跑步休闲运动鞋子小白鞋官方 -12一度灰/二度灰/姜黄(空军1号)', 'price' : 199, 'quantity' : 78 }, {'name' : '李宁男鞋板鞋男子休闲鞋小白鞋运动鞋Superwave柔软舒适透气潮流韩版低帮男鞋冬季华晨宇心选 雪白/风铃灰/标准黑', 'price' : 198, 'quantity' : 78 }, {'name' : '361度女板鞋2020秋季厚底低帮革面舒适小白鞋女 682036619F-6羽毛白/奶油色', 'price' : 178, 'quantity' : 87 }, {'name' : '回力 Warrior 休闲鞋时尚百搭小白鞋健步户外男鞋高帮板鞋 WXY-L277N 白红', 'price' : 128, 'quantity' : 88 }, {'name' : '361度运动裤男收口秋冬款加厚针织长裤子束脚修身休闲卫裤男跑步裤 基础黑/本白(女款微绒)', 'price' : 99, 'quantity' : 91 } ]); ``` 需求是根据搜索词的权重排序寻找合适的数据,本次的搜索词为:“女白鞋”,根据分词可以得出结果:“女”,“白鞋”。搜索方案是,根据上列两个词组分别给予权重:“女”权重为10,“白鞋”权重为20。但是,这个方案并不能满足需求,因为如果只拿这两个来匹配,搜索出来的内容当数据有3个“女”时权重则会比有1个“白鞋”词组的权重高,那么我的解决是,把”女白鞋“这个词组加入到搜索中,并且权重给予30。 **以下为mongodb的操作:** ```shell // 创建全文索引 db.goods.createIndex({name: 'text'}); // 管道搜索 db.goods.aggregate([ { $match: { $text: {$search: "女白鞋 白鞋 女"} } }, { $project: { id: 1, name: 1, price: 1, quantity: 1, score: { $let: { vars: { fullword: { $cond: [{$regexMatch: {input: "$name", regex: "女白鞋"}}, 30, 0] }, word1: { $cond: [{$regexMatch: {input: "$name", regex: "白鞋"}}, 20, 0] }, word2: { $cond: [{$regexMatch: {input: "$name", regex: "女"}}, 10, 0] } }, in: {$sum: ["$$fullword", "$$word1", "$$word2"]} } } } }, { $sort: { score: -1 } } ]); ``` **PHP 方法** ```php # 创建Mongo连接实例 $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017"); # 搜索词权重分配 $vars = [ "fullword" => [ ['$cond' => [['$regexMatch' => ['$input' => '$name', '$regex' => '女白鞋']], 30, 0] ], "word1" => [ ['$cond' => [['$regexMatch' => ['$input' => '$name', '$regex' => '白鞋']], 20, 0] ], "word2" => [ ['$cond' => [['$regexMatch' => ['$input' => '$name', '$regex' => '女']], 10, 0] ] ]; # 管道搜索内容 $pipeline = [ ['$match' => ['$text'=>['$search'=>["女白鞋", "白鞋", "女"]]]], ['$project' => [ 'name' => 1, 'prcie' => 1, 'quantity' => 1, 'score' => [ '$let' => [ 'vars' => $vars, 'in' => ['$sum'=>['$$fullowrd', '$$word1', '$$word2']] ] ] ], ['$sort' => ['score'=>-1]], ['$skip' => 0], ['$limit' => 5] ]; # 创建命令实例 $cmd = new \MongoDB\Driver\Command([ 'aggregate' => 'goods', 'pipeline' => $pipeline ]); ``` 本文作者: koali 原文链接: MongoDB利用aggregate在PHP下进行词组权重搜索方法 版权声明: 本站所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处! 免责声明: 文中如涉及第三方资源,均来自互联网,仅供学习研究,禁止商业使用,如有侵权,联系我们24小时内删除! MongoDB « 上一篇php上传视频自动获取封面图片 下一篇 »Docker下部署NMP 一、安装PHP及其拓展
评论0
暂时没有评论