我有一个带有'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个字。
答案 0 :(得分:3)
全文搜索(FTS)是您所需的数据库功能的术语。有:
Native MySQL support (requires that the table be MyISAM)
WHERE MATCH(column)
AGAINST('Rose', 'Crown')
狮身人面像(第三方)
答案 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的改进: