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

时间:2011-05-29 16:27:13

标签: php mysql sql search

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

两个例子是:

DB中的名字:'Rose and Crown'

可能匹配的可能搜索示例:'Rose&皇冠','玫瑰和皇冠','玫瑰和皇冠','玫瑰和皇冠'

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

可能匹配的搜索示例:'潜水员'旅馆','潜水员旅馆','潜水员旅馆'

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

表不可能超过几千行,所以一个不能扩展到数百万行的方法就可以了。输入后,给定行的名称值不会更改,因此如果需要昂贵的索引操作,则不会出现问题。

是否有现成的工具可以执行此任务?我看过Zend_Search_Lucence,但这似乎集中在文档上,而我只对搜索单个列感兴趣。

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

SELECT soundex( 'the rose & crown' ) AS soundex1, soundex( 'rose and crown' ) AS soundex2;
soundex1    soundex2
T6265   R253265

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

这是一个非常接近你想要的问题。虽然答案是PHP和MySQL,但一般原则仍然适用:

How do I do a fuzzy match of company names in MYSQL with PHP for auto-complete?

基本上你会使用SOUNDEX来获得你想要的东西。如果您需要更多功率,更长的琴弦等,您可能需要研究Double Metaphone,这是对Metaphone和SOUNDEX的改进:

http://aspell.net/metaphone/

http://www.atomodo.com/code/double-metaphone