我有一个集合,下面是数据:
"sel_att" : {
"Technical Specifications" : {
"In Sales Package" : "Charger, Handset, User Manual, Extra Ear Buds, USB Cable, Headset",
"Warranty" : "1 year manufacturer warranty for Phone and 6 months warranty for in the box accessories"
},
"General Features" : {
"Brand" : "Sony",
"Model" : "Xperia Z",
"Form" : "Bar",
"SIM Size" : "Micro SIM",
"SIM Type" : "Single Sim, GSM",
"Touch Screen" : "Yes, Capacitive",
"Business Features" : "Document Viewer, Pushmail (Mail for Exchange, ActiveSync)",
"Call Features" : "Conference Call, Hands Free, Loudspeaker, Call Divert",
"Product Color" : "Black"
},
"Platform/Software" : {
"Operating Frequency" : "GSM - 850, 900, 1800, 1900; UMTS - 2100",
"Operating System" : "Android v4.1 (Jelly Bean), Upgradable to v4.4 (KitKat)",
"Processor" : "1.5 GHz Qualcomm Snapdragon S4 Pro, Quad Core",
"Graphics" : "Adreno 320"
}
}
上面提到的数据太大了,字段都是动态插入的,我如何索引这些字段以获得更快的结果呢?
答案 0 :(得分:0)
在我看来,您还没有完全理解基于文档的数据库的强大功能,例如 MongoDB 。
贝娄只是一些想法:
您肯定需要的是可以将随机文本动态链接到有价值的索引,并允许您快速搜索大量文本。为此,您应该使用ElasticSearch等工具。
请注意,您可以并且应该将您的内容存储在 NoSQL 数据库中,而 MongoDB 是可行的选项。而对于索引部分 ElasticSearch 有可用的插件来增强两者之间的通信。
P.S。如果我没记错,插件名为MongoDB River
修改强>
我还为 ElasticSearch 添加了更全面的定义。自从我从维基百科上抓取它以来,我不会因此而受到赞誉:
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个 分布式,多租户能力的全文搜索引擎 RESTful Web界面和无架构JSON文档
编辑2:
我已经缩减了一些数字,因为对于大多数项目来说可能都是牵强附会。但主要想法仍然是一样的。不建议将索引用于问题中描述的用例。
答案 1 :(得分:0)
动态字段的索引很棘手。没有通配符索引。您的选择是:
选项A:每当您插入新文档时,请为其每个字段选择ensureIndex
sparse:true
。当索引已经存在时,它不会执行任何操作,并且当它是新字段时会创建一个新索引。缺点是您将最终获得大量索引,并且由于需要创建/更新所有新旧索引,插入可能会变慢。
选项B:忘记字段名称并将文档重构为键/值对数组。所以
"General Features" : {
"Brand" : "Sony",
"Form" : "Bar"
},
"Platform/Software" : {,
"Processor" : "1.5 GHz Qualcomm",
"Graphics" : "Adreno 320"
}
变为
properties: [
{ category: "General Features", key: "Brand", value: "Sony" },
{ category: "General Features", key: "Form", value: "Bar" },
{ category: "Platform/Software", key: "Processor", value: "1.5 GHz Qualcomm" },
{ category: "Platform/Software", key: "Graphics", value: "Adreno 320" }
]
这允许您在properties.category
和properties.key
上创建单个复合索引以覆盖所有数组条目。
答案 2 :(得分:0)
根据您要查询的内容,您最终会将这些字段编入索引。您还可以在MongoDB中拥有二级索引。但是要注意,创建太多索引可能会提高查询性能,但会占用额外的磁盘空间,并且由于重新编制索引会使插入速度变慢。
答案 3 :(得分:0)
简短回答:你不能。使用弹性搜索。 这是setup MongoDB River on Elastic Search
的一个很好的教程原因很简单,MongoDB不能那样工作。它可以帮助您存储复杂的无模式文档集。但是你无法索引数十个不同的领域并希望获得良好的性能。通常,每个集合最多推荐5-6个指数。
弹性搜索通常在许多其他用例中以上述方式使用,因此它是一种既定模式。例如,Titan Graph DB具有内置选项,可以将ES用于此目的。如果我是你,我会使用它,并且不会试图让MongoDB做一些它不能做的事情。
如果您有时间并且您的数据结构适合(我认为它可能来自上面的json),那么您也可以使用rdbms来分解这些部分并使用类似EAV的动态存储它们图案。弹性搜索更容易启动,并且可能更容易快速实现性能。
答案 4 :(得分:0)
嗯,有很多问题,有很多索引,这里已经讨论过了。但是,如果您需要为动态字段添加索引,则实际上是从mongo db driver创建索引。
因此,假设您使用的是Mongodb JAVA驱动程序,那么您可以创建如下索引:http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-java-driver/#creating-an-index
coll.createIndex(new BasicDBObject("i", 1)); // create index on "i", ascending
<强> PYTHON 强>
因此,当您使用任何驱动程序填充数据并找到新的字段时,您可以使用驱动程序本身触发索引创建,而不必手动执行。
P.S。:我没有尝试过,可能不合适或不可取。
希望这有帮助!