如何在mongodb中实现部分文本匹配的相关搜索

问题描述 投票:0回答:1

假设我的mongodb集合中有一个名为products的产品列表,测试数据如下

三星手机

三星冰箱

三星洗衣机

我可以使用以下 mongo 聚合查询来激活相关搜索

db.products.aggregate(
    [{
        "$match": {
            "$and": [{
                "status": "active"
            }, {
                "delete": false
            },  { 
                "$text": { $search: "Samsung Mobile" } 
            }]
        }
    },
    { $sort: { score: { $meta: "textScore" } } }
    ]
);

问题是我无法使用部分关键字(例如“Samsun”)获得结果。这将为我提供空结果,下面给出带有空结果的完整聚合查询

db.products.aggregate(
    [{
        "$match": {
            "$and": [{
                "status": "active"
            }, {
                "delete": false
            },  { 
                "$text": { $search: "Samsun" } 
            }]
        }
    },
    { $sort: { score: { $meta: "textScore" } } }
    ]
);
mongodb search aggregate regexp-like
1个回答
0
投票

使用

$text
来搜索产品名称之类的东西太过分了,因为产品名称最多只有几个单词。在 mongodb 中,
$text
最适合产品描述或规格等内容,以便您的用户可以搜索可能出现在有关产品或评论等的短段落中的关键字。对于产品名称等内容,我会重新开始一个简单的 $ regex 来寻找部分匹配,尽管事实上你不会得到像这样的
textScore
值:

db.products.aggregate([
  {
    "$match": {
      "status": "active",
      "delete": false,
      "name": {
        $regex: "Samsun",
        $options: "i"
      }
    }
  }
])

或者,如果您不打算做进一步的

aggregate
阶段,那么一个简单的
find
就可以完成这样的工作:

db.products.find({
  "status": "active",
  "delete": false,
  "name": {
    $regex: "Samsun",
    $options: "i"
  }
})

如果您使用的是 Atlas,则可以使用

wildcard
autocomplete
进行部分匹配。 优秀的How to Run Partial Match Atlas Search Queries资源有一些节点代码示例,可以很好地解释它,但需要一些预配置。

© www.soinside.com 2019 - 2024. All rights reserved.