使用模糊匹配搜索单个 MySQL 文本列

pwa*_*ing 5 php mysql sql search

我有一个带有“名称”列 (VARCHAR(255)) 的 MySQL InnoDB 表,我希望用户能够搜索它,返回所有匹配的行。但是,我不能只使用 LIKE 查询,因为搜索需要允许用户输入与可用名称相似的名称(例如,以“The”为前缀,或者不知道正确的名称包含撇号)。

两个例子是:

DB 中的名称:'Rose and Crown'

应该匹配的可能搜索示例:“Rose & Crown”、“Rose and Crown”、“rose and Crown”、“The Rose and Crown”

DB 中的名称:'Diver's Inn'

应该匹配的可能搜索示例:'Divers' Inn'、'The Diver's Inn'、'Divers Inn'

我还希望能够通过“最接近的匹配”相关性对结果进行排名,尽管我不确定如何做到这一点(也许是编辑距离?)。

该表不太可能超过几千行,因此不扩展到数百万行的方法是好的。一旦输入,给定行的名称值将不会改变,因此如果需要昂贵的索引操作,那不是问题。

是否有可以执行此任务的现有工具?我看过 Zend_Search_Lucence 但它似乎专注于文档,而我只对搜索单个列感兴趣。

编辑:在 SOUNDEX 搜索中,这不会产生我想要的结果。例如:

SELECT soundex( 'the rose & crown' ) AS soundex1, soundex( 'rose and crown' ) AS soundex2;
soundex1    soundex2
T6265   R253265
Run Code Online (Sandbox Code Playgroud)

解决方案:最后我使用了 Zend_Search_Lucence ,只是假装每个名字实际上都是一个文档,这似乎达到了我想要的结果。我猜它在某种程度上是全文搜索,即使每个字符串最多只有 3-4 个单词。

OMG*_*ies 4

全文搜索 (FTS) 是您所需的数据库功能的术语。有: