【问题标题】:How can operators be used with phrases in MySQL's boolean mode?MySQL 的布尔模式下如何将操作符与短语一起使用?
【发布时间】:2014-05-06 11:11:34
【问题描述】:

我一直在查看 MySQL documentation 中布尔全文搜索的示例,但它们并没有为我提供足够的信息来自信地使用运算符(特别是 +- 和 @ 987654324@) 与短语(而不是单个单词)结合使用。 StackOverflow 上有很多关于使用布尔模式的问题,但都非常具体。

MySQL Boolean Full-Text Searches 文档中没有任何内容说明运算符是否(如果可以,如何)可以与短语一起使用。例如,当我使用以下查询时,MySQL 不会抱怨:

SELECT * AS relevance FROM deliverables WHERE MATCH(title,description) AGAINST('+"customer engagement" vendor' IN BOOLEAN MODE)

这表明语法是有效的,但它返回的匹配项在标题或描述的任何地方都包含“客户”一词!所以加号显然没有达到预期的效果。

所以我的问题可以改写:在短语中使用运算符的规则是什么?

子问题包括:

  • +"some phrase" 有效吗? (我的测试表明是这样,但+ 可能会被忽略。)
  • -"some phrase" 有效吗? (我的测试表明是这样,而且它似乎按预期工作。)
  • "som* phrase" 有效吗? (我的测试表明是这样,但它从不匹配任何东西。)
  • "some phra*" 有效吗? (我的测试表明是这样,但它从不匹配任何东西。)

【问题讨论】:

    标签: mysql search operators


    【解决方案1】:

    如果要匹配 3 个单词,请使用以下语法:

    SELECT * FROM deliverables 
    WHERE MATCH(title,description) 
    AGAINST('+word1 +word2 +word3' IN BOOLEAN MODE);
    

    如果要匹配 1 个短语,请使用以下语法:

    AGAINST('"THIS IS MY"' IN BOOLEAN MODE);
    

    如果想要两个短语中的任何一个的结果,请使用以下语法:

    AGAINST('"THIS IS MY" "I AM NOT"' IN BOOLEAN MODE);
    

    如果您想获得任何具体结果,请分享,如果让我知道您想要的结果,那么我可以更好地帮助您。

    【讨论】:

    • 恐怕这无济于事:该查询所做的只是需要所有三个单词,而我想(例如)需要一个特定的短语。问题在于将运算符与短语而不是单词一起使用。
    • 感谢额外的 cmets。但是,它仍然没有回答我的问题,因为我希望能够要求一个特定的短语,同时可以选择包含其他单词或短语。查看原始问题中的示例,我想要求使用“客户参与”一词,并可选择包含“供应商”一词。我相信这应该写成+"customer engagement" vendor;但是,正如我所说,这并没有按预期工作。
    • 表示您希望所有行都包含“客户参与”或“供应商”。是否正确。
    • +"customer engagement" vendor 表示“客户参与度”必须存在,并且“供应商”理想情况下会存在。 "customer engagement" vendor 表示“客户参与”“供应商”都可以。
    【解决方案2】:

    我最近也在对此进行测试,并遇到了您的问题。使用 MySQL 5.5 并测试您的 4 个条件,我看到以下结果:

    +“某个短语”有效吗?

    +号被忽略,无论是否包含都返回相同的结果集。

    SELECT a.*
    FROM company a
    WHERE a.active = 1 AND MATCH(a.company) AGAINST('+"social media"' IN BOOLEAN MODE)
    

    -“某个短语”有效吗?

    - 号有效,但即使有匹配结果,搜索也会返回 0 个结果。

    SELECT a.*
    FROM company a
    WHERE a.active = 1 AND MATCH(a.company) AGAINST('-"social media"' IN BOOLEAN MODE)
    

    “som* 短语”有效吗?

    * 有效,但即使有匹配结果,搜索也会返回 0 个结果。

    SELECT a.*
    FROM company a
    WHERE a.active = 1 AND MATCH(a.company) AGAINST('"socia* media"' IN BOOLEAN MODE)
    

    “some phra*”有效吗?

    * 有效,但即使有匹配结果,搜索也会返回 0 个结果。

    SELECT a.*
    FROM company a
    WHERE a.active = 1 AND MATCH(a.company) AGAINST('"social medi*"' IN BOOLEAN MODE)
    

    【讨论】:

    • -"some phrase" 示例(没有其他术语)将始终不返回任何结果,因为您必须有匹配项才能从中排除结果。 (我在上面链接的 MySQL 文档说:“注意:- 运算符仅用于排除与其他搜索词匹配的行。因此,仅包含以 - 开头的词的布尔模式搜索返回一个空结果。它确实不返回“除包含任何排除项的行之外的所有行。”)
    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2011-09-12
    • 2021-06-25
    • 2017-01-12
    • 2023-03-10
    相关资源
    最近更新 更多