在全文布尔模式下对多个单词使用减号

时间:2013-06-10 12:31:50

标签: mysql full-text-search booleanquery

我正在使用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

然而,似乎小提琴使用默认的停用词文件,因此用“非”词测试它不起作用。

2 个答案:

答案 0 :(得分:0)

第1行没有回来的原因是负面行为(如排除)取代积极行动(如包括)。 安全性的常见做法,例如,DENIED权限优先于ALLOWGRANT权限操作。

来自MySQL 12.9.2. Boolean Full-Text Searches

  

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

因此任何查询如:

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

什么都不会产生。

更新

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

  

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

更新2

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

此查询不返回任何内容,但我希望看到2011-12 Fleer Retro auto jordan non1999 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。它支持我的假设,即解析全文搜索表达式可能无法按预期工作。

答案 1 :(得分:0)

我讨厌说出来但你必须使用LIKE。下面我已经包含了一个可以按你想要的方式工作的查询

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

使用全文模式的问题是根据MySQL的docs

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

这就是你遇到麻烦的原因。希望这可以帮助。 编辑:至于为什么它的行为完全正确(排除包含auto和non的东西,无论它们彼此相对的位置)我都不知道,但似乎没有多少方法可以覆盖这个默认行为