MySQL - 搜索忽略空格的字段

Jam*_*ren 5 php mysql phpactiverecord

什么是搜索字段的好方法,忽略搜索词和字段中的空格?

例:

SELECT * 
FROM tablename
WHERE NOSPACES(fieldname) LIKE '%{search term with spaces removed}%'
Run Code Online (Sandbox Code Playgroud)

现实世界的例子:

我的客户有一个销售长块发动机的网站.然而,他们经常让人们在他们的网站上搜索"cat 3306 longblock "(而不是"cat 3306 long block").当搜索"longblock"时,我们需要显示"长块"引擎.

注意:对于这个问题,它可能无关紧要,但是这个网站是使用PHP 5.3和phpActiverecord构建的.

Tim*_*ord 3

您可能还想考虑使用SphinxLucene进行全文搜索,例如对 mysql 全文进行搜索。我个人没有使用过它们,但我听说它们都优于 mysql 内置的全文索引。

所有这些方法需要注意的一件事是它们需要特殊的索引来保持更新,这会增加更多的维护和服务器开销。

关于sphinx的好文章:http://astellar.com/2011/12/replacing-mysql-full-text-search-with-sphinx/

对于产品名称或数字效果良好的免维护解决方案,只需将用户的搜索词按空格分隔,并将每个搜索词添加 LIKE '%term%' 到您的查询中即可。

此外,我创建了一个特殊的搜索字段,它是产品名称或编号,其标记按字母顺序排列,并删除了空格和符号。每次产品名称更改时,您都需要更新此字段。然后,除了针对原始字段的查询之外,我还OR针对这个新的剥离字段进行搜索。例如,如果您的产品名称类似于“cat 3306 longblock”,则创建一个product_name_search 字段并放置“3306catlongblock”。当用户搜索时3306 long-block您通过删除符号并按空格分割来处理搜索:

WHERE (other product name search clauses) OR 
    (product_name_search LIKE '%3306%' AND product_name_search LIKE '%longblock%')
Run Code Online (Sandbox Code Playgroud)

此过程不如自由文本好,但对于产品名称和编号来说效果相当好。