java 模糊查找符串_Java中的模糊字符串搜索库

70ec96f3a8d56bcf32883c1e3b70343b.png

www说

您可以使用Apache Lucene,但根据用例,这可能是太重了。对于非常简单的模糊搜索,使用它可能有点复杂(如果我错了,请纠正我)它需要您构建索引。如果您需要一个简单的在线(=不维护索引)算法,您可以使用模糊Bitap算法。我在这里找到了Java实现。它的代码适用于一个相对较短的方法,具有几乎自我解释的签名:public static List find(String doc, String pattern, int k)Apache Commons StringUtils实现了用于模糊字符串匹配的Levenshtein算法。它可以看作是模糊版本String.equals,Bitap就像模糊版本一样String.indexOf,仍然使用Levenshtein距离测量。通常比使用Levenshtein将搜索模式与可能匹配的每个子字符串进行比较更为有效。备注:Bitap算法似乎主要用于相对较小的字母表,例如纯ASCII。事实上,我链接的Simon Watiau版本会抛出ArrayIndexOutOfBoundsException非ASCII字符(> = 128),因此您必须将这些字符过滤掉。我尝试在应用程序中使用Bimap按名称搜索内存中的人员列表。我发现Levenhstein距离为2会产生太多误报。Levenhstein距离为1可以更好地工作,但它无法检测到您交换两个字母的错字,例如“William”和“Willaim”。我可以想出几种方法来解决这个问题,例如仅在精确搜索未找到匹配项时进行模糊搜索(并向用户显示有关此内容的消息)调整Bitap使用Damerau-Levenshtein距离,其中交换距离为1而不是2.根据维基百科,这是可能的,但我找不到Java中的现有实现。而不是“包含”做一个“startsWith”。在模糊搜索工具包含Damerau -莱文斯坦的前缀版本,但它给了我一个ArrayIndexOutOfBoundsException调整算法以引入搜索结果排名,其中精确匹配得分更高如果您打算做2或4,最好使用像Lucene这样的正确的全文搜索库。有关模糊搜索的更多信息,请访问此博客。它的作者还创建了一个在Java中实现所谓的BitapOnlineSearcher,但需要您使用java.io.Reader与字母一起上课。它的Javadoc是用俄语写的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值