Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 跨列全文搜索_Sql_Sql Server_Full Text Search - Fatal编程技术网

Sql 跨列全文搜索

Sql 跨列全文搜索,sql,sql-server,full-text-search,Sql,Sql Server,Full Text Search,很抱歉,这篇文章的标题不好,但我总结得再好不过了 最好用一个例子。假设我有一个包含两个文本列的简单表,我将忽略其他列 Id Text_1 Text_2 1 a a b 2 c a b 现在,如果我想搜索“a而不是b”,在我当前的实现中,我将返回记录1。我理解这是为什么,因为搜索条件与列Text_1匹配,而对于记录2,它与任何列都不匹配 然而,对于最终用户来说,这可能不是直观的,因为他们可能意味着在大多数情况下也要排除记录1 所以我的问题是,如果我

很抱歉,这篇文章的标题不好,但我总结得再好不过了

最好用一个例子。假设我有一个包含两个文本列的简单表,我将忽略其他列

Id    Text_1  Text_2
1     a       a b
2     c       a b
现在,如果我想搜索“a而不是b”,在我当前的实现中,我将返回记录1。我理解这是为什么,因为搜索条件与列Text_1匹配,而对于记录2,它与任何列都不匹配

然而,对于最终用户来说,这可能不是直观的,因为他们可能意味着在大多数情况下也要排除记录1

所以我的问题是,如果我想告诉SQL Server在所有列之间进行匹配,这意味着如果在任何列上都没有找到NOT部分,那么记录就不应该匹配,这可能吗

编辑:对于此示例,我的查询是这样的:

SELECT Id, TextHits.RANK Rank, Text_1, Text_2 FROM simple_table
JOIN CONTAINSTABLE(simple_table, (Text_1, Text_2), '"a" and not "b"') TextHits
ON TextHits.[KEY] = simple_table.Id
ORDER BY Rank DESC
实际查询有点复杂—更多的列、更多的联接等,但这是总体思路:


谢谢

逻辑将针对每条记录进行评估,因此如果您希望一行中一条记录的排除命中导致该行上的排除,则应使用NOT EXISTS,并将全文查询分为单独的包含部分和排除部分

SELECT  Id, 
        TextHits.RANK Rank, 
        Text_1, 
        Text_2 
FROM    simple_table
JOIN    CONTAINSTABLE(simple_table, (Text_1, Text_2), '"a"') TextHits
        ON  TextHits.[KEY] = simple_table.Id
WHERE   NOT EXISTS (SELECT  1
                    FROM    CONTAINSTABLE(simple_table, (Text_1, Text_2), '"b"') exclHits
                    WHERE   TextHits.[KEY] = exclHits.[KEY])
ORDER BY Rank DESC

逻辑将针对每个记录进行评估,因此如果您希望一行中一条记录的排除命中导致该行上的排除,则应使用NOT EXISTS并将全文查询分解为单独的包含部分和排除部分

SELECT  Id, 
        TextHits.RANK Rank, 
        Text_1, 
        Text_2 
FROM    simple_table
JOIN    CONTAINSTABLE(simple_table, (Text_1, Text_2), '"a"') TextHits
        ON  TextHits.[KEY] = simple_table.Id
WHERE   NOT EXISTS (SELECT  1
                    FROM    CONTAINSTABLE(simple_table, (Text_1, Text_2), '"b"') exclHits
                    WHERE   TextHits.[KEY] = exclHits.[KEY])
ORDER BY Rank DESC

@如蒙加。您能否提供一个您认为不正确的当前代码示例?此外,将数据库作为标记也很重要,因为不同的数据库在搜索文本方面有不同的优势。谢谢@Gordon的建议。我添加了查询和标记。有一百万个不同的示例,这是一个重复的示例:@RandomUs1r我看不出这个问题与这个问题有什么关系。请解释一下好吗?使用这些脚本中的一个在任何列中查找值,然后使用外部查询匹配返回的值并将其排除。@xurumunga。您能否提供一个您认为不正确的当前代码示例?此外,将数据库作为标记也很重要,因为不同的数据库在搜索文本方面有不同的优势。谢谢@Gordon的建议。我添加了查询和标记。有一百万个不同的示例,这是一个重复的示例:@RandomUs1r我看不出这个问题与这个问题有什么关系。请解释一下好吗?使用其中一个脚本在任何列中查找值,然后使用外部查询匹配返回的值并将其排除。谢谢@Love2Learn。就像RandomUs1r也建议的那样,似乎我需要做的就是在文章中加入排除。我必须仔细考虑一下,因为我需要支持的不仅仅是“a”而不是“b”,而且我不想让我的查询过于复杂。不过我希望它能起作用。当我有机会尝试它时,我会发回。这种方法成功了。我们的结局略有不同,但基本相同;我们没有在不存在的地方进行操作,而是在CONTAINSTABLE中选择了不存在Id的地方。。。。大家好:从查询计划的角度来看,您也可以执行“不存在”操作,只需将WHERE TextHits.[KEY]=exclHits.[KEY]更改为“WHERE simple_table.Id=exclHits.[KEY]”,但从查询计划的角度来看,这应该是相同的。很高兴你成功了。谢谢@Love2Learn。就像RandomUs1r也建议的那样,似乎我需要做的就是在文章中加入排除。我必须仔细考虑一下,因为我需要支持的不仅仅是“a”而不是“b”,而且我不想让我的查询过于复杂。不过我希望它能起作用。当我有机会尝试它时,我会发回。这种方法成功了。我们的结局略有不同,但基本相同;我们没有在不存在的地方进行操作,而是在CONTAINSTABLE中选择了不存在Id的地方。。。。大家好:从查询计划的角度来看,您也可以执行“不存在”操作,只需将WHERE TextHits.[KEY]=exclHits.[KEY]更改为“WHERE simple_table.Id=exclHits.[KEY]”,但从查询计划的角度来看,这应该是相同的。很高兴你成功了。