【问题标题】:negation with match against与匹配的否定
【发布时间】:2011-05-12 04:11:57
【问题描述】:

我想在 MySql 中使用 match against 在 state 字段中搜索那些不包含“rajasthan”的行。

我的查询是这样的:

SELECT * from member where MATCH(state) AGAINST('-rajasthan' IN BOOLEAN MODE) 

但是,它返回一个空的结果集。

这有什么问题?

【问题讨论】:

    标签: mysql match against


    【解决方案1】:

    我相信这会成功:

    SELECT 
      *
    FROM 
      Member
    WHERE 
      NOT MATCH (state) AGAINST ('+rajasthan' IN BOOLEAN MODE)
    

    来源:"Show all except" in MySQL Boolean Full-Text Searches

    小心 - 我相信这会进行全表扫描,并且此查询不会像您希望的那样从全文索引中受益。

    至于你的空结果:

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

    Source

    【讨论】:

    • 你能建议我替代查询以加快速度
    • 你可以考虑这个查询: Select * FROM Member where State not like '%rajasthan%' 但是,我的直觉告诉我这可能是相同的速度或更慢。不过可能值得一试
    【解决方案2】:

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

    因此,请尝试将 OR 1 = 1 附加到您的查询中,以便查询返回您的所有记录而无需 MATCH 运算符

    【讨论】:

    • OR 1 = 1 还将返回您尝试通过 MATCH(state) AGAINST('-rajasthan' IN BOOLEAN MODE) 排除的记录
    猜你喜欢
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多