【问题标题】:searching mysql using php, how to produce (and, or, not) functionality in users' search string?使用 php 搜索 mysql,如何在用户的搜索字符串中产生(和,或,不)功能?
【发布时间】:2011-08-26 17:08:13
【问题描述】:

我正在网站上制作一个搜索功能,让用户搜索保存在 mysql 数据库中的值。

举个例子:

此表中有两种产品。

一个描述值为“可乐罐330ml”,另一个描述值为“雪碧罐330ml”。

现在在搜索这些项目时,假设用户输入 can 作为他们的字符串。显示这两个项目是因为它们都包含罐头。

如果用户输入可乐,可乐罐将被退回。

现在想象一下,您在数据库中拥有曾经生产过的每一罐汽水,每一罐都是一种产品。

这样的搜索功能,会有点麻烦。假设用户只想要两种产品,即可乐罐和雪碧罐。

他们需要搜索“coke OR sprite AND can AND 330ml”之类的内容

这应该只返回我的示例中使用的两种产品。

我面临的问题不是这个。我的搜索功能就像我原来的例子一样运行。我正在尝试包含某种 and,or,not 功能,但还没有完全决定这一切应该如何解决。

目前,搜索“可乐罐”将仅返回包含可乐和罐的结果。但是如果我搜索“coke sprite can”,则不会返回任何结果,因为没有包含字符串中使用的所有 3 个单词的结果。

这是查询:

$dataQuery = "
         SELECT *
         FROM `products`
         WHERE upper(`desc`)
         LIKE '%"
             . implode("%'
         AND upper(`desc`)
         LIKE '%",
             $keywords_array) 
             . "%'
         ORDER BY `desc`";

$keywords_array是用户输入的搜索字符串组成的数组,验证后代码如下:

$find = strtoupper($find); 
$find = strip_tags($find); 
$find = trim ($find);
$_SESSION['find'] = $find;
$keywords_array = explode(' ', $find);

$find是用户输入的搜索字符串的post值设置的字符串。

有没有人对完成我所解释的内容的好方法有任何想法?

如果您需要任何其他代码或更好的解释,请尽管询问!

谢谢!!

【问题讨论】:

  • 如果您使用的是 MyISAM 表,请使用允许自然语言搜索“(coke or sprite) +can”类型语法的全文索引。

标签: php mysql search


【解决方案1】:

您正在寻找mysql fulltext search,但它的默认最小字长为 4 个字符,因此如果您无法编辑服务器配置,则无法搜索“can”。

此外,它还有一个“停用词”策略,不会对出现在总数据中超过 50% 的词提供结果。

【讨论】:

  • 嗨,谢谢!这似乎是答案。你能给我一个例子,说明我应该如何重新格式化我的查询以使用全文?
  • @Black 一个简单的例子:SELECT * FROM products MATCH (desc) AGAINST ('"coke "sprite" "330ml"' IN BOOLEAN MODE)
猜你喜欢
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 2014-06-28
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多