+ -
当前位置:首页 → 问答吧 → 全文索引问题,急寻高手指点!!!

全文索引问题,急寻高手指点!!!

时间:2007-04-05

来源:互联网


SELECT   *     FROM   sGuangDong   where   freetext(Company, '华为 ')

SELECT   *     FROM   sGuangDong   where   Contains(Company, '华为 ')


搜出来的结果一样,而且为什么把所有包含“华”字的企业搜出来了,
而不的包含“华为”     百思不得其解

作者: kinthtime   发布时间: 2007-04-05

sqlserver内部分词的处理不太好,
SELECT   *     FROM   sGuangDong   where   Contains(Company,isabout( '为 '   weight(0.8), '华 '   weight(0.3)))试   一下,把为的列前面了。

作者: hrb2008   发布时间: 2007-04-05

上面写错了,按这个试一下吧。
select   a.*   from   tablename   a,CONTAINSTABLE(tablename,   sGuangDong,  
      'ISABOUT   (为   weight   (.8),  
      华weight   (.4)) '   )   AS   b   where   b.key=a.id   order   by   b.rank   desc

作者: hrb2008   发布时间: 2007-04-05


不行啊  

关键字   'key '   附近有语法错误。

作者: kinthtime   发布时间: 2007-04-05

select   a.*   from   tablename   a,CONTAINSTABLE(tablename,   sGuangDong,  
      'ISABOUT   (为   weight   (.8),  
      华weight   (.4)) '   )   AS   b   where   b.[key]=a.id   order   by   b.rank   desc
改成不是关键字:)

作者: hrb2008   发布时间: 2007-04-05


还是错误
------------
消息   207,级别   16,状态   1,第   3   行
列名   'id '   无效。
消息   7630,级别   15,状态   2,第   3   行
在全文搜索条件   'ISABOUT   (为   weight   (.8),  
      华weight   (.4)) '   内的   '( '   附近存在语法错误。


----

以前我没写过这种   ,不知怎么改

作者: kinthtime   发布时间: 2007-04-05

好像差一空格,再试一下吧,联机帮助里够详细了。


select   a.*   from   tablename   a,CONTAINSTABLE(tablename,sGuangDong,   'ISABOUT   (为   weight   (.8),华   weight   (.4)) '   )   AS   b   where   b.[key]=a.id   order   by   b.rank   desc

作者: hrb2008   发布时间: 2007-04-06

Contains(Company, '华为 ')
改为以下试试
Contains(Company, ' "华为 " ')

作者: roy_88   发布时间: 2007-04-06

freetext是模糊匹配,有华、为的词(sql认为的词,除了干扰词)都会查询出来
Contains则认为是一个词语或坡度为0的2个词语
Contains(Company, '华为 ')   修改为Contains(Company, ' "*华为* " ')即可

freetext的模糊匹配效率很低

作者: sp4   发布时间: 2007-04-06

为   应该是被认为忽略词了

作者: sp4   发布时间: 2007-04-06

freetext语句所执行的功能又称做自由式全文查询

作者: amu112964   发布时间: 2007-04-06

指定以指定文本开始的词或短语的匹配项。将前缀字词用英文双引号 ("") 括起来,并在右引号前添加一个星号 (*),这样一来,以星号前指定的简单字词开头的所有文本都将被匹配。应以下列方式指定子句:CONTAINS (column, '"text*"')。星号可以匹配根词或短语的词中的 0 个、1 个或多个字符。如果文本和星号不用英文双引号分隔,则谓词将读取 CONTAINS (column, 'text*'),全文搜索会将星号看作字符,搜索 text* 的完全匹配项。由于断字符通常忽略 (*) 这样的字符,因此全文引擎将不会查找带此类字符的词。

如果 <prefix_term> 是一个短语,则短语中包含的每个词都将被看成一个单独的前缀。因此,指定了一个 "local wine *" 前缀字词的查询,将匹配所有包含 "local winery"、"locally wined and dined" 等文本的行。


意思就是说,指定以指定文本开始的词或短语的匹配项。将前缀字词用英文双引号 ("") 括起来,并在右引号前添加一个星号 (*),这样一来,以星号前指定的简单字词开头的所有文本都将被匹配。应以下列方式指定子句:CONTAINS (column, '"text*"')。星号可以匹配根词或短语的词中的 0 个、1 个或多个字符。如果文本和星号不用英文双引号分隔,则谓词将读取 CONTAINS (column, 'text*'),全文搜索会将星号看作字符,搜索 text* 的完全匹配项。由于断字符通常忽略 (*) 这样的字符,因此全文引擎将不会查找带此类字符的词。

如果 <prefix_term> 是一个短语,则短语中包含的每个词都将被看成一个单独的前缀。因此,指定了一个 "local wine *" 前缀字词的查询,将匹配所有包含 "local winery"、"locally wined and dined" 等文本的行。


意思就是说,where freetext(Company, '"华为 "'),加上英文的双引号就ok了

作者: gongya2004   发布时间: 2011-12-08