搜索字段的好方法是什么,忽略搜索字词和字段中的空格?
示例:
SELECT *
FROM tablename
WHERE NOSPACES(fieldname) LIKE '%{search term with spaces removed}%'
真实世界的例子:
我的客户有一个销售长块引擎的网站。然而,他们经常让人们在他们的网站上搜索“cat 3306 longblock ”(而不是“cat 3306 long block”)。我们需要在搜索“longblock”时显示“长块”引擎。
注意:这个问题可能无关紧要,但本网站是使用PHP 5.3和phpActiverecord构建的。
答案 0 :(得分:3)
我建议有很多方法,取决于你想要的简单方法。我个人会使用此处列出的原则http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html
来使用全文搜索但您也可以使用正则表达式从搜索词中删除空格,即
$str=preg_replace('/\s+/', '', $str);
答案 1 :(得分:3)
您可能还需要考虑Sphinx或Lucene的全文,例如搜索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', ' ', '')