我们可以在SQL服务器FTS搜索中获取包含搜索结果的列吗?
Can we get the column which contains the search result in SQL server FTS search
我是 SQL 服务器的 FTS 新手。所以这可能是一个显而易见的问题,但我找不到任何答案。我想对 table 的 3 列执行搜索。我可以发出这样的查询:
SELECT 来自 TBLFTS 的 docid
其中 CONTAINS(* , 'SearchTerm')
现在这个 'SearchTerm' 可以在 C1、C2 或 C3 列中找到,我想知道这个搜索词是在哪个列中找到的。它可以在所有列中,也可以在任何一列或任意两列中。是否可以知道找到搜索文本的列?
我可以为每个可搜索的列创建新的 table,但这将涉及大量工作并且将是我最后的选择。
对此的任何帮助将不胜感激。
这似乎是一个显而易见的要求,但我也看不出如何实现它。你能单独搜索列并 UNION 结果吗?如果您希望结果在一行中,您可以像这样使用 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
您应该检查性能影响,但如果命中可以忽略不计,我也不会太惊讶。
更简单的答案:
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')
我是 SQL 服务器的 FTS 新手。所以这可能是一个显而易见的问题,但我找不到任何答案。我想对 table 的 3 列执行搜索。我可以发出这样的查询:
SELECT 来自 TBLFTS 的 docid 其中 CONTAINS(* , 'SearchTerm')
现在这个 'SearchTerm' 可以在 C1、C2 或 C3 列中找到,我想知道这个搜索词是在哪个列中找到的。它可以在所有列中,也可以在任何一列或任意两列中。是否可以知道找到搜索文本的列? 我可以为每个可搜索的列创建新的 table,但这将涉及大量工作并且将是我最后的选择。 对此的任何帮助将不胜感激。
这似乎是一个显而易见的要求,但我也看不出如何实现它。你能单独搜索列并 UNION 结果吗?如果您希望结果在一行中,您可以像这样使用 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
您应该检查性能影响,但如果命中可以忽略不计,我也不会太惊讶。
更简单的答案:
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')