【问题标题】:Charindex vs Contains delivering very different resultsCharindex vs Contains 提供非常不同的结果
【发布时间】:2013-02-03 10:29:46
【问题描述】:

我正在运行两个查询,它们应该在我们的 CV 数据库表上做同样的事情:

  1. CONTAINS(全文索引表-cv、fullname等都包含在索引中)

     SELECT COUNT(1) 
     FROM [CVDatabase] 
     WHERE CONTAINS ((CVText, fullname, city, CompanyName, jobTitle, targetJobTitle),'"cost accountant*"') AND (Country='South Africa')
    

    结果数:300

  2. CHARINDEX(未编入索引)

    SELECT COUNT(1) 
    FROM [CVDatabase] 
    WHERE (CHARINDEX ('cost accountant', cvtext) > 0 OR 
           CHARINDEX ('cost accountant', fullname) > 0 OR 
           CHARINDEX ('cost accountant', city) > 0 OR
           CHARINDEX ('cost accountant', companyname) > 0 OR
           CHARINDEX ('cost accountant', jobtitle) > 0 OR
           CHARINDEX ('cost accountant', targetjobtitle) > 0) 
      AND (Country = 'South Africa')
    

    结果数:339

这是超过 10% 的差异。自然CHARINDEX 与捕获“成本会计师”、“成本会计师”(CONTAINS 也将使用通配符捕获)。差异可能来自“成本会计”之前的字符,CHARINDEX 将捕获但不是CONTAINS - 但我想不出任何在“成本”一词之前有意义的字符。

索引是否可能有问题,并且它没有获取所有结果?它被设置为跟踪自动更改,因此它应该正确索引。

【问题讨论】:

  • 这是 SQL Server 吗?请适当标记。

标签: sql contains


【解决方案1】:
  1. 所有这些行都被索引了吗?

  2. SQL FT 会将文本拆分为单词,因此它不会找到“xyzcost accountant”,但这可能没问题。不过,如果您搜索“成本会计”(即没有通配符)会发生什么?

  3. Here 是有关如何检查索引过程是否已完成的一些详细信息。请注意,如果它没有您的查询仍然运行但产生不一致的结果(即更少的结果)。这是因为 FT 的设计者希望使系统能够在不停机的情况下更新和插入新数据,但可能会发生一些数据丢失。

  4. msdn 上的examples 未显示如何将短语搜索与通配符结合使用。也许您可以改用“NEAR”?

【讨论】:

  • 1) 是 - 所有这些行都已编入索引。
  • 2) 270 个结果 3) 我得到一个空闲响应
  • 为拆分响应道歉-我的机器做奇怪的事情!另外 - 非常感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 2020-08-20
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
  • 2020-09-06
相关资源
最近更新 更多