【发布时间】:2011-08-19 17:31:51
【问题描述】:
我正在编写一个需要快速搜索大量文本的 Android 应用。文本是固定的;我想离线计算索引并将它们与应用程序一起发布。以下是搜索库的要求(数字 1-5 很关键):
- 必须支持 Unicode 字符集。
- 搜索需要在文本中找到任意子字符串(不仅仅是术语或术语前缀)。
- 搜索需要返回所有匹配项。
- 库应尽可能轻量级。特别是,应该可以剥离库的索引(和其他)部分,并仅使用搜索 API 打包应用程序。
- 图书馆许可必须允许将其用于专有的组合作品中。
- 无需进行形态分析(词干)或停用词处理。
- 通配符和/或正则表达式搜索会很好,但不是必需的。
- 邻近搜索也不错。
- 类似的布尔搜索。
FTS3(SQLite 附带)在要求 4 方面非常出色,但遗憾的是不能满足要求 2。(它可以找到术语前缀但不能找到后缀——搜索“eat”可以找到“eats”但不能找到“座位”。)
我查看了许多库,包括 Lucene、Minion 和 egothor。它们似乎都加载了我不需要的强大功能。我也有这样的印象(尽管这可能是错误的),很难对这些库进行分区并打包搜索 API。 (我还听说 Lucene 很难在 Android 上运行,因为它依赖 java.rmi,而 Android 的 Java 不包含该文件。)
有没有人知道一个库可以满足我的需要(或可以适应)?如果库满足要求,我不反对将搜索 API 从另一种语言移植到 Java。
【问题讨论】:
-
也许 SQLite FTS3 的自定义标记器对您有用?
-
@JuozasKontvainis - 我首先看了一下。有两个问题。首先,自定义标记器只能用于更改被视为标记的内容;它不能改变 FTS3 的基本操作。根据我的阅读,没有任何形式的标记化可以解决基于标记的索引的基本限制:它可以用于查找标记前缀,但不能用于查找后缀。其次,我不知道在 Android 的 SQLite 版本中是否可以使用自定义标记器。