2011-08-19 71 views
2

我正在写一个Android应用程序,我需要快速搜索大量的文本。文字是固定的;我想要离线计算索引并将它们与应用程序一起发货。这里是搜索库的要求(数字1-5是关键):图书馆搜索Android上的非结构化文本

  1. 必须支持Unicode字符集。
  2. 搜索需要在文本中查找任意子字符串(而不仅仅是术语或术语前缀)。
  3. 搜索需要返回所有匹配。
  4. 该库应该尽可能轻量级。特别是,应该可以删除库的索引(和其他)部分,并仅使用搜索API打包应用程序。
  5. 图书馆许可证必须允许它在专有的组合作品中使用。
  6. 不需要形态分析(词干)或停用词处理。
  7. 通配符和/或正则表达式搜索会很好,但不是必需的。
  8. 接近搜索也不错。
  9. 同样布尔搜索。

FTS3(附带SQLite的)是伟大的关于要求4,但遗憾的是无法满足要求的2(它可以找到长期的前缀,但没有后缀—对“吃”可以找到“吃搜索“但不是”座位“。)

我看了一些库,包括Lucene,Minion和egothor。他们似乎都装载了我不需要的强大功能。我也有这种印象(尽管这可能是错误的),很难对这些库进行分区,只是将搜索API打包。 (我也听说很难让Lucene在Android上工作,因为它依赖于Android的Java不包括的java.rmi。)

有没有人知道一个库可以满足我需要(或可以适应)?如果库满足要求,我不反对将其他语言的搜索API移植到Java中。

+0

SQLite FTS3的自定义标记器可能对你有用吗? –

+0

@JuozasKontvainis - 我先看了一眼。有两个问题。首先,自定义标记器只能用于更改被视为标记的东西;它不能改变FTS3的基本操作。从我读到的内容来看,任何形式的标记化都不会解决基于标记的索引的基本限制:它可以用来查找标记前缀,但不能用于后缀。其次,我不知道甚至可以在Android版本的SQLite中使用自定义标记器。 –

回答

1

Apache Lucy - Lucene到C的一个松散的端口 - 可能值得一看。

+0

这很有趣,但我不知道这是我目前项目的正确方向迈出的一步。据我所知,Lucy包含了Lucene的所有功能,包括所有的索引构建基础设施。它看起来并不像看起来那么简单,因为它只用C而不是Java。另外,Java比C更适合Android应用程序(这需要使用NDK)。但知道这件事很好。谢谢。 –