【问题标题】:Multiple columns with ContainsTable and boolean logic with full text index具有 ContainsTable 的多列和具有全文索引的布尔逻辑
【发布时间】:2009-11-26 02:46:33
【问题描述】:

我有一个我认为是非常基本的场景,但我读到的内容听起来好像使用 SQL Server 全文目录和索引并不容易。

我有 2 列,名字和姓氏。我想支持对它们进行全文搜索,这样如果有人键入“John Smith”,则 both 匹配的人首先出现。

虽然跨多列创建索引很容易,搜索多列也很容易,但评分并不能反映多列。

SELECT [Key], Rank 
FROM CONTAINSTABLE([User], (FirstName,LastName), '<CLAUSE_HERE>')
  1. 如果 CLAUSE_HERE 是“john smith”,我不会得到任何结果,因为这两个字段中都不存在该短语。
  2. 如果是“john OR smith”,我会在任一字段中获取具有任一名称的所有用户,按无用的顺序排序。
  3. 如果是“john AND smith”,我不会得到任何结果,因为两个字段都不包含这两个词。

似乎唯一的解决方案是自动生成一个查询,该查询在每个字段上运行containstable,进行一些数学运算,对分数求和等。听起来对吗?有没有更简单的方法?我的实际查询有更多字段 - 这是一个简化的示例。

【问题讨论】:

    标签: sql-server full-text-search


    【解决方案1】:

    创建一个computed column,它将您有兴趣搜索的字段(以对您的搜索格式有意义的方式)组合在一起,并对其进行全文索引。

    据我所知,由于您在问题中描述的行为,如果您想以这种方式全文阅读,这是唯一的解决方法。

    【讨论】:

    • 完全成功了!!为什么全文不自动执行此操作?我认为在多个列上应用全文会像这样开箱即用。猜不到。
    【解决方案2】:

    您需要对其进行测试,但我想知道您是否可以使用 ISABOUT() 函数对每个关键字应用权重。您的搜索子句可能类似于:

    ISABOUT(john weight(0.2), smith weight(0.8))
    

    【讨论】:

    • 不错的主意,但它不起作用。评分的工作方式似乎并没有跨列求和。所以,“John Smith”在我的测试中得到了与“John Jones”完全相同的分数。
    • 您使用的是哪个版本的 SQL Server?你有示例/测试脚本吗?
    猜你喜欢
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 2021-07-21
    • 2013-03-12
    相关资源
    最近更新 更多