【问题标题】:Query returns different results查询返回不同的结果
【发布时间】:2011-11-08 14:24:17
【问题描述】:

我有 2 个查询(我相信它们必须返回相同数量的行:)):

1.

SELECT NAME
FROM myDataBase.myTable
WHERE CONTAINS(NAME, 'ABC')

2.

SELECT NAME
FROM myDataBase.myTable
WHERE NAME LIKE '%ABC%'

但实际上我有以下结果(例如):

对于 (1.) 查询

  • 第一次执行 (1.) 查询:980 行受影响
  • 第二次执行 (1.) 查询:996 行受影响
  • ...
  • N 次执行 (1.) 查询:1000 行受影响

对于 (2.) 查询

  • 第一次执行 (2.) 查询:1000 行受影响

所以我的问题是:为什么会这样?我做错了什么? :)

附:我是 Sql Server 的新手,它的功能,所以我明白这都是我缺乏理论,还没有找到关于这个问题的任何信息,所以决定问

【问题讨论】:

  • 您在测试这些查询时是否正在使用数据库?
  • 嗯,我猜不是,因为这里唯一的用户是我,而且我不运行任何查询。

标签: sql sql-server full-text-search sql-like


【解决方案1】:

CONTAINS 是全文谓词,根据当前语言的分词规则在全文索引中查找单词“ABC”。

LIKE 扫描列。

所以 LIKE 会找到 'XABCX' 而 CONTAINS 不会。

【讨论】:

  • 好吧,我上面写的代码是一个例子,实际上我正在处理地址,它存储在这样的表中:NameOfRegion /_NameOfDistrict_ / NameOfCity / NameOfStreet
  • 名称或地址都没有区别。但要澄清一下, CONTAINS(NAME, 'ABC') 和 LIKE '%ABC%' 不是同义词。另请注意,全文索引是异步填充的,因此,如果索引不是最新的,这可能就是您在重复执行第一个查询时看到结果数量增加的原因。
  • > 名称或地址没有区别。但是为了 > 澄清,CONTAINS(NAME, 'ABC') 和 LIKE '%ABC%' 不是同义词。是的,谢谢,我想我已经理解了差异>所以如果索引不是最新的,我刚刚完成了“开始完整填充”功能的执行(我想那件事将我的索引设置为“最新”还是我弄错了?)现在 (1.)-like-queries 似乎返回了恒定的结果。
【解决方案2】:

CONTAINS 在全文搜索引擎之外工作。

完全有可能在该查询的运行之间重建 FTS 索引。如果是这种情况,那么我会期待您看到的结果。

因此,要么不要使用 FTS,要么将 FTS 人口计划更改为更容易接受的方式。

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 2013-07-06
    • 2023-04-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    相关资源
    最近更新 更多