1

我将此查询用于我的表中的全文搜索:

SELECT Titel FROM cmsa WHERE MATCH(Titel) AGAINST ('+"Ort" +"Berlin"' IN BOOLEAN MODE)

但结果是空的。

如果我使用

SELECT Titel FROM cmsa WHERE Titel LIKE '%Berlin%'

结果将是(不带引号):

"Ort - Berlin"

为什么全文搜索没有找到这个结果。“Ort”一词和“Berlin”一词都在条目的标题字段中。

其他全文搜索效果很好。

任何的想法?

4

3 回答 3

2

尝试不使用双引号并确保 Mysql 引擎是MYISAM

SELECT 
         Titel 
FROM 
         cmsa 
WHERE 
         MATCH(Titel) AGAINST ('+Ort +Berlin' IN BOOLEAN MODE)

一些解释

布尔模式搜索

SELECT headline, story FROM news
WHERE MATCH (headline,story)
AGAINST ('+Hurricane -Katrina' IN BOOLEAN MODE);

上述声明将与有关飓风的新闻报道匹配,但与提及卡特里娜飓风的新闻报道不匹配。

查询扩展

盲查询扩展(或自动相关性反馈)功能可用于扩展搜索结果。这通常包括更多的噪音,并导致非常模糊的搜索。

在大多数情况下,如果用户查询只返回几个结果,您将使用此操作,您可以使用 QUERY EXPANSION 再试一次,它会添加查询中常见的单词。

SELECT headline, story FROM news
WHERE MATCH (headline,story)
AGAINST ('Katrina' WITH QUERY EXPANSION);

上述查询可能会返回所有有关飓风的新闻报道,而不仅仅是包含卡特里娜飓风的新闻报道。

关于 MySQL 中全文搜索的几点:

  • 搜索不区分大小写
  • 忽略短词,默认最小长度为 4 个字符。您可以使用变量 ft_min_word_len 和 ft_max_word_len 更改最小和最大字长

  • 称为停用词的词会被忽略,您可以指定自己的停用词,但默认词包括 the, have, some - 请参阅默认停用词列表。

  • 您可以通过将变量 ft_stopword_file 设置为空字符串来禁用停用词。
  • 只有 MyISAM 存储引擎支持全文搜索。
  • 如果一个词出现在超过 50% 的行中,那么它的权重为零。这在大型数据集上具有优势,但会使小型数据集的测试变得困难。
于 2013-01-25T09:55:09.090 回答
2

我猜这是因为 MySQL 有一个服务器参数 -要包含在 FULLTEXT 索引中的单词的最小长度。此参数的默认值为 4,因此您的第一个单词Ort不包含在此索引中。您应该更改此系统参数,重新启动服务器,然后重建所有 FULLTEXT 索引。

REPAIR TABLE cmsa QUICK;
于 2013-01-25T10:27:20.280 回答
-1

您的查询对我来说非常有效。请检查您的表格是否为 MISAM,因为全文搜索仅在 myisam 引擎中工作。

于 2013-01-25T10:13:10.527 回答