【发布时间】:2012-08-20 15:35:54
【问题描述】:
背景
在 SQL Server 2008 中,我在名为boats 的表上的名为boatType 的列上使用全文索引。
boatType 字段包含一个以逗号分隔的船所属的boatType 列表。例如“multihull,trimaran,cruiser”。
执行搜索的我的 SQL 查询使用 CONTAINS 谓词,如下所示:
CONTAINS(boatType, '"multihull"')
问题
一切正常,直到最近我注意到没有返回特定行,但是,返回了具有完全相同数据的其他行。
短期解决方案
我尝试通过从boatType 列中删除全文索引来重建索引,然后重新添加它。我等待索引重新填充并解决了问题,即返回了所有预期的行。
什么是长期解决方案?
好的,所以问题在短期内得到解决,但如果这种情况发生一次,它可能会再次发生。
我假设(可能是错误的)全文索引上的“更改跟踪 = 自动”设置意味着对数据的任何更新都会导致索引的自动更新。
我没有设置任何人口计划,因为我假设如果我使用“更改跟踪 = 自动”,我不需要这样做。再说一次,也许我错了。
为了支持我的上述假设,添加到数据库或更改的新数据似乎确实会触发索引的更新,因为应该出现在搜索中的大多数行确实出现了。这只是少数。
这里最好做什么?
【问题讨论】:
-
也许更适合 DBA,因为这是一个非常集中的问题。
-
理想情况下(好吧,正确地)你不应该用逗号分隔的列表来表示船的类型。我有一个船型表和一个船和船型之间的多对多映射表。
-
我同意@pst。我有一个建议(这不是一个答案,所以我把它写成评论:为船类型创建一个查找表,然后创建一个连接表或用整数 ID 替换逗号分隔的文本并使用拆分函数因此您可以在该列上使用内部联接。
-
提示:我认为您不应该将船存储为逗号分隔。您最好通过创建表船(boatId,boatName,...,ownerId)来规范这种关系。虽然这不是您问题的答案。
-
我同意当前的表格结构并不完美。
标签: sql-server-2008 full-text-search contains