我正在研究一个selfProjet,因为我对数据检索感兴趣。我有一个文本文件,格式如下。
.I 1
.T
experimental investigation of the aerodynamics of a
wing in a slipstream . 1989
.A
brenckman,m.
.B
experimental investigation of the aerodynamics of a
wing in a slipstream .
.I 2
.T
simple shear flow past a flat plate in an incompressible fluid of small
viscosity .
.A
ting-yili
.B
some texts...
some more text....
.I 3
...
" .I 1 "指示与 doc ID1 和" .I 2 &#34对应的文本块的开头;表示与 doc ID2 对应的文本块的开头。
我做了:
{key: word} {Values are arraylist of docID and frequency of that word in that docID}
aerodynam [[Doc_00001,5],[Doc_01344,4],[Doc_00123,3]]
book [[Doc_00562,6],[Doc_01111,1]]
....
....
result [[Doc_00010,5]]
....
....
zzzz [[Doc_01235,1]]
现在我的问题: 假设用户有兴趣知道:
(输入)所以假设她进入
(的输出)
你可以看到可能有
因此,我想针对TreeMultimap运行查询并搜索单词(键)并检索用户的值(文档列表)。
我应该如何思考这个问题以及如何设计我的解决方案?我应该阅读哪些文章或算法?任何想法将不胜感激。 (感谢您阅读这篇长篇文章)
答案 0 :(得分:1)
您使用的集合是Cranfield测试集合,我相信它有大约3000个文档。对于此大小的集合,可以将基于散列或基于trie的组织的倒置列表(您构建的数据结构)存储在内存中,以获得更大尺寸的实际集合,通常包含数百万个文档在这种情况下,你会发现很难将倒置列表完全存储在内存中。
因此,实际的解决方案不是重新发明轮子,而是利用标准的文本索引(和检索)框架,例如Lucene。这个tutorial应该可以帮助您入门。
您寻求解决的问题可以通过布尔查询来回答,您可以在其中指定布尔运算符AND,OR和NOT之间的组成项。 Lucene支持这一点。请查看API文档here和相关的StackOverflow问题here。
布尔查询检索算法非常简单。对应于每个术语的列表元素(即文档ID)按排序顺序存储,以便在运行时可以计算与列表大小成线性关系的并集和交集,即O(n1 + n2) ....(这与mergesort非常相似)。 您可以在此book chapter中找到更多信息。