我将尽可能地简化它,因为数据库结构比这个复杂得多。
让我们假设存储在我的数据库中的文档具有以下结构:
[{
"items": [
"name1 , name2 , name3"
]
},
{
"items": [
"name4 , name5 , name6 , name7"
]
}]现在,为了找到一个'items‘键的值之一是"name6“的文档,我被迫使用如下所示的正则表达式:
db.collection.find({
"items": {
$regex: "name6",
$options: "i"
}
})这是因为存储在'items‘键中的项值的长度是可变的,并且总是以逗号分隔的字符串形式存储(例如"name4,name5,name6,name7")
无论如何,这样的搜索会产生所需的结果,如下所示:
[
{
"_id": ObjectId("5a934e000102030405000001"),
"items": [
"name4 , name5 , name6 , name7"
]
}
]然而,虽然这种方法可以很好地处理我的数据库中的10000个文档,但对于100万个文档,它已经很慢(+10秒),并且数据库的预期大小超过10亿个文档;在这一点上,这种方法是不可用的。
我不能轻易改变JSON的结构,因为它来自第三方提供商。那么,我还能做什么来加快搜索速度呢?
我可以创建一个序列化索引来隔离这个特定文档关键字中的值吗?或者换句话说,我是否可以单独索引存储在“items”键中的值,就像指示索引为每个项创建单独的索引一样?还有更好的方法吗?
发布于 2020-12-19 21:22:55
你可以创建一个text index on items字段,我还没有测试过,但我可以说文本搜索比$regex搜索和普通索引更好,
db.collection.createIndex({ items: "text" });db.collection.find({
$text: { $search: "name6" }
})在实现之前先阅读text index restriction!
https://stackoverflow.com/questions/64840085
复制相似问题