什么是最有效的数据索引技术


10

众所周知,有一些数据索引技术,被著名的索引应用程序使用,例如Lucene(对于Java)或Lucene.NET(对于.NET),MurMurHash,B + Tree等。对于No-Sql / Object面向数据库(我尝试使用C#编写/试用),您建议使用哪种技术?

我读到有关MurMurhash-2的信息,特别是v3的评论说Murmur非常快。Lucene.Net对此也有很好的评论。但是,它们的内存占用量一般如何?是否有任何有效的解决方案比Lucene或Murmur占用更少的空间(当然,如果更快的话更可取)?还是应该编写特殊的索引结构以获得最佳结果?

如果我尝试编写自己的索引,那么是否存在可接受的良好索引编制规模,例如数据节点的1%或数据节点的5%?任何有用的提示将不胜感激。

Answers:


10

我认为您弄乱了您的问题。Lucene(我对Lucene,NET一无所知,但我想还是一样)是一个库,用于分析,拆分令牌和存储文档,以便以后可以查询和检索它们。Lucene有一个相当古老但有效的模型,它使用倒置树来查找和检索文档。在没有更多详细信息的情况下,所有文档都按标记(术语)进行拆分,并且为每个术语维护一个数据结构,该数据结构存储包含给定术语的所有文档。作为数据结构,可以使用BTree,哈希表,在最新的主要版本中,您甚至可以插入自己的数据结构。

BTree(有关更多详细信息,请参见Wikipedia页面)是一种树型数据结构,适用于处理大块数据,通常用于在磁盘上存储树状有序结构。对于内存中的其他树,性能更好。

Murmur哈希(有关更多详细信息,请参阅Wikipedia页面)是哈希表中使用的一系列哈希函数。哈希表的实现并不重要,它可以是标准链式实现,也可以是更高级的开放式哈希寻址方案。这个想法是,哈希表允许一个人从无序的一组键中快速获得一个键,并且可以回答诸如以下任务:该键是这组键的一部分吗?与此键关联的值是什么?

现在回到您的主要问题。您有一个库(Lucene),对于数据结构,这两个数据结构都在Lucene中使用。现在,您将无法用这些术语回答您的问题,因为它们是不可比较的。

但是,关于您的占地面积和性能,这是问题的一部分。首先,您必须知道需要执行哪种操作。

您是否只需要获取键的值,还是需要查找范围内的所有元素?换句话说,您是否需要订购?如果这样做,那么一棵树会有所帮助。如果不这样做,则可以使用更快的哈希表代替。

您是否有很多不适合内存的数据?如果可以,那么基于磁盘的解决方案会有所帮助(例如BTree)。如果您的数据适合内存,那么请使用最快的内存解决方案,而仅将磁盘用作存储(结构不同,简单得多)。


非常感谢Rapaio :)您给我的观点非常有用,而且使您更清楚。.由于我是.NET开发人员,对纯C语言(我开始学习)和新的,快速,可靠,可扩展的cd感到好奇当然是完全可控制的-短期内:非常激动的技术..所以我需要学习很多..要学习,我尝试阅读许多文档,但是您可以猜到我是在起点。我不知道BTree在磁盘上是否具有优势(在.Net世界中,如此多的作者对其进行了解释,例如:诸如Linked-List之类的分层数据结构。。。。。)再次谢谢您
sihirbazzz 2014年

而且,如果您允许我,直到有一个质量更高的解释/答案比您的答案/答案更好,我想接受此作为答案。而且,顺便说一句,Lucene.NET是Java的Lucene的.NET实现
sihirbazzz,2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.