我在sql server 2005中有一个包含xml数据类型字段的表,我在其中存储了xml内容,并且我已启用了全文搜索。
我面临的问题是搜索没有选择存储在字段中的属性值。它搜索节点上的文本输入。
这是我的问题:
select * from document_content where FREETEXT (doc_content_xml,'"2010 SKCA 136 para 46"')
在数据中我有以下xml节点,其中包含此文本作为属性,但搜索结果显示0结果。
<p class="para">
<number value="2010 SKCA 136 para 46" class="num">
[46]
</number>
</p>
正在搜索标记是否像
<p class="para">
<number value="2010 SKCA 136 para 46" class="num">
2010 SKCA 136 para 46
</number>
</p>
任何帮助将不胜感激。
答案 0 :(得分:1)
据我所知,这些属性永远不会被编入索引。我和你的情况一样,我读过的任何内容都没告诉我。这是SQL全文索引在XML数据类型上的工作方式。有一个名为iFilter的东西定义了它的索引方式,并且它不能被覆盖。其他数据类型也是如此。
MS SQL服务器只会索引XML值,而只会索引“顶级且不是数字”的属性。
您可以将XML存储为SQL中的“FILE”数据类型,并实现您自己的iFilter dll,然后在SQL服务器上的Windows中注册并注册iFilter文件类型以匹配“FILE”数据类型的文件类型。这是你必须用C ++做的高级内容。
除非在XML上运行XPath查询,否则您始终可以将类型更改为varchar或任何其他将被编入索引为文本的TEXT类型。
可能会添加仅用于搜索的元数据列。 varchar(max)列中XML的副本,该列将被索引为文本。
我的XML包含您的典型密钥,值信息,其中密钥存储为属性,我无法使用Contains()访问它,因为只有值被索引。
更新: 我最终得到的解决方案是全文索引XML,然后对搜索进行2次传递。第1遍通过全文搜索缩小XML的结果。 Pass 2执行XPath查询以得到结果。这比仅执行XPath更快。