我遇到了问题,我认为NoSQL解决方案是答案,但我不确定。此外,我不确定哪种类型的NoSQL DB(对象,文档,图形,密钥等)最适合解决此问题。
问题:
我有两个系列。 CollectionA包含2K +字符串(域名)。 CollectionB更大,看起来像(伪)这样:
{
"To" : "address1@address1.com,address2@address2.com,there_could_be_100@more_address.com",
"Bcc" : "address1@address1.com,address2@address2.com,there_could_be_100@more_address.com",
"From" : "address1@address1.com,address2@address2.com,there_could_be_100@more_address.com",
"Subject" : "Email Subject",
"Unknown" : "NumberOfFields",
"N" : "PlusOneExtraFields",
}
的已知,
当前思路:
使用NoSQL解决方案和可能 C#动态关键字?
模糊
这是一个文档数据库能够轻松解决的问题吗?
在这种类型的数据结构中搜索/比较Map / Reduce的内容吗?
答案 0 :(得分:1)
我完全同意@HighTechRider,如果数据量与您所暗示的一样大,那么对于高性能查询来说,数据的非规范化(如您所说的那样爆炸)似乎是必须的,否则无论您使用什么产品都无关紧要选择,它最终将成为某种时尚或其他方式的自由文本扫描。
@ chx对狮身人面像的建议,似乎至少可以加速后者。但是这条路线有隐藏的成本 - 需要您捆绑,安装,管理,修补,更新等其他人的服务以及您的软件。
最小化索引和查询中的桌面资源消耗必须是高优先级,并且在桌面上设置自由文本服务器似乎与该章程有些相反。
我从基本文件系统开始 - 使用文件系统对象来表示非规范化数据。或者,如果表示和执行您的查询看起来过于复杂,那么在尝试将更多奇特的服务器目标产品放入桌面之前,请查看简单的嵌入式表库(如SQLite或SQL Compact版本)。
SQLite与SQL Compact Edition的比较很好:
SQLite还可以创建自由文本索引,以涵盖将来的某些“未知字段”场景。
至于map-reduce,它的策略对你正在接近的域有效。
答案 1 :(得分:0)
以XML格式存储并使用sphinx进行搜索。使用xmlpipe2通过像grep之类的东西来提供sphinx,只将已知字段输入其中。一旦您需要搜索更多内容,请将这些字段添加到您的过滤器和架构并重新索引。 Sphinx可以以这样的速度进行索引,这不会造成任何问题。也可以分发。
你正在呼吁进行文本搜索,这意味着solr或sphinx以及两个狮身人面像之间更容易在Windows桌面上进行设置。
答案 2 :(得分:0)
我觉得这是Apache lucene.net的正确候选人。
您可以为上述指定结构创建一个lucene文档,例如
Lucene.Net.Documents.Document doc = new Lucene.Net.Documents.Document();
doc.Add( new Lucene.Net.Documents.Field(
"To",
ToData,
Lucene.Net.Documents.Field.Store.YES,
Lucene.Net.Documents.Field.Index.ANALYZED,
Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
doc.Add(new Lucene.Net.Documents.Field(
"From",
FromData,
Lucene.Net.Documents.Field.Store.YES,
Lucene.Net.Documents.Field.Index.ANALYZED,
Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
doc.Add(new Lucene.Net.Documents.Field(
"BCC",
BCCData,
Lucene.Net.Documents.Field.Store.YES,
Lucene.Net.Documents.Field.Index.ANALYZED,
Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
// Since you dont want Unknown field to be indexed, you can make it Index.NO.
doc.Add(new Lucene.Net.Documents.Field(
"Unknown",
BCCData,
Lucene.Net.Documents.Field.Store.YES,
Lucene.Net.Documents.Field.Index.NO));
但是lucene的问题是你不能在以后添加新字段或修改现有的字段结构。因此,您必须删除文档并从scracth创建新文档。
更好的方法是让所有字段都可以为未知字段编制索引。
答案 3 :(得分:0)
不,不是。它是全文搜索引擎的候选者,与“nosql”无关,无论是什么。
全文搜索引擎经常使用SQL或其中的一些变体。例如,Sphinx或Lucene。您也可以使用Microsoft的(但我不知道这是否满足您的要求,您需要检查)。