mongodb 中的模糊搜索
今天,我们将讨论模糊搜索以及如何使用 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
的对象,传递具有 keys
和 includescore
的对象数组 personobj
和 options
以执行模糊搜索并获得结果,如上所示。
在这里,keys
指定将执行搜索的字段。includescore
是可选的,但最好有它,因为它告诉匹配分数。
如果它是 0
,程序找到完美匹配,而 1
的分数表示完全不匹配。你可以在此处找到所有选项。
最后,不要忘记关闭连接。
转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处
本文地址:
相关文章
在 mongodb shell 中列出所有数据库
发布时间:2023/05/11 浏览次数:180 分类:mongodb
-
交互式 mongo shell 提供了多个用于获取数据的选项。 本文介绍了在 mongo shell 中列出数据库的几种不同方法。
mongodb 中检查字段包含的字符串
发布时间:2023/05/11 浏览次数:1024 分类:mongodb
-
这篇文章解决了如何在 mongodb 中使用正则表达式来确定字段是否包含字符串。在 mongodb 中使用正则表达式 正则表达式 (regex) 是定义搜索模式的文本字符串。
在 mongodb 中 upsert 更新插入
发布时间:2023/05/11 浏览次数:214 分类:mongodb
-
在 mongodb 中,upsert 结合了更新和插入命令。 它可以在 update() 和 findandmodify() 操作中使用。mongodb 中的 upsert 查询 upsert 采用单个布尔参数。
如何卸载 mongodb
发布时间:2023/05/11 浏览次数:745 分类:mongodb
-
要从您的计算机中卸载 mongodb,您必须先删除 mongodb 服务、数据库和日志文件。使用这篇 mongodb 文章,您将能够从 ubuntu linux、mac 和 windows 卸载 mongodb。 请务必保留数据备份,因为一旦卸载,便
在 mongodb 中存储日期和时间
发布时间:2023/05/11 浏览次数:762 分类:mongodb
-
本 mongodb 教程解释了 date() 对象是什么以及如何使用 date() 方法对集合进行排序。 这也将帮助您找到在 mongodb 中显示和存储日期/时间的最佳方法。
mongodb 按 id 查找
发布时间:2023/05/11 浏览次数:1856 分类:mongodb
-
mongodb 中的 find by id() 函数用于获取与用户提供的 id 相匹配的文档。 如果找不到与指定 id 匹配的文档,则返回空值。
检查 mongodb 服务器是否正在运行
发布时间:2023/05/11 浏览次数:247 分类:mongodb
-
这篇 mongodb 教程将告诉您如何检查是否安装了 mongodb 以及安装的 mongodb 服务器的版本。 它在 windows、ubuntu 和 mac 等不同的操作系统中实现。
mongodb 中的分页
发布时间:2023/05/11 浏览次数:174 分类:mongodb
-
这篇文章将介绍什么是 mongodb 中的分页。 为什么在 mongodb 中需要分页以及在 mongodb 中完成分页的不同方法或方式是什么。
mongodb 从查询开始
发布时间:2023/05/11 浏览次数:186 分类:mongodb
-
在这篇 mongodb 文章中,用户将学习如何使用 $regex 进行开始查询。 它为查询中的模式匹配字符串提供正则表达式功能。