如何查询数据库中不相似但几乎匹配的项目

How can I go about querying a database for non-similar, but almost matching items

如何在数据库中查询不仅与样本完全相似而且几乎相似的项目?几乎作为搜索引擎工作,但只适用于小型项目,最好在 Java 中。例如:

String sample = "Sample";

我想在每次查询时检索以下所有内容 sample:

String exactMatch = "Sample";
String nonExactMatch = "S   amp   le";
String nonExactMatch_2 = "ampls";

您可以在 myisam 全文索引列中使用 match_against。

您需要用您的数据库可以理解的术语来定义相似的含义。

一些可能性包括编辑距离,例如。

在您的示例中,示例 匹配...

..."Sample",如果您搜索时不区分大小写。

..."S amp le",如果您从查询字符串和目标字符串中删除一组忽略的字符(此处仅 space)。您可以将新值存储在数据库中:

   ActualValue      SearchFor
   John Q. Smith    johnqsmith%

当有人搜索 "John Q. Smith, Esq." 时,您可以将其归结为 johnqsmithesq 和 运行

   WHERE 'johnqsmithesq' LIKE SearchFor

"ampls" 更棘手。为什么 'ampls' 与 'sample' 匹配?一个共同的子串?一些共享的字母?他们的订单是否有效(即字谜是否有效)?可能的方法有很多,但必须由您来决定。您可以使用 Levenshtein 距离,或者存储一个字符串,例如“100020010003...”,其中每个数字编码您拥有的字母数,最多 9 个(因此 3 个 C 和 2 个 B,但没有 A 会给出“023 ... ") 然后 运行 该综合症与数据库中每个术语的综合症之间的 Levenshtein 距离:

 ActualValue    Search1     Rhymes  abcdefghij_Contains  anagramOf
 John Q. Smith  johnqsmith% ith     0000000211011...     hhijmnoqst

...等等。

一种方法是问自己,我必须如何转换搜索值和搜索值,以便它们匹配?,然后继续并在代码中实现它。