【问题标题】:SQL Full text search Contains commandSQL 全文搜索 包含命令
【发布时间】:2013-07-16 08:38:52
【问题描述】:

我试图弄清楚为什么这两个语句的行为不同

选择不同的 FIELD1、FIELD2 来自 SomeTable WHERE CONTAINS(*,'WORD1') AND CONTAINS(*,'WORD2*') AND CONTAINS(*,'WORD3') 选择不同的 FIELD1、FIELD2 来自 SomeTable WHERE CONTAINS(*,'"WORD1" AND "WORD2*" AND "WORD3"')

我正在为我的全文搜索指定所有索引字段,那么为什么第二个命令不返回任何内容,但第一个命令返回预期结果?我想在一个 CONTAINS 语句中搜索所有字段中包含 WORD1 和 WORD2 和 WORD3 的所有字段。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    看起来您的第二个语句正在搜索整个字符串 。这就是它不返回任何结果的原因。此外,如所写,第一个也是用双引号搜索 。它是否返回 的任何结果?

    【讨论】:

    • 从等式中去掉双引号,它仍然不起作用。我的意思是,这种方式不支持 CONTAINS 子句中的 MULTIPLE FIELDS。
    【解决方案2】:

    我之前遇到过这个问题,这是设计使然。请参阅此 MS 支持article

    假设您有两列 c1 和 c2。您列出的查询

    CONTAINS(*,'"WORD1" AND "WORD2*" AND "WORD3"')
    

    被解释为

    CONTAINS(c1,'"WORD1" AND "WORD2*" AND "WORD3"') or CONTAINS(c2,'"WORD1" AND "WORD2*" AND "WORD3"')
    

    所以每个单词都必须在任一列(c1 或 c2)中。如果 WORD1 在 c1 中,而 WORD3 在 c2 中,则不会返回结果。

    您的第一个查询有效,因为它被解释为

    (CONTAINS(c1,'WORD1') OR CONTAINS(c2,'WORD1')) AND (CONTAINS(c1,'WORD2*') OR CONTAINS(c2,'WORD2*')) AND (CONTAINS(c1,'WORD3') OR CONTAINS(c2,'WORD3'))
    

    在这种(第一种情况)中,不同的词可以存在于不同的列中,只要每个词都存在于至少一个列中。

    【讨论】:

    • 就是这样,现在我想知道如果没有动态 sql 我将如何做到这一点。我会有可变数量的单词。我的部分解决方案是我继续创建一个字段,将这些字段连接起来并编入索引,现在我的搜索按预期工作,但我失去了使用排名或进一步细化任何内容的能力,因为它都是一个字段。
    猜你喜欢
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多