【问题标题】:Why does MATCH AGAINST return different results than LIKE?为什么 MATCH AGAINST 返回的结果与 LIKE 不同?
【发布时间】:2013-10-01 02:25:30
【问题描述】:

我正在比较类似查询的结果

SELECT * FROM object_search
WHERE
    keywords LIKE '%,woman,%'
AND keywords LIKE '%,man,%'

SELECT * FROM object_search
WHERE
    MATCH (keywords) AGAINST ('+(",woman,") +(",man,")')

我本来希望得到完全相同的结果,但第一个查询输出了大约 300 个结果,而第二个查询输出了接近 3000 个结果。

两者之间有什么区别?如何使用全文功能获得相同的结果?

【问题讨论】:

  • 你能提供你的表结构吗?还有一些在第二种情况下返回的行,但不是在第一种情况下。
  • @AlmaDoMundo 似乎MATCH AGAINST 查询只需要两个关键字之一连续出现。它也是一个 InnoDB 表。
  • 我的猜测是因为manwoman 的子词,所以它与您的womanman 词有关(但它似乎不应该这样工作)。改用foobar 之类的方法 - 即不相交
  • @AlmaDoMundo 与carhouse 仍然相同。

标签: mysql sql search full-text-search sql-like


【解决方案1】:

+ 运算符用于搜索 IN BOOLEAN MODE。我认为它将在NATURAL LANGUAGE MODE(默认)中被忽略。

试试:

SELECT * FROM object_search
WHERE MATCH (keywords)
    AGAINST ('+woman +man' IN BOOLEAN MODE); -- could return rows containing both "man" and "woman" (ignoring ft_min_word_len, see below)

此外,全文索引将仅涵盖单词。标点符号(例如,)将始终被忽略。您不能“全文搜索”非字母数字字符。

最后,默认情况下,少于 4 个字符的单词会被忽略。因此,默认情况下,“man”没有被索引。可以通过ft_min_word_len 配置选项更改此限制。

另外,请注意stopwords(从未被索引的常用词)。

【讨论】:

  • @Cobra_Fast 如果仍然可能,请重新考虑您的表结构。将逗号分隔值(即非标量数据)存储在一个字段中是不好的做法。 Normalize your structure 如果可以的话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
相关资源
最近更新 更多