我需要索引大量的Java属性和清单文件。
文件中的数据只是键值对。
我正在考虑使用Lucene。
但是,我不需要任何真正的全文搜索功能,因为数据非常结构化。我只需要搜索属性值的完全匹配,并且属性键始终是已知的。不需要标记化,也没有“默认”字段。唯一属性键的数量可能非常大。
我还应该补充一点,我希望能够将索引完全保存在内存中(在Lucene中将是一个RAMDirectory)。
那么,Lucene(主要是一个全文搜索引擎)仍然是一个很好的匹配,还是其他更合适的东西呢?
更新 一个简单的HashMap不会这样做,因为我想找到将属性A定义为值B的文件。它至少需要一个嵌套的HashMap来保存三元组(Key,Value,Filename)。
答案 0 :(得分:2)
是的,每个键带有非标记化字段的Lucene索引可以解决这个问题。这也有点过分,某些地图结构可能足以满足您的描述。
在这里使用Lucene的主要好处是它将细节抽象为一个相当简单的API。
答案 1 :(得分:0)
我将从一个简单的HashMap开始,如果你遇到内存问题,那么转向像Lucene这样更复杂的东西。你会对HashMap的效率感到惊讶。
如果你想开始真的很简单,只需使用Properties对象本身 - 它就是HashTable的一个实例(参见HashMap vs HashTable)。您可以轻松使用load(Inputstream)将多个属性文件加载到一个简单对象中,然后如果您决定尝试使用HashMap,请使用new HashMap(propertiesObject)切换它。
答案 2 :(得分:0)
如果您不需要全文搜索,并且只想表示一个大的键值映射,那么我认为Lucene是不合适的。
我建议使用像EhCache这样的东西,它允许你在RAM中容纳大量数据,但是如果它变得太大,可以将其转换为磁盘文件。
答案 3 :(得分:0)
看一下jdbm - 它是一个轻量级的开源对象数据库,它有一个快速的B + Tree实现,应该适合你。如果您不需要高可靠性,则可以关闭数据库的日志部分(这会使插入更快,如果在写入过程中出现电源故障,则存在损坏数据库的风险)。
我们已经在几个生产项目中使用jdbm 4年或5年了,现在有一些非常非常大的数据集。
但是,如果你可以将整个索引保存在内存中,那么你可能最好使用TreeMap(如果你还需要进行反向索引,可以使用多个TreeMaps),如果你需要保存到磁盘,只需序列化它