【问题标题】:Can we get the column which contains the search result in SQL server FTS search我们可以在 SQL Server FTS 搜索中获取包含搜索结果的列吗
【发布时间】:2015-01-29 10:54:50
【问题描述】:

我是 SQL Server 的 FTS 新手。所以这可能是一个显而易见的问题,但我找不到任何答案。我想对表的 3 列执行搜索。我可以触发如下查询:

从 TBLFTS 中选择 docid 其中 CONTAINS(* , 'SearchTerm')

现在这个“搜索词”可以在 C1、C2 或 C3 列中找到,我想知道在哪个列中找到了这个搜索词。它可以在所有列中,也可以在任何一列或任意两列中。是否可以知道找到搜索文本的列? 我可以为每个可搜索的列创建新表,但这将涉及大量工作,并且将是我最后的手段。 任何有关这方面的帮助将不胜感激。

【问题讨论】:

    标签: sql-server full-text-search


    【解决方案1】:

    这似乎是一个显而易见的要求,但我也看不出它是如何实现的。您能否单独搜索列并合并结果。如果您希望将结果放在一行中,您可以使用 GROUP/MAX/CASE 或 PIVOT 将它们汇总。

    ; with cte as (
        SELECT docid, 'Column1' as ColumnName from TBLFTS where CONTAINS(Column1 , 'SearchTerm')
        UNION ALL
        SELECT docid, 'Column2' as ColumnName from TBLFTS where CONTAINS(Column2 , 'SearchTerm')
        UNION ALL
        SELECT docid, 'Column3' as ColumnName from TBLFTS where CONTAINS(Column3 , 'SearchTerm')
    )
    select
        docid,
        max(case when ColumnName = 'Column1' then 1 else 0 end) as IsInColumn1,
        max(case when ColumnName = 'Column2' then 1 else 0 end) as IsInColumn2,
        max(case when ColumnName = 'Column3' then 1 else 0 end) as IsInColumn3
    from
        cte
    group by
        docid
    

    您应该检查性能影响,但如果命中可以忽略不计,我不会太惊讶。

    【讨论】:

    • 谢谢里斯。我会尝试这个解决方案。同样,还有一些工作要做,因为我希望将特定文档的信息合并到一行而不是跨越多行。但这似乎是最好的方法,因为没有直接的方法。我会将您的解决方案标记为答案。 :)
    【解决方案2】:

    更简单的答案:

    SELECT docid, 'Column1' AS ColumnName1, 'Column2' AS ColumnName2, 'Column3' AS ColumnName3 FROM TBLFTS WHERE CONTAINS(Column1 , 'SearchTerm') OR CONTAINS(Column2 , 'SearchTerm') OR CONTAINS(Column3 , 'SearchTerm')
    

    【讨论】:

    • 这不会提供所需的输出。即使仅在第一列中找到搜索文本,它也会给出所有列名。
    猜你喜欢
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多