索引属性文件

Posted

技术标签:

【中文标题】索引属性文件【英文标题】:Indexing properties files 【发布时间】:2009-06-23 10:06:49 【问题描述】:

我需要索引大量的 Java 属性和清单文件。

文件中的数据只是键值对。

我正在考虑为此使用 Lucene。

但是,我不需要任何真正的全文搜索功能,因为数据非常结构化。我只需要搜索属性值的完全匹配,并且属性键总是已知的。不需要标记,也没有“默认”字段。唯一属性键的数量可能非常大。

我还应该补充一点,我希望能够将索引完全保存在内存中(在 Lucene 中,这将是一个 RAMDirectory)。

那么,Lucene(主要是一个全文搜索引擎)仍然是一个很好的匹配项,还是其他更合适的东西?

更新: 一个简单的 HashMap 是不行的,因为我想找到将属性 A 定义为值 B 的文件。它至少需要一个嵌套的 HashMap 来保存三元组( Key 、 Value 、 Filename )。

【问题讨论】:

键值对的数量是否足以排除内存中的 hashmap?您可以将它们索引到嵌入式 SQL 服务器中。 是的,我想到了嵌入式 SQL。问题是我不能将键用作列,因为它们很多并且不知道它是否提前,所以它需要是一个键值映射表。 为什么要使用键作为列?只要有一个(文件、键、值)三元组。 只有三元组的键值映射表使得执行“select filename where a = ? and b = ?”这样的查询非常低效。您必须使用自连接,并且不能构建每个属性的索引。 【参考方案1】:

是的,每个键都有一个非标记化字段的 Lucene 索引可以解决问题。这也有点矫枉过正,某种地图结构可能足以满足您的描述。

在这里使用 Lucene 的主要好处是它将细节抽象成一个相当简单的 API。

【讨论】:

单个非标记字段?这不是每个属性的单独字段吗? Thilo,你说得对,我其实是误会他要找什么,正在编辑……【参考方案2】:

我会从一个简单的 HashMap 开始,如果你遇到内存问题,然后再转向更复杂的东西,比如 Lucene。你会惊讶于 HashMap 的效率。

如果您想开始非常简单,只需使用 Properties 对象本身 - 它是 HashTable 的一个实例(请参阅HashMap vs HashTable)。您可以轻松地使用load(Inputstream) 将多个属性文件加载到一个简单对象中,然后如果您决定尝试使用 HashMap 切换它使用new HashMap(propertiesObject)。

【讨论】:

问题是我有很多属性对象,而不仅仅是一个,我想在属性文件中搜索,而不是在属性文件中。我需要获取“a=b”的文件列表。 啊,这有点清楚了。我想如果你能保证唯一性,你可以将它作为文本读取,然后将每一行作为键,将文件名作为值。但我认为在这一点上某种数据库类型的解决方案会更好。【参考方案3】:

如果你不需要全文搜索,只想表示一个大的key-value map,那么我建议Lucene是不合适的。

我建议使用 EhCache 之类的东西,它可以让您将大量数据保存在 RAM 中,但如果它变得太大,可以切换到磁盘文件。

【讨论】:

它并不是一个真正的大键值映射,更像是我想要搜索的大量小键值映射集合(而不是内部)。例如,我想找到所有显示“a=b”和“c=d”的地图。【参考方案4】:

看看jdbm - 它是一个轻量级的开源对象数据库,具有适合您的快速 B+Tree 实现。如果您不需要高可靠性,您可以关闭数据库的日志部分(这会使插入速度更快,如果您在写入过程中出现电源故障,则可能会损坏数据库)。

我们已经在几个生产项目中使用 jdbm 4 或 5 年了,其中包含一些非常非常大的数据集。

但是,如果您可以将整个索引保存在内存中,则最好使用 TreeMap(或多个 TreeMap,如果您还需要进行反向索引),如果需要保存到磁盘,只需将其序列化.

【讨论】:

+1 用于嵌入式数据库。从 cmets 看来,经典的反向索引表对于用例来说已经足够了。

以上是关于索引属性文件的主要内容,如果未能解决你的问题,请参考以下文章

Java 虚拟机原理Class 字节码二进制文件分析 六 ( 属性类型 | Code 属性 | 属性名称索引 | 属性长度 | 操作数栈最大深度 | 局部变量存储空间 | 字节码长度 )

ElasticSearch框架学习倒排索引 详解

jest spyOn 无法处理索引文件,无法重新定义属性

如何从 JSON 文件数据索引子对象属性并在 YDN DB 中编写搜索查询

从 WordCount 到文档的倒排索引详解

从 WordCount 到文档的倒排索引详解