【问题标题】:Match against "foo.bar" (with a full-stop/period)匹配“foo.bar”(句号/句号)
【发布时间】:2012-08-18 02:13:06
【问题描述】:

我可以在col1/col2 中使用匹配来搜索具有foobar 的行:

SELECT col1, col2
FROM some_table
WHERE MATCH (col1,col2)
      AGAINST ('+foo +bar' IN BOOLEAN MODE);

但假设我想搜索确切的短语 "foo.bar" (中间有句号)。在the docs page for Boolean Full-Text Searches 上,它没有提到句号是操作员,所以我想我可以使用:

AGAINST ('+foo.bar' IN BOOLEAN MODE);

但是,这会返回与以下相同的结果:

AGAINST ('+foo.couldBeAnything' IN BOOLEAN MODE);
AGAINST ('+foo' IN BOOLEAN MODE);
AGAINST ('+foo.*' IN BOOLEAN MODE); #Note you would expect this to look for instances of foo. followed by something, rather than just the same as foo

.

为什么这没有像我预期的那样工作?以及如何匹配foo.bar

【问题讨论】:

    标签: mysql match-against


    【解决方案1】:

    我没有现成的全文表格来测试这一点,但我相信这应该可行:

    SELECT col1, col2
    FROM some_table
    WHERE MATCH (col1,col2)
        AGAINST ('+\"foo.bar\"' IN BOOLEAN MODE);
    

    【讨论】:

    • @hayden 我的MATCH AGAINST 知识有点生疏,但我认为正在发生的事情是它只会关心“单词”,所以在你上面的例子中+foo.bar 将搜索foo 为必填,bar 为可选,+foo.couldBeAnything 相同,它将您的输入拆分为单独的单词,每个单词都需要自己的运算符。 \"foo.bar\" 只是一种工作,因为它需要 foobar 都存在,并且按顺序存在,但句号仍然被忽略。如果您想搜索单词以外的其他内容,您可能需要查看MATCH AGAINST 之外的内容,例如 regexp 或 MySQL 之外的内容。
    • 如果它是可选的,这似乎是一个多余的操作,但它可能是!使用引号,它不会相当 搜索精确的子字符串,也不会在字段中按顺序搜索单词(但也许它在多个列上是按顺序排列的?)。这是令人惊讶的。我在想我会对正则表达式有更多的控制权,所以最终可能会这样做。
    • @hayden 句点不是运算符,它被认为等同于空格,就像逗号、感叹号等其他东西一样。所以它将foobar 视为两个单独的词。我认为这是你问题的根源。 FULLTEXT 的想法是真正搜索单词。
    • 我没有意识到这一点!谢谢。
    【解决方案2】:

    要完成这项工作,您需要用双引号括住您的文字:"bar.foo", 因为该点可能等同于 运算符。

    【讨论】:

    • 它不是 or 运算符,因为 +foo.couldBeAnything+foo 的工作方式相同。
    • 您好,我认为这里有一个混淆,正如文档中所描述的那样,or 运算符包括两种情况,当字符串存在或不存在时,换句话说:+foo。 anyThing = +foo 和 +foo+anyThing = +foo(第一个包括最后一个)。最好的问候
    猜你喜欢
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    相关资源
    最近更新 更多