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

时间:2011-10-13 18:46:45

标签: java algorithm google-app-engine string-search

因此,我意识到这涵盖了大量的主题,其中的部分内容已经在StackOverflow上进行了介绍,例如this question。同样,似乎Partial String MatchingApproximate String Matching是流行的算法讨论。然而,结合使用这些想法来解决需要讨论的问题似乎非常低效。我正在寻找一种方法,将两个问题有效地结合到一个解决方案中。

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


让我们从我想要搜索的基本示例开始。请考虑以下无意义的句子:

  

隔离层在你虚伪的垃圾下面拍打主体。

如果用户搜索

  

isalatig pri

我认为这对字符串来说是一个相当不错的起始匹配,应该返回值。我们正在考虑使用的当前方法基本上分配一个值来测试可分性。基本上,有一个包含以下数据的表

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

将每个字符映射到素数(多个字符没有区别,只需要一个字符)。如果查询字符串在数据库中划分字符串,则返回值作为可能的匹配。

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

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

然后按升序对每个查询的总距离进行排序,然后将最高n值返回给进行查询的人员。


这是算法背后的基本思想,虽然这是我第一次处理这样的场景,但我意识到我可能错过了一些非常重要的东西(或者我的整个想法可能是错的)。处理我正在尝试实施的当前情况的最佳方法是什么。同样,如果AppEngine目前提供任何实用工具来解决我正在尝试做的事情,请告诉我。

1 个答案:

答案 0 :(得分:0)

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

您的方案由于同样的原因不起作用:无法索引整数,以便您可以有效地查询可被目标数整除的所有数字。其他潜在的问题包括翻译成数字的单词,这些单词太大而无法存储在固定长度的整数中,并且无法区分“出租”,“学习”和“鹿茸”。

如果我们暂时放弃您对字符串的任意前缀进行匹配的要求,那么您要搜索的是全文索引,通常使用inverted indexstemming来实现。支持全文搜索的是App Engine路线图,但尚未发布;在此期间,您的最佳选择似乎是SearchableModel,或使用外部搜索引擎,例如Google Site Search。