MySQL - 搜索忽略空格的字段

时间:2013-03-19 16:24:31

标签: php mysql phpactiverecord

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

示例:

SELECT * 
FROM tablename
WHERE NOSPACES(fieldname) LIKE '%{search term with spaces removed}%'

真实世界的例子:

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

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

3 个答案:

答案 0 :(得分:3)

我建议有很多方法,取决于你想要的简单方法。我个人会使用此处列出的原则http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

来使用全文搜索

但您也可以使用正则表达式从搜索词中删除空格,即

$str=preg_replace('/\s+/', '', $str);

答案 1 :(得分:3)

您可能还需要考虑SphinxLucene的全文,例如搜索mysql的全文。我没有亲自使用它们,但我听说两者都优于mysql内置的全文索引。

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

关于狮身人面像的好文章: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%')

这个过程不如freetext好,但对于产品名称和数字来说,它确实做得很好。

答案 2 :(得分:1)

有一种使用repace功能的方法。例如:

SELECT * FROM `products` where REPLACE(PartName, ' ', '') = REPLACE('0 1 3000 70 27', ' ', '')