6

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

例子:

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

真实世界的例子:

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

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

4

3 回答 3

3

我建议有多种方法,具体取决于您想要实现的简单程度。我个人会使用此处列出的原则使用全文搜索http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

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

$str=preg_replace('/\s+/', '', $str);
于 2013-03-19T16:30:41.610 回答
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%')

这个过程不如自由文本好,但它对产品名称和编号的效果相当好。

于 2013-03-19T17:47:10.897 回答
1

有一种使用替换功能的方法。例子:

SELECT * FROM `products` where REPLACE(PartName, ' ', '') = REPLACE('0 1 3000 70 27', ' ', '')
于 2015-04-14T08:38:26.850 回答