5

我只是在用 mysql 做一堆测试,full text boolean mode从我的测试来看,你似乎不能在多个单词上使用减号?

例如,我有两行..

id,name
1,2011-12 Fleer Retro auto jordan non
2,1999 jordan non auto

如果我运行以下查询:

SELECT auction_id,`name`,description FROM auctions WHERE MATCH(`name`) AGAINST('+jordan +auto -non' IN BOOLEAN MODE);

两行都没有按预期显示。但是,如果我运行此查询:

SELECT auction_id,`name`,description FROM auctions WHERE MATCH(`name`) AGAINST('+jordan +auto -"non auto"' IN BOOLEAN MODE);

两行都不显示(结果相同)。行不应该1回来吗?

编辑:ft_min_word_len的设置为2并且我已禁用我的停用词文件,因此与此无关。

小提琴:http ://sqlfiddle.com/#!2/d1987/4

但是,似乎 fiddle 使用默认的停用词文件,因此用“非”词对其进行测试是行不通的。

4

2 回答 2

0

我不想这么说,但你必须使用LIKE. 下面我包含了一个查询,它将按照您希望的方式工作

SELECT auction_id,`name` FROM auctions WHERE MATCH(`name`) AGAINST('+jordan' IN BOOLEAN
MODE) AND `name` NOT LIKE('%non auto%') ;

根据 MySQL 的文档,使用全文模式的问题是:

短语搜索只要求匹配包含与短语完全相同的单词并且顺序相同。例如,“测试短语”匹配 MySQL 5.0.3 中的“测试,短语”,但之前不匹配。

这就是你遇到麻烦的原因。希望这可以帮助。编辑:至于为什么它的行为完全如此(不包括包含 auto 和 non 的东西,无论它们相对于彼此在哪里)我不知道,但似乎没有太多方法可以覆盖这种默认行为.

于 2013-06-19T18:17:35.823 回答
0

第 1 行没有返回的原因是负面行为(如排除)超过了正面行为(如包含)。例如,在安全方面的常见做法是,DENIED权限优先于权限ALLOW操作GRANT

从 MySQL 12.9.2。布尔全文搜索

注意:- 运算符仅用于排除与其他搜索词匹配的行。因此,仅包含以 - 开头的术语的布尔模式搜索返回空结果。它不会返回“除包含任何排除项的行之外的所有行。”</p>

因此任何查询,如:

 ... AGAINST('+Any_string -"any_string"' IN BOOLEAN MODE)

不会产生任何东西。

更新

-"non auto"阻止“auto”出现在搜索结果中,因为non它是一个停用词,并且被排除在搜索字符串之外。这个词被排除在搜索之外的另一个原因BOOLEAN MODE是它太短了:

如果短语不包含索引中的单词,则结果为空。例如,如果所有单词都是停用词或短于索引词的最小长度,则结果为空。

更新 2

我会坚持我上面的解释。虽然这不是你所期望的。它看起来像带减号的双引号-"term1 term2"被解释为()- 括号,而不是双引号。

此查询不返回任何内容,尽管我希望看到类似2011-12 Fleer Retro auto jordan nonand的行1999 jordan non auto。它与停用词无关。

SELECT auction_id,`name` FROM auctions 
WHERE MATCH(`name`) AGAINST('+jordan +auto -"jordan auto"' IN BOOLEAN MODE);

还有一个相关的错误#36384: Full-Text required (+) operator bug。它支持我的假设,全文搜索表达式的解析可能无法按预期工作。

于 2013-06-14T22:43:57.537 回答