我正在使用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
然而,似乎小提琴使用默认的停用词文件,因此用“非”词测试它不起作用。
答案 0 :(得分:0)
第1行没有回来的原因是负面行为(如排除)取代积极行动(如包括)。 安全性的常见做法,例如, DENIED
权限优先于ALLOW
或GRANT
权限操作。
来自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 non
和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。它支持我的假设,即解析全文搜索表达式可能无法按预期工作。
答案 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的东西,无论它们彼此相对的位置)我都不知道,但似乎没有多少方法可以覆盖这个默认行为