【问题标题】:MYSQL MATCH...AGAINST returning no resultsMYSQL MATCH...AGAINST 不返回任何结果
【发布时间】:2013-05-08 13:35:48
【问题描述】:

我完全被这个迷惑了。

我目前正在开发一个电子商务网站,并且有一张桌子上摆满了测试产品。此表中有一个名为“name”的字段,它是 TEXT 类型并具有 FULLTEXT 索引。

我插入了几百行虚拟数据,每一行都插入了“测试产品”(不带引号),因为它是“名称”字段中的值。

但是,运行以下命令会返回零个结果,即使单词“产品”当前位于每一行的名称字段中。

从产品中选择名称 WHERE MATCH (name) AGAINST ('product')

我检查了服务器变量,一切都设置为默认值。最小字符为 4,停用词是默认值等。据我所知,产品不是停用词。

如果有任何我可以提供的进一步信息可能有助于找到解决此问题的方法,请告诉我。

非常感谢。

【问题讨论】:

  • SELECT name FROM Products WHERE name LIKE '%product%' ?
  • 我认为所有行共有的字符串被认为“太常见”,因此被忽略。
  • 我使用 MATCH...AGAINST 的原因是我可以建立一个强大的搜索引擎,搜索每个产品的名称和描述,最终我可以通过最相关的来订购它们. LIKE 不会获得任何接近相同的结果,因为它不会根据匹配的接近程度对结果进行排序,它只是返回具有相同相关性的所有内容。不过感谢您的回复!

标签: mysql


【解决方案1】:

MySQL documentation on Fulltext searches 开始,您的搜索查询被视为触发了停用词,因为相关字符串出现在所有行中。

当您第一次尝试时,50% 的阈值具有重要意义 全文搜索以查看其工作原理:如果您创建一个表并 只在其中插入一两行文本,文本中的每个单词 出现在至少 50% 的行中。结果,没有搜索返回任何 结果。确保插入至少三行,最好是多行 更多的。需要绕过 50% 限制的用户可以使用 boolean 搜索模式

这是Boolean Full-Text Searches的链接

【讨论】:

  • 感谢您的快速回复。这一直是我问题的答案!有趣的是,我一直在使用 match... 反对多年,但从未遇到过这个问题!再次感谢您的帮助。
  • 我对只有一行的表(测试数据)也有同样的问题。 MATCH() AGAINST() 子句返回零结果,即使该字段包含该词。在每行添加包含不同文本的两行后,搜索工作正常。感谢您的澄清。
  • 非常感谢!!该查询不适用于我的 1 或 2 行开发环境,但在生产环境中运行良好.. 好提示,谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 2013-10-01
  • 2013-10-01
  • 1970-01-01
相关资源
最近更新 更多