MySQL -搜索忽略空格的字段


MySQL - Search a field ignoring spaces

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

的例子:

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

真实世界的例子:

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

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

您可能还想考虑使用Sphinx或Lucene进行全文搜索,就像在mysql的全文上搜索一样。我个人没有使用过它们,但我听说它们都优于mysql内置的全文索引。

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

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

对于一个对产品名称或数字做得很好的免维护解决方案,只需将用户的搜索条件按空格分割,并在每个查询中添加类似的"%term%"。

另外,我创建了一个特殊的搜索字段,该字段是产品名称或编号,其标记按字母顺序排列,并去掉了空格和符号。您需要在每次产品名称更改时更新此字段。然后,除了对原始字段I的查询之外,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那么好,但它在产品名称和数字方面做得相当好。

我建议有许多方法,这取决于您想使它变得多么简单。我个人会使用全文搜索,使用这里列出的原则http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

但是你也可以使用正则表达式从搜索词中去掉空格,例如

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

有一种使用替换函数的方法。例子:

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