数据检索/文本搜索

时间:2015-06-15 23:02:06

标签: java full-text-search search-engine information-retrieval data-retrieval

我正在研究一个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 对应的文本块的开头。

我做了:

  • 拆分文档并将它们放在单独的文件中
  • 删除停用词(and,or,while,is,are,...)
  • 用词来获取每个词的根(成就实现可实现,...全部转换为 achiv 等等)
  • 最后创建e TreeMultiMap ,如下所示:
{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]]

现在我的问题: 假设用户有兴趣知道:

  1. 哪些文件有实现和预订? (IDEA)
  2. 具有成就和技能但不是书籍和视频的文件
  3. 文件包括空气动力学
  4. 以及其他一些简单的查询
  5. 输入)所以假设她进入

    • 实现和预订
    • (实现AND技能)和(不(书和视频))
    • 气动
    • .....和其他一些简单的查询

    (的输出

    • [Doc_00562,6],[Doc_01121,5],[Doc_01151,3],[Doc_00012,2],[Doc_00001,1]
    • ....

    你可以看到可能有

    • 一些优先修饰符(我们不知道深度的括号)
    • AND,OR,NOT
    • 的优先顺序
    • 以及其他一些有趣的挑战和问题

    因此,我想针对TreeMultimap运行查询并搜索单词(键)并检索用户的值(文档列表)。

    我应该如何思考这个问题以及如何设计我的解决方案?我应该阅读哪些文章或算法?任何想法将不胜感激。 (感谢您阅读这篇长篇文章)

1 个答案:

答案 0 :(得分:1)

您使用的集合是Cranfield测试集合,我相信它有大约3000个文档。对于此大小的集合,可以将基于散列或基于trie的组织的倒置列表(您构建的数据结构)存储在内存中,以获得更大尺寸的实际集合,通常包含数百万个文档在这种情况下,你会发现很难将倒置列表完全存储在内存中。

因此,实际的解决方案不是重新发明轮子,而是利用标准的文本索引(和检索)框架,例如Lucene。这个tutorial应该可以帮助您入门。

您寻求解决的问题可以通过布尔查询来回答,您可以在其中指定布尔运算符AND,OR和NOT之间的组成项。 Lucene支持这一点。请查看API文档here和相关的StackOverflow问题here

布尔查询检索算法非常简单。对应于每个术语的列表元素(即文档ID)按排序顺序存储,以便在运行时可以计算与列表大小成线性关系的并集和交集,即O(n1 + n2) ....(这与mergesort非常相似)。 您可以在此book chapter中找到更多信息。