搜索字段,忽略搜索词和字段中的空格的好方法是什么?
的例子:
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', ' ', '')