MS SQL 全文索引查询不精确

shineran 2007-11-07 12:08:22
各位大侠,我在做全文索引时碰到查询不够精确的问题,请帮忙看看。
运行环境:
1、MS SQL 2000 + windows 2K;
2、全文索引已建好并完全填充
3、noise.chn文件为一般情况下的内容。
4、百万以上数据
问题:

情况一:
SQL:SELECT * FROM E_Resource WHERE CONTAINS(*,'万科')
结果:无数据

SQL:SELECT * FROM E_Resource WHERE CONTAINS(*,'*万科*')
结果:171条数据

情况二:
SQL:SELECT COUNT(1) FROM DEC_T_E_Resource WHERE CONTAINS(*,'房地产')
结果:无数据
SQL:SELECT COUNT(1) FROM DEC_T_E_Resource WHERE CONTAINS(*,'*房地产*')
结果:无数据

SQL:SELECT COUNT(1) FROM DEC_T_E_Resource WHERE CONTAINS(*,'地产')
结果:327157条数据
SQL:SELECT COUNT(1) FROM DEC_T_E_Resource WHERE CONTAINS(*,'*地产*')
结果:327157条数据

请问为什么有的情况下会查不到数据呢?
...全文
420 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
diqiuproj 2009-02-11
  • 打赏
  • 举报
回复
顶。
gdlijx 2008-09-11
  • 打赏
  • 举报
回复
晕,原来是建立全文索引时没有选择完全填充,现在选择了就可以了,谢谢啦!
shineran 2007-11-09
  • 打赏
  • 举报
回复
喔。不过我是说在
SELECT COUNT(1) FROM DEC_T_E_Resource WHERE CONTAINS(*,'房地产')

的时候,在第一次大概要7秒左右,这个速度能否提高呢?
中国风 2007-11-09
  • 打赏
  • 举报
回复
比如时:效率会快很多,列多
select * from 表 where col like '%中国%' or col2 like '%中国%' or...
中国风 2007-11-09
  • 打赏
  • 举报
回复
以后可用增量填充,数据量大/字段内容多时,就可以看出效率了
shineran 2007-11-09
  • 打赏
  • 举报
回复
TO ROY_88
现在我完全填充了,CONTAINS只比LIKE少1%左右,还算满意吧。谢谢你了。
这里我再问一下,在SELECT COUNT(1) 的时候有提高效率的办法吗?现在获取总的记录时,在第一次概在7秒左右,
耗费的时间太长了。
shineran 2007-11-09
  • 打赏
  • 举报
回复
呵呵 ,看来除了提高硬件性能之外是没有其他的办法了,谢谢你了roy_88 。
等会儿就给你加分呀。
中国风 2007-11-09
  • 打赏
  • 举报
回复

在2005里对全文索引做了优化的引擎,可根据CPU\内存性能设置索引性能..

楼主在联机帮助里可以看到配置:
硬件考虑事项

多个 CPU:一到四个 500 MHz Xeon III 处理器。


内存:1 到 4 GB 的物理 RAM。


具有几个通道的多磁盘控制器,或具有多通道的单磁盘控制器。


磁盘 I/O 子系统:RAID0(没有容错保护的磁盘条带化)、RAID0+1 和 RAID5。
Windows 2000 或 Windows NT 4.0 系统配置的考虑事项

如果在 Windows NT Server 4.0 上安装 SQL Server,那么 pagefile.sys 文件的大小需要设置为可用物理 RAM 量的 1.5 到 2 倍。在有较大 RAM 量的 Windows 2000 Server 上安装 SQL Server 时,可以不用考虑这一条。


Pagefile.sys 文件需要放置在它们自己的驱动器(RAID0 或 RAID0+1)上,最好在单独的控制器或至少是与共享控制器分离的单独通道上。
SQL Server 配置的考虑事项

在大型表(超过一百万行)中进行完全填充后,考虑将新特性 Change Tracking 与 Update Index in Background 和 Update Index 对 Incremental Population 一起使用。有关何时使用 Change Tracking 对 Timestamp-based incremental 填充的更多信息
--------------
全文索引和目录考虑事项

全文索引或填充全文目录应该在系统活动较少时进行,通常在数据库维护窗口完成。


将全文目录文件放置在它自己的磁盘控制器上,或有多个通道的单个磁盘控制器上单独的通道中。


将数据库文件放置在与全文目录文件不同的独立的磁盘控制器上,或有多个通道的单个磁盘控制器上单独的通道中。


具有四百万或两千万行的 SQL 表的全文索引可能要花费几个小时或几天来完成。考虑知识库文章 Q240867 中提供的选项:"INF:如何移动、复制和备份 SQL 7.0 全文目录文件夹和文件"。



shineran 2007-11-08
  • 打赏
  • 举报
回复
TO ROY_88
不好意思,因为这数据量太大了,我现在进行的测试是只填充到一半,所以查询结果会少,我再填充完后再测试一下吧。
谢谢。
shineran 2007-11-08
  • 打赏
  • 举报
回复
TO ROY_88
重新建议全文索引,并全部填充,现在可以查出结果了,谢谢。不过contains比LIKE的查询结果会少很多,几乎是少一半,而且SELECT COUNT(1) 的时候也比较费时间,有办法优化这些问题吗?
shineran 2007-11-07
  • 打赏
  • 举报
回复
dawugui 所说的情况与我的问题不同,我现在的情况是全文索引可以正常的搜索,只是在搜索某些关键词的时候会出现找不到数据的情况。
dawugui 2007-11-07
  • 打赏
  • 举报
回复
一个完整的SQL SERVER数据库全文索引的示例。(以pubs数据库为例)

首先,介绍利用系统存储过程创建全文索引的具体步骤:

1) 启动数据库的全文处理功能 (sp_fulltext_database)
2) 建立全文目录 (sp_fulltext_catalog)
3) 在全文目录中注册需要全文索引的表 (sp_fulltext_table)
4) 指出表中需要全文索引的列名 (sp_fulltext_column)
5) 为表创建全文索引 (sp_fulltext_table)
6) 填充全文目录 (sp_fulltext_catalog)


---------********示例********-------------
以对pubs数据库的title和notes列建立全文索引,之后使用索引查询title列或notes列中包含有datebase 或computer字符串的图书名称:

在这之前,需要安装Microsoft Search服务,启动SQL server全文搜索服务


user pubs --打开数据库
go
--检查数据库pubs是否支持全文索引,如果不支持
--则使用sp_fulltext_database 打开该功能
if(select databaseproperty('pubs','isfulltextenabled'))=0
execute sp_fulltext_database 'enable'

--建立全文目录FT_PUBS
execute sp_fulltext_catalog 'FT_pubs','create'

--为title表建立全文索引数据元
execute sp_fulltext_table 'title','create','FT_pubs','UPKCL_titleidind'

--设置全文索引列名
execute sp_fulltext_column 'title','title','add'
execute sp_fulltext_column 'title','notes','add'

--建立全文索引
--activate,是激活表的全文检索能力,也就是在全文目录中注册该表
execute sp_fulltext_table 'title','activate'

--填充全文索引目录
execute sp_fulltext_catalog 'FT_pubs','start_full'
go

--检查全文目录填充情况
While fulltextcatalogproperty('FT_pubs','populateStatus')<>0
begin

--如果全文目录正处于填充状态,则等待30秒后再检测一次
waitfor delay '0:0:30'
end

--全文目录填充完成后,即可使用全文目录检索

select title
form
where CONTAINS(title,'database')
or CONTAINS(title,'computer')
or CONTAINS(notes,'database')
or CONTAINS(notes,'database')



'--------------以下介绍一下全文操作类的系统存储过程
过程名称:sp_fulltext_service
执行权限:serveradmin或系统管理员
作 用:设置全文搜索属性


过程名称:sp_fulltext_catalog
执行权限:db_owner及更高角色成员
作 用:创建和删除一个全文目录,启动或停止一个全文目录的索引操作


过程名称:sp_fulltext_database
执行权限:db_owner角色成员
作 用:初始化全文索引或删除数据库中所有全文目录


过程名称:sp_fulltext_table
执行权限:db_ddladnmin或db_owner角色成员
作 用:将一个表标识为全文索引表或非全文索引表


过程名称:sp_fulltext_column
执行权限:db_ddladnmin角色成员
作 用:指出一个全文索引表中的那些列假如或退出全文索引
中国风 2007-11-07
  • 打赏
  • 举报
回复
看看先:
--楼主查看一下结果集,有没有空格(注意看一下字段的排序规则\字段的属性)
查询出来的结果"房地产"中间有没有空格,有空格时要加"括起来;

contains谓词也就是一个功能的语句产生一个布尔结果,精确地匹配,不需要精确匹配,用相似匹配FREETEXT试试
楼主有没有用
SELECT COUNT(1)
FROM DEC_T_E_Resource WHERE FREETEXT(*, '"房地产"')

全文索引是与字段内的整个词的任何部分进行匹配...
全文索引的通配符*与T_SQL的%是相同的..

----------如果还是这样重新填充索引..

shineran 2007-11-07
  • 打赏
  • 举报
回复
to roy_88
已经试过了。这三条语句的查询结果是相同的。
SQL:SELECT COUNT(1) FROM DEC_T_E_Resource WHERE CONTAINS(*, '地产')
结果:327157条数据
SQL:SELECT COUNT(1) FROM DEC_T_E_Resource WHERE CONTAINS(*, '*地产*')
结果:327157条数据
SQL:SELECT COUNT(1) FROM DEC_T_E_Resource WHERE CONTAINS(*, '"地产"')
结果:327157条数据

但我将关键词改为“房地产”,就没有任何数据,其实数据库是有包含“房地产”的数据的。
SQL:SELECT COUNT(1) FROM DEC_T_E_Resource WHERE CONTAINS(*, '*房地产*')
结果:无数据

SQL:SELECT COUNT(1) FROM DEC_T_E_Resource WHERE CONTAINS(*, '"房地产"')
结果:无数据

SQL:SELECT COUNT(1) FROM DEC_T_E_Resource WHERE CONTAINS(*, '房地产')
结果:无数据
中国风 2007-11-07
  • 打赏
  • 举报
回复

SELECT COUNT(1) FROM DEC_T_E_Resource WHERE CONTAINS(*, '"房地产"') --加上查查
中国风 2007-11-07
  • 打赏
  • 举报
回复
楼主少了双引号
"地产"

22,209

社区成员

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

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