我正在寻找一种用于模糊字符串搜索的高性能Java库。
有很多算法可以查找相似的字符串,Levenshtein距离,Daitch-Mokotoff Soundex,n-gram等。
存在哪些Java实现?对他们有利有弊?我知道Lucene,还有其他解决方案还是Lucene最好?
我找到了这些,有没有人有经验?
我正在寻找一种用于模糊字符串搜索的高性能Java库。
有很多算法可以查找相似的字符串,Levenshtein距离,Daitch-Mokotoff Soundex,n-gram等。
存在哪些Java实现?对他们有利有弊?我知道Lucene,还有其他解决方案还是Lucene最好?
我找到了这些,有没有人有经验?
Answers:
Commons Lang实现了Levenshtein距离。
import me.xdrop.fuzzywuzzy.*;
您可以使用Apache Lucene,但是根据使用情况,这可能太重了。对于非常简单的模糊搜索,使用起来可能有点复杂,并且(如果我错了,请更正我)它需要您建立索引。
如果您需要一个简单的在线(不维护索引)算法,则可以使用模糊Bitap算法。我在这里找到了Java实现。它的代码适合于一个相对简短的方法,带有几乎不言自明的签名:
public static List<Integer> find(String doc, String pattern, int k)
Apache CommonsStringUtils
具有用于模糊字符串匹配的Levenshtein算法的实现。可以将其视为的模糊版本String.equals
,Bitap类似于的模糊版本,String.indexOf
仍然使用Levenshtein距离度量。通常,与天真地使用Levenshtein来比较搜索模式与每个可能匹配的子字符串相比,效率更高。
注意事项:
ArrayIndexOutOfBoundsException
非ASCII字符(> = 128),因此您必须将其过滤掉。我尝试在应用程序中使用Bimap来按名称搜索人员的内存列表。我发现Levenhstein距离2会产生太多误报。Levenhstein距离为1会更好,但无法检测到您在交换两个字母(例如“ William”和“ Willaim”)时出现的错字。我可以想到几种解决方法,例如
ArrayIndexOutOfBoundsException
如果您要执行2或4,则最好还是使用像Lucene这样的适当的全文本搜索库。
BitapOnlineSearcher
,但要求您将其java.io.Reader
与Alphabet类一起使用。它的Javadoc是用俄语编写的。您可能需要SimMetrics:http : //sourceforge.net/projects/simmetrics/
它有几种算法可以计算各种编辑距离。
Lucene是一个非常强大的全文本搜索引擎,但是FT搜索与模糊字符串匹配并不完全相同(例如,给定一个字符串列表,找到与某些候选字符串最相似的字符串)。
我要向Lucene添加SOLR http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters
您可以尝试Completely库,该库依赖于文本预处理来创建内存中索引,以有效回答大型数据集中的(模糊)搜索。与Lucene和其他功能齐全的文本搜索库不同,该API很小,易于上手。
我认为,Apache Lucene是唯一的方法。我不知道有什么更好的搜索库。
Apache Lucene™是完全用Java编写的高性能,全功能的文本搜索引擎库。它是一项适用于几乎所有需要全文搜索的应用程序的技术,尤其是跨平台。