我想编写一个查询来对部分单词进行搜索操作,但除了 Atlas Search 之外没有得到任何解决方案。我有一种使用正则表达式的解决方案,但是即使在我为它们创建索引之后,使用正则表达式查询也会花费更多时间。
我的文本搜索方法,我们只能提供完整的单词,这不是我们案例中的场景。
例如。 -
{$text:{$search:'Lionel Messi'}}
,它会适合莱昂内尔和梅西在田野里,但是,
如果
{$text:{$search:'ione'}}
,这是查询,那么它不会给出任何结果,因为该单词不完全匹配。
我不能在这里只使用正则表达式,因为这非常耗时,所以你有什么建议或解决方案吗?
有什么办法可以搜索部分文本吗?
提前致谢。
我尝试过搜索此问题,但没有成功,我所能得到的只是仅进行 Atlas 搜索的解决方案。
对于简单的部分文本搜索,您可以考虑 $indexOfCP ,众所周知,它的性能优于 $regex ,除非在某些情况下需要复杂的 $regex ,例如:
db.collection.aggregate([
{
$match: {
$expr: {
$gt: [
{
$indexOfCP: [
"$key",
"jump"
]
},
-1
]
}
}
}
])
或
db.collection.find(
{
$where: "this.key.indexOf('jump') >= 0"
}
).hint({key:1})
我对 MongoDB 的建议是创建一个 ngram 搜索集合。保存每个文档时都有触发器,以将记录更新插入“搜索”集合。该搜索集合将具有一个引用源 id 的“父”objectid、一个引用源集合名称的“集合”字符串,以及一个包含所有搜索属性的 ngram 的“值”字符串。
使用 mongoose,您可以为所有集合(“搜索”除外)设置一个“保存”预中间件,将字段保存到搜索集合中,并设置一个“delete/deleteMany”预中间件来清理搜索集合。然后,在您的应用程序中,当您搜索时,您将需要搜索这个单个集合并通过聚合或单独的查询提取适当的文档。
如果您使用 MongoDB.com,您可以在 Atlas 中设置触发器,而不是在应用程序中设置 mongoose。