Charindex vs Contains提供截然不同的结果

时间:2013-02-03 10:29:46

标签: sql contains

我正在运行两个应该在我们的CV数据库表上执行相同操作的查询:

  1. CONTAINS(全文索引表 - 简历,全名等都包含在索引中)

     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

  3. 这超过10%的差异。自然CHARINDEX具有捕获'成本会计','成本会计'(CONTAINS也将使用通配符捕获)。差异可能来自CHARINDEX将捕获但不会CONTAINS的'成本会计'之前的字符 - 但我无法想到在'成本'这个词之前有意义的任何字符。

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

1 个答案:

答案 0 :(得分:1)

  1. 是否所有这些行都已编入索引?

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

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

  5. msdn上的examples未显示如何将词组搜索与通配符组合。也许你可以使用“NEAR”代替?