【发布时间】:2017-08-03 06:32:48
【问题描述】:
我有一个非常大的字符串列表,存储在 NoSQL 数据库中。传入的查询是一个字符串,我想检查这个字符串是否在列表中。在完全匹配的情况下,这非常简单。该 NoSQL DB 可能将字符串作为主键,我将检查是否有任何记录以该字符串作为主键。但我还需要检查模糊匹配。
有一种方法可以遍历该列表中的每个字符串并检查输入字符串与列表中的字符串的 Levenshtein 距离,但是这种方法将导致 O(n) 复杂度并且列表的大小非常大(1000 万)甚至可能增加。这种方法会导致我的解决方案的延迟更高。
有没有更好的方法来解决这个问题?
【问题讨论】:
-
搜索模糊字符串总是很复杂。它会导致高度复杂性,我认为没有真正好的解决方案可以避免这种情况。搜索前是否可以纠正模糊字符串?但是您使用哪个非sql数据库。其中一些提供了模糊字符串的搜索功能。或者你应该尝试使用像 ElasticSearch 这样的搜索引擎
-
为什么不用Soundex或Metaphone之类的语音算法。你可以试试看。
-
Apache commons-text 库提供了一些例程来执行此操作,例如余弦距离,但听起来您至少希望为此使用嵌入式 Lucene。即使使用 Lucene,Levenshtein 距离搜索的成本也很高,尽管 Lucene 对此进行了改进。
-
标准方法是使用 n-gram。有关详细信息,请参阅下面的答案。
标签: java string fuzzy-search