【问题标题】:Full Text Search - Is there a way to get the column name that caused the row to be queried全文搜索 - 有没有办法获取导致查询行的列名
【发布时间】:2013-06-10 13:30:40
【问题描述】:

在 ms sql 2012 服务器中,我在几列上有一个全文搜索索引。
我使用 FREETEXTTABLE 或 CONTAINSTABLE 进行查询,如果搜索文本出现在多列而不是其他列,我的反应应该不同。
有没有办法区分或接收结果出现的列名?
谢谢。

【问题讨论】:

  • 这是一个有趣的问题。您能否提供一个简单的逻辑来说明如何根据命中的列更改结果?谢谢。

标签: c# sql sql-server sql-server-2012 full-text-search


【解决方案1】:

我假设您使用 * 选项调用 FREETEXTTABLE/CONTAINSTABLE 来搜索所有列。相反,请尝试进行多次调用,每列一个。您可以在 1 个查询中执行此操作,也可以根据具体情况作为单独的查询执行此操作。

例如(1-query 方法):

SELECT
   Case
      When (MatchesColumn1or2.[KEY] is not null) Then 'Matches Column 1 or 2'
      When (MatchesColumn3.[KEY] is not null) Then 'Matches Column 3'
   End
FROM
   FREETEXTTABLE(MyTable, (Column1, Column2), 'cat AND dog') as MatchesColumn1or2
full outer join
   FREETEXTTABLE(MyTable, Column3, 'cat AND dog') as MatchesColumn3
   on (MatchesColumn1or2.[KEY] = MatchesColumn3.[KEY])

下面是一个示例,如果您想保留原始排名值,但请注意增加的性能损失:

SELECT
   MatchAllColumns.[RANK],
   Case
      When (MatchesColumn1or2.[KEY] is not null) Then 'Matches Column 1 or 2'
      When (MatchesColumn3.[KEY] is not null) Then 'Matches Column 3'
   End
FROM
   FREETEXTTABLE(MyTable, *, 'cat AND dog') as MatchAllColumns
left join
   FREETEXTTABLE(MyTable, (Column1, Column2), 'cat AND dog') as MatchesColumn1or2
   on (MatchAllColumns.[KEY] = MatchesColumn1or2.[KEY])
left join
   FREETEXTTABLE(MyTable, Column3, 'cat AND dog') as MatchesColumn3
   on (MatchAllColumns.[KEY] = MatchesColumn3.[KEY])

【讨论】:

  • 谢谢。做得好。这确实是一个非常有趣的答案。在结束这个问题之前,我想看看是否还有其他选择,因为我的表很大并且已经变平,这需要另一个完全外部连接,这可能非常昂贵。
  • 我同意,这可能很贵。我也有兴趣查看其他解决方案。但是,我不相信在调用 FREETEXTTABLE 或 CONTAINSTABLE 时有任何方法可以知道匹配的列。
  • 问题:有没有办法按排名排序。如果我不能按相关性排序,恐怕我与这个选择结果无关。通过在开头添加“SELECT MatchesColumn1or2.RANK,MatchesColumn3.RANK”,我看到了两个不同的等级。由于在文档中提到排名仅对表的单个查询有效/相关,我想我不能合并它们
  • 没错,您不能将这些结果结合起来获得一致的排名。我发布了第二个示例来帮助您实现这一目标,但从性能角度来看它可能并不理想。我认为您的答案不会有一个简单的解决方案,因为 SQL Server 本质上并不支持您的要求。我认为您将不得不遭受性能打击(我的第二个示例),调整我的第一个示例以使排名正常化,或者查看其他搜索引擎产品。
猜你喜欢
  • 2013-06-12
  • 1970-01-01
  • 2022-01-21
  • 2018-05-24
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
相关资源
最近更新 更多