我有一个带有“名称”列(VARCHAR(255))的MySQL InnoDB表,我希望用户能够对其进行搜索,并返回所有匹配的行.但是,我不能仅使用LIKE查询,因为搜索需要允许用户输入与可用名称相似的名称(例如,以“ The”为前缀,或者不知道正确的名称包含撇号).
两个示例是:
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个字也是如此.
解决方法:
全文搜索(FTS)是您所需的数据库功能的术语.有:
WHERE MATCH(column)
AGAINST('Rose', 'Crown')
>狮身人面像(第三方)
> Lucene / SOLR(第三方)
标签:search,sql,mysql,php
来源: https://codeday.me/bug/20191102/1992444.html