JAVA中搜索引擎的数据结构?

时间:2009-10-13 08:50:50

标签: java data-structures

我是MCS的二年级学生。我正在用Java做一个项目,我有不同的图像。为了存储说IMAGE-1的描述,我有一个名为IMAGE-1的ArrayList,类似于IMAGE-2 ArrayList IMAGE-2 n等......

现在我需要开发一个搜索引擎,我需要找到一个所有图像的描述与搜索引擎中输入的单词匹配..........

FOR EX 如果我输入“computer”,那么我应该能够找到描述中包含“computer”的所有图像。

所以我的问题是......

  

我该如何有效地做到这一点?
  我应该如何保持这些   ArrayList因为我可以拥有100个   这样...?或者我应该使用另一个   数据结构而不是ArrayList?

4 个答案:

答案 0 :(得分:2)

一个简单的实现是标记化描述,并使用Map<String, Collection<Item>>存储令牌的所有项目。

大厦:

for(String token: tokenize(description)) map.get(token).add(item)

(需要一个集合,因为可以找到令牌的多个条目。代码中缺少集合的初始化。但是这个想法应该是清楚的。)

使用:

List<Item> result = map.get("Computer")

在这种情况下,通用HashMap实现不是最有效的。当您开始遇到内存问题时,您可以查看更有效的树实现(例如radix trees - implementation)。

下一步可能是使用一些(内存中)数据库。这些可以是关系型(HSQL)或不是(Berkeley DB)。

答案 1 :(得分:1)

如果您有少量图像和简短描述(<1000字符),请将它们加载到数组中并使用String.indexOf()搜索单词(即数组中的一个条目==一个完整的图像描述) 。这对于例如少于10,000张图像来说足够有效。

使用toLowerCase()折叠字符大小写(因此用户在键入“computer”时会找到“Computer”)。 String.indexOf()也适用于简短的单词(使用“comp”查找“计算机”或“比较”)。

如果您有大量图片和详细说明和/或您希望为用户提供搜索的一些舒适感(例如Google),请使用Lucene

答案 2 :(得分:1)

没有简单易用的数据结构支持高效的全文搜索。

但你真的需要效率吗?这是桌面应用还是网络应用?在前一种情况下,不要担心效率,现代CPU可以在几分之一秒内搜索数兆字节的文本 - 只需使用String.contains()(或正则表达式以允许更灵活的搜索)查看所有描述。

如果您确实需要效率(例如,对于许多人可以同时进行搜索的网络应用),请查看Apache Lucene

对于您的ArrayLists,使用一个来描述单个图像似乎很奇怪。为什么列表,索引代表什么?行?如果是这样,除非您确实需要直接访问行,否则请使用简单的String替换列表 - 它可以包含换行符。

答案 3 :(得分:0)

我建议您使用Hashtable类或将内容组织到树中以优化搜索。