我正在寻找一款高性能的Java模糊字符串搜索库。
有许多算法可用于查找相似的字符串,如Levenshtein距离、Daitch-Mokotoff Soundex、n-gram等。
存在哪些Java实现?它们各自的优缺点是什么?我知道Lucene,还有其他解决方案吗?还是Lucene最好?
我发现了这些东西,有人有使用它们的经验吗?
我正在寻找一款高性能的Java模糊字符串搜索库。
有许多算法可用于查找相似的字符串,如Levenshtein距离、Daitch-Mokotoff Soundex、n-gram等。
存在哪些Java实现?它们各自的优缺点是什么?我知道Lucene,还有其他解决方案吗?还是Lucene最好?
我发现了这些东西,有人有使用它们的经验吗?
Commons Lang有一个Levenshtein距离的实现。
import me.xdrop.fuzzywuzzy.*;
- Siddhartha您可以使用Apache Lucene,但根据用例情况,它可能过于繁重。对于非常简单的模糊搜索,使用它可能有点复杂,并且(如果我错了,请纠正我)它需要您构建索引。
如果您需要一个简单的在线算法(=不需要维护索引),您可以使用模糊Bitap算法。我在这里找到了一种Java实现,它的代码适合于一个相对较短的方法,并且具有几乎自解释的签名:
public static List<Integer> find(String doc, String pattern, int k)
Apache Commons的StringUtils
包含模糊字符串匹配的Levenshtein算法实现。可以将它视为String.equals
的模糊版本,而Bitap则是String.indexOf
的模糊版本,仍然使用Levenshtein距离度量。相比于使用Levenshtein逐个比较可能匹配的每个子串,它通常更有效率。
ArrayIndexOutOfBoundsException
,所以您需要将其过滤掉。我尝试在一个应用程序中使用Bimap按名称搜索内存中的人员列表。我发现Levenhstein距离为2会产生太多误报。Levenhstein距离为1效果更好,但无法检测交换两个字母的拼写错误,例如“William”和“Willaim”。我可以想到一些解决方法,例如:
ArrayIndexOutOfBoundsException
如果您要执行第2或第4项,则无论如何最好使用像Lucene这样的适当全文搜索库。
BitapOnlineSearcher
的Java实现,但需要您与Alphabet类一起使用java.io.Reader
。其Javadoc用俄语编写。SimMetrics可能是你需要的:http://sourceforge.net/projects/simmetrics/
它有几种算法可以计算不同类型的编辑距离。
Lucene是一个非常强大的全文搜索引擎,但FT搜索不完全等同于模糊字符串匹配(例如,给定一组字符串,找到最相似的候选字符串)。
Apache Lucene 是我认为唯一的选择。我不知道有什么更好的搜索库。
Apache Lucene(TM) 是一个高性能、功能齐全的文本搜索引擎库,完全用 Java 编写。它是适用于几乎任何需要全文搜索的应用程序,特别是跨平台的技术。