sql server 无法有效全文检索 XML【实践】

jeffertsai 2011-03-19 09:16:06
sql server全文检索问题真是头痛

最近发现在检索xml的问题

说明:1、使用sql server2005;2、将xml文件存成varbinary(max);3、全文检索使用中文;

结果发现 对xml文件的检索效果非常不好。
问题:
1、有些可以检索到第1层至第三层的属性值,但有些编码格式的索性什么都没有,什么原因呢?
2、是和编码格式直接相关吗,如果只有这个原因但是即使是编码设成utf-8? 或者gb2312也不能检索到深层的词语是为什么呢?我中英文都试过。
3、将全文检索的伪列设为.txt,立刻就能检索到深层的词了,效果不错,不很理解
4、但是问题来了,即使是设为txt,但还是和xml头文件的编码格式相关,我猜这会不会是全文检索时设置成为中文造成的呢?希望不是,因为其它编码格式的文件我也需要用到,而且顶多也是英文的而已,如果是这个原因,有没有办法对多种编码格式的文件都能检索呢。 目前初步想对这个表设两个全文索引,使用不同的检索语言,不知道行不行~

哎,希望各位帮忙解决啊,
...全文
135 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
jeffertsai 2011-03-23
  • 打赏
  • 举报
回复
忘了给小F分了,不好意思啊,下次给吧~
jeffertsai 2011-03-23
  • 打赏
  • 举报
回复
好的,谢谢啦
coleling 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jeffertsai 的回复:]

这。。。有官方说法吗?
[/Quote]

是微软技术支持部门的说法.
jeffertsai 2011-03-23
  • 打赏
  • 举报
回复
这。。。有官方说法吗?
jeffertsai 2011-03-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 coleling 的回复:]
SQL 2005较老版本中有一个BUG,就是只能索引前两层的属性值,我不确定目前是否已经修复。[/Quote]

不是吧,这样也能卖钱啊?

coleling 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fcuandy 的回复:]
跟编码自然是有关系, 因为全文索引的中文分词本来就有缺陷。 但这个不是根本原因, 根本原因是建于xml类型列上的全文索引是忽略标记的, 而属性值会被当作标记的一部分。
[/Quote]

"建于xml类型列上的全文索引是忽略标记的,而属性值会被当作标记的一部分。"这句话不能认同,忽略标记不错,但不会忽略属性值(除非该属性值是数字)。

SQL 2005较老版本中有一个BUG,就是只能索引前两层的属性值,我不确定目前是否已经修复。
jeffertsai 2011-03-22
  • 打赏
  • 举报
回复
实践表明,不能用utf-8哦,用了utf-16或者根本gb2312是可以的
中文断词符连utf-8都容不下吗,晕
--小F-- 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 troubledealer 的回复:]
引用 6 楼 fcuandy 的回复:
根本原因是建于xml类型列上的全文索引是忽略标记的, 而属性值会被当作标记的一部分。

按照这种说法,这种情况几乎无法解决问题:
一方面我的伪列设为xml,由于全文索引是忽略标记的,最终深层次的属性值查不出;
另一方面将伪列设为txt,由于编码问题,txt是不会自动识别的,所以很多符号会转错。

唯一可能的方法是存储的时候程序自动将编码的格式转……
[/Quote]

是的 试UTF- 8
troubledealer 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fcuandy 的回复:]
根本原因是建于xml类型列上的全文索引是忽略标记的, 而属性值会被当作标记的一部分。[/Quote]

按照这种说法,这种情况几乎无法解决问题:
一方面我的伪列设为xml,由于全文索引是忽略标记的,最终深层次的属性值查不出;
另一方面将伪列设为txt,由于编码问题,txt是不会自动识别的,所以很多符号会转错。

唯一可能的方法是存储的时候程序自动将编码的格式转为utf-8,再设为txt格式。试试看
jeffertsai 2011-03-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fcuandy 的回复:]

跟编码自然是有关系, 因为全文索引的中文分词本来就有缺陷。[/Quote]

谢谢
那既然这样,对不同编码问题没有一致的全文索引建立方法吗,即使是曲线方案也行啊
因为编码格式确实就比较多,之前没有统一,哎!
fcuandy 2011-03-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 jeffertsai 的回复:]
sql server全文检索问题真是头痛

最近发现在检索xml的问题

说明:1、使用sql server2005;2、将xml文件存成varbinary(max);3、全文检索使用中文;

结果发现 对xml文件的检索效果非常不好。
问题:
1、有些可以检索到第1层至第三层的属性值,但有些编码格式的索性什么都没有,什么原因呢?
2、是和编码格式直接相关吗,如果只有这个原因但是……
[/Quote]

跟编码自然是有关系, 因为全文索引的中文分词本来就有缺陷。 但这个不是根本原因, 根本原因是建于xml类型列上的全文索引是忽略标记的, 而属性值会被当作标记的一部分。
--小F-- 2011-03-19
  • 打赏
  • 举报
回复
XML的效率确实不高
jeffertsai 2011-03-19
  • 打赏
  • 举报
回复
以上两位,谢谢啦

但是目前的需求是要求全文检索二进制文件的,xml只是文件格式的一种,我不想将其单独做一块
快溜 2011-03-19
  • 打赏
  • 举报
回复
create table tb(name xml)

insert into tb
select '<f><e>1</e><e>2</e></f>' union all
select '<f><e>2</e><e>5</e></f>' union all
select '<f><e>4</e><e>5</e></f>'

declare @XuZuoZhe nvarchar(200)
set @XuZuoZhe = N'5'

select * from tb where name.exist('//e[.=sql:variable("@XuZuoZhe")]')=1

/*
name
-----------------------
<f><e>2</e><e>5</e></f>
<f><e>4</e><e>5</e></f>
快溜 2011-03-19
  • 打赏
  • 举报
回复
sql2005,字段可以直接存为xml的。查询可用xml方式检索
昵称被占用了 2011-03-19
  • 打赏
  • 举报
回复
有没有试过字段类别改为nvarchar(max)

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧