我想在我目前正在开发的网络应用程序中实现一个模糊搜索工具。后端是用 Java 编写的,碰巧这里大家推荐的搜索引擎Lucene也是用 Java 编写的。但是,出于以下几个原因,我回避使用它:
- 我会觉得自己完成了一些事情。
- Lucene 有很多我认为自己没有使用的功能。我想尽量减少臃肿。
- 据我了解,Lucene 的模糊搜索实现手动评估索引的每个术语的编辑距离。我觉得我想采取的方法(下文详述)会更有效。
要索引的数据可能是英语中的整组名词和代名词,所以你可以看到 Lucene 的模糊搜索方法让我感到厌烦。
我想要做的是采用基于 n-gram 的方法来解决这个问题:从数据库中读取和标记每个项目,并将它们保存到由给定 n-gram 及其位置命名的文件中的磁盘中。
例如:假设n = 3
我的文件命名方案类似于:[n-gram]_[location_of_n-gram_in_string].txt
.
该文件bea_0.txt
将包含:
bear
beau
beacon
beautiful
beats by dre
当我收到要搜索的术语时,我可以简单地将其标记为 n-gram,并使用它们及其相应的位置来读入相应的 n-gram 文件(如果存在)。然后,我可以对这组数据执行任何过滤操作(消除那些不在给定长度范围内的操作,执行编辑距离计算等),而不是对整个数据集执行此操作。
我的问题是……好吧,我想我有几个问题。
- Lucene 的模糊搜索是否有任何改进,我不知道这会使我的方法变得不必要?
- 这是实现模糊搜索的好方法(考虑到我正在处理的数据集),还是我过于简化/遗漏了什么?