我正在寻找通用倒排索引的快速内存实现。我需要的是存储具有几百万个实体的权重的特征,并使用反向索引来计算使用各种距离函数的实体之间的相似性。
我可以存储在某个快速键值存储中的实体的所有其他属性。
我希望我可以将Lucene用作倒置索引,但是无法看到我如何将文档与我自己的具有预先计算权重的自定义特征向量相关联。任何建议都将非常感谢!
谢谢。
答案 0 :(得分:4)
我一直在做类似的工作,并且发现redis'zset几乎是我需要的(虽然我现在实际上并没有使用它;我已根据内存映射文件推出了我自己的解决方案)。
基本上,zset是一组有序的键值对。
因此,每个特征的每个特征都可以有一个排序集
feature-> [{docid,score},{docid,score} ..]
即
zadd功能评分docid
redis然后有一些很好的运算符来合并,提取范围等。参见zunionstore,zrange(http://redis.io/commands/zunionstore)。
非常快(据说)和所有内存等......(虽然redis不是嵌入式数据库)。
答案 1 :(得分:1)
你看过Terrier了吗?我不太确定它是否有内存索引,但它在索引和评分方面比Lucene更具扩展性。
答案 2 :(得分:0)
Lucene允许您存储与文档相关的任何数据。它还具有一个称为“有效负载”的功能,允许您在与文档中的术语关联的索引中存储任意数据。所以我认为你想要的是将你的“特征”存储为索引中的术语,将权重存储为有效负载,你应该能够让Lucene做你想做的事。它确实有一个内存中的索引实现。
答案 3 :(得分:0)
如果您想要比较的实体对已经提前给出,并且您对成对分数感兴趣,我不认为Lucene会给您任何优势。只需在某个键值存储中查找向量并计算相似度。考虑使用稀疏矢量表示来提高空间和时间效率。
如果事先只提供了一个实体,并且您对场景等排名更感兴趣,那么Lucene可能值得一试。 正确的地方是
org.apache.lucene.search.Similarity
您应该能够根据自己的需要进行调整,并使用
将版本设置为默认版本setDefault(Similarity similarity)
我会对速度提升的期望(w.r.t.迭代所有)小心谨慎,因为它们在很大程度上依赖于稀疏性(查询)和您选择实施的评分函数。另请注意,Lucene使用两阶段检索方案,第一个布尔值("所有AND项包含?任何OR项?")然后评分通过。而对于tf.idf而言,你可能会失去其他任何得分功能。
对于有效近似最近邻搜索的更一般方法,可能值得研究LSH: