迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 数据库 > MongoDB >

MongoDB 中的模糊搜索

作者:迹忆客 最近更新:2023/05/09 浏览次数:

今天,我们将讨论模糊搜索以及如何使用 MongoDB 进行模糊搜索。

我们将从使用 $regex 运算符和 $text 查询开始。此外,我们将学习使用名为 Fuse.js 的 JavaScript 库对文档进行模糊搜索。

什么是模糊搜索

使用模糊搜索,我们可以搜索不完全匹配但紧密匹配的文本。即使搜索词拼写错误,查找相关结果也很有用。

例如,即使输入错误,谷歌也会向我们显示与我们的搜索词相关的各种网页。使用正则表达式(也称为正则表达式)也是实现模糊搜索的一种非常有益且省时的方法。

在 MongoDB 中创建示例集合

我们将从基础到高级来学习模糊搜索。为了练习它,让我们创建一个名为 collection_one 的示例集合,它为每个文档都有一个字段,即 name

_id 是自动创建的;我们不必创造它。你可以使用以下查询来执行相同的操作。

示例代码:

> db.createCollection('collection_one')
> db.collection_one.insertMany([
    { name : 'Mehvish Ashiq'},
    { name : 'Jennifer Johnson'},
    { name : 'Natalie Robinson'},
    { name : 'John Ferguson'},
    { name : 'Samuel Patterson'},
    { name : 'Salvatore Callahan'},
    { name : 'Mikaela Christensen'}
])
> db.collection_one.find()

输出:

{ "_id" : ObjectId("62939a37b3a0d806d251ddae"), "name" : "Mehvish Ashiq" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddaf"), "name" : "Jennifer Johnson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb0"), "name" : "Natalie Robinson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb1"), "name" : "John Ferguson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb2"), "name" : "Samuel Patterson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb3"), "name" : "Salvatore Callahan" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb4"), "name" : "Mikaela Christensen" }

使用 $regex 运算符在 MongoDB 中执行模糊搜索

示例代码:

> db.collection_one.find({"name": /m/})

输出:

{ "_id" : ObjectId("62939a37b3a0d806d251ddb2"), "name" : "Samuel Patterson" }

在这段代码中,我们对 name 字段执行模糊搜索,并检索 name 字段包含字母 m 的所有文档。

如你所见,我们只有一个包含 m 字母的记录,但还有两个以 M(大写字母)开头的文档。为了处理这个问题,我们可以使用如下的 i 修饰符,它执行不区分大小写的搜索。

示例代码:

> db.collection_one.find({"name": /m/i})

输出:

{ "_id" : ObjectId("62939a37b3a0d806d251ddae"), "name" : "Mehvish Ashiq" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb2"), "name" : "Samuel Patterson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb4"), "name" : "Mikaela Christensen" }

它表明正确设计的正则表达式非常重要;否则,我们可能会得到误导性的结果。我们也可以通过以下方式来做同样的事情。

示例代码(不区分大小写的搜索):

> db.collection_one.find({'name': {'$regex': 'm','$options': 'i'}})

输出:

{ "_id" : ObjectId("62939a37b3a0d806d251ddae"), "name" : "Mehvish Ashiq" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb2"), "name" : "Samuel Patterson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb4"), "name" : "Mikaela Christensen" }

类似地,我们可以得到所有 name 以两个字母组合结尾的文档作为 on

示例代码:

> db.collection_one.find({name:{'$regex' : 'on$', '$options' : 'i'}})

输出:

{ "_id" : ObjectId("62939a37b3a0d806d251ddaf"), "name" : "Jennifer Johnson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb0"), "name" : "Natalie Robinson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb1"), "name" : "John Ferguson" }
{ "_id" : ObjectId("62939a37b3a0d806d251ddb2"), "name" : "Samuel Patterson" }

使用 $text 查询在 MongoDB 中执行模糊搜索

$text 查询不适用于我们名为 collection_one 的示例集合,因为它没有文本索引。因此,我们按如下方式创建索引。

示例代码:

> db.collection_one.createIndex({name:"text"});

如果指定的集合不存在,上面的语句也会创建它。请记住,我们可以在一个或多个用逗号分隔的字段上创建索引。

请参阅以下示例。

db.collection_name.createIndex({name:"text", description:"text"});

创建索引后,我们可以进行模糊搜索,如下所示。

示例代码:

> db.collection_one.find({ $text: { $search: "Mehvish" } } )

输出:

{ "_id" : ObjectId("62939a37b3a0d806d251ddae"), "name" : "Mehvish Ashiq" }

使用 JavaScript 的 Fuse.js 库在 MongoDB 中执行模糊搜索

示例代码(fuzzysearch.js 文件代码):

const Fuse = require('fuse.js')
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;
    var dbo = db.db("FuseFuzzySearch");

    var personObj = [
        { name : 'Mehvish Ashiq'},
        { name : 'Jennifer Johnson'},
        { name : 'Natalie Robinson'},
        { name : 'John Ferguson'},
        { name : 'Samuel Patterson'},
        { name : 'Salvatore Callahan'},
        { name : 'Mikaela Christensen'}
    ];

    dbo.collection("person").insertMany(personObj, function(err, res) {
        if (err) throw err;
    });

    const options = {
        includeScore: true,
        keys: ['name']
    }

    const fuse = new Fuse(personObj, options);
    const result = fuse.search('jahson');
    console.log(result);
    db.close();
});

输出:

[
  {
    item: { name: 'Jennifer Johnson', _id: 6293aa0340aa3b21483d9885 },
    refIndex: 1,
    score: 0.5445835311565898
  },
  {
    item: { name: 'John Ferguson', _id: 6293aa0340aa3b21483d9887 },
    refIndex: 3,
    score: 0.612592665952338
  },
  {
    item: { name: 'Natalie Robinson', _id: 6293aa0340aa3b21483d9886 },
    refIndex: 2,
    score: 0.6968718698752637
  },
  {
    item: { name: 'Samuel Patterson', _id: 6293aa0340aa3b21483d9888 },
    refIndex: 4,
    score: 0.6968718698752637
  }
]

在这个代码示例中,我们首先导入了 fuse.js 库。接下来,我们连接到 MongoDB。

如果由于任何原因未连接,则抛出错误。否则,创建一个名为 FuseFussySearch 的数据库。

然后,创建一个名为 personObj 的对象,其中包含我们要插入到 person 集合中的所有文档。如果在插入数据时出现任何问题,将会产生错误。

创建 Fuse 的对象,传递具有 keysincludeScore 的对象数组 personObjoptions 以执行模糊搜索并获得结果,如上所示。

在这里,keys 指定将执行搜索的字段。includeScore 是可选的,但最好有它,因为它告诉匹配分数。

如果它是 0,程序找到完美匹配,而 1 的分数表示完全不匹配。你可以在此处找到所有选项。

最后,不要忘记关闭连接。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

比较 MongoDB 中的字段

发布时间:2023/04/21 浏览次数:51 分类:MongoDB

在本文中,我们将了解如何比较 MongoDB 中的两个字段。 此外,我们将看到一个相关的示例和解释,以使主题更容易理解。

清除或删除 MongoDB 中的集合

发布时间:2023/04/21 浏览次数:147 分类:MongoDB

本篇文章将告诉大家如何删除 MongoDB 数据库中的集合以及删除 MongoDB 中的集合的不同方法。

MongoDB 截断集合

发布时间:2023/04/21 浏览次数:178 分类:MongoDB

可以根据需要选择两个选项之一来截断下面的集合。 在今天的文章中,我们将学习如何在 MongoDB 中截断集合。

删除 MongoDB 中的重复项

发布时间:2023/04/21 浏览次数:151 分类:MongoDB

在本文中,我们将了解如何删除 MongoDB 中的重复条目,并且我们还将看到一个带有适当解释的示例,以使主题更容易理解。

使用 NodeJS 检查 MongoDB 中是否存在集合

发布时间:2023/04/21 浏览次数:194 分类:MongoDB

在本文中,我们将检查 MongoDB 数据库中是否存在一个集合,并且我们还将查看与主题相关的示例,以使主题更容易理解。 为此,我们将使用 Node.js。

MongoDB 中的唯一索引

发布时间:2023/04/21 浏览次数:144 分类:MongoDB

在这篇教学文章中,您将了解唯一索引、它们是什么以及如何在 MongoDB 中使索引唯一。 此外,还简要详细地解释了使用户的电子邮件在 MongoDB 中唯一。

在 MongoDB 中创建索引

发布时间:2023/04/21 浏览次数:104 分类:MongoDB

索引有助于有效解决查询。 如果没有索引,MongoDB 必须遍历集合中的每个文档才能找到与查询匹配的文档。因此,在今天的文章中,我们将学习如何在 MongoDB 中创建索引。

MongoDB 中的稀疏索引

发布时间:2023/04/21 浏览次数:142 分类:MongoDB

在本文中,我们将讨论 MongoDB 中的稀疏索引。 此外,我们将提供一个相关示例并进行解释,以使该主题更容易理解。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便