AppEngine近似部分字符串匹配算法



所以,我意识到这涵盖了广泛的主题,其中的一部分已经在StackOverflow上讨论过了,比如这个问题。类似地,部分字符串匹配和近似字符串匹配似乎是流行的算法讨论。然而,结合使用这些想法来解决需要同时讨论的问题似乎效率非常低。我正在寻找一种方法,能有效地把这两个问题结合成一个解决方案。

现在,我正在使用AppEngine与Java和持久数据存储。这有点烦人,因为它似乎没有在查询中使用任何算术使事情变得更容易,所以我目前正在考虑做一些预计算并将其作为数据库中的额外字段存储。从本质上讲,这是我和一个朋友关于如何实现一个匹配系统的想法,我或多或少希望得到一些关于如何使其更有效的建议。如果它需要被废弃,以支持已经存在的更好的东西,我也可以处理。


让我们从一个基本的例子开始,看看我想要搜索什么。考虑下面这个无意义的句子:

隔离层在你虚伪的垃圾下面欺骗主体。

如果用户搜索

isalatig pri

我认为这将是一个相当好的字符串开始匹配,并且应该返回值。我们目前正在考虑使用的方法基本上是分配一个值来测试可整除性。实际上,有一个表包含以下数据

A: 2        B: 3        C: 5
D: 7        E: 11       F: 13
...

,每个字符被映射到一个素数(多个字符没有区别,只需要一个字符)。如果查询字符串与数据库中的字符串相除,则返回可能匹配的值。

在此之后,从搜索字符串中比较未列为停止词的关键字,以查看它们是否在给定的编辑距离阈值(当前使用Levenshtein距离)下可能匹配的单词的起始子字符串。

distance("isalatig", "isolating") == 2
distance("pri", "principal") == 0 // since principal has a starting 
                                  // substring of pri it passes

然后将每个查询的总距离按升序排列,然后将最前面的n值返回给执行查询的人。


这是算法背后的基本思想,尽管这是我第一次处理这样的场景,我意识到我可能错过了一些非常重要的东西(或者我的整个想法可能是错误的)。什么是最好的方法来处理目前的情况,我正在努力实现。同样,如果AppEngine目前提供了任何实用程序来解决我的问题,请告诉我。

首先澄清一下:App Engine不允许在查询中使用算术运算,因为没有有效的方法来查询任意算术表达式的结果。当您在SQL数据库中执行此操作时,计划器将被迫选择低效的查询计划,这通常涉及逐一扫描所有候选记录。

由于同样的原因,您的方案将不起作用:没有办法索引一个整数,以便您可以有效地查询所有可被目标数整除的数字。其他潜在的问题包括翻译成数字的单词太大而无法存储在固定长度的整数中,以及无法区分"租赁","学习"one_answers"鹿角"。

如果我们暂时放弃匹配任意字符串前缀的需求,那么您正在搜索的是全文索引,这通常使用倒排索引和词干提取实现。对全文搜索的支持已经在App Engine的路线图上,但还没有发布;在此期间,您的最佳选择似乎是SearchableModel,或使用外部搜索引擎,如Google Site search。

最新更新