sqlserver 全文索引 查询使用规则

具体 sqlserver 建立 全文索引 百度一下 很多 这里 补缀描述(要选择好语言环境)

CONTAINS  and FREETEXT 

区别:

SELECT id, name FROM Teacher
WHERE CONTAINS(note, 'heard')

SELECT id, name FROM Teacher
WHERE FREETEXT(note, 'heard')

这两个结果集 的区别 第一个 出来 0 条 第二个出来2条

原因是  FREETEXT 相较于 CONTAINS 比较松散 可以 查出 'hearder' 

咋一看来 感觉FREETEXT 比 CONTAINS  比起来 更灵活好用 其实不然 

CONTAINS  的高级用法

  • 对多列进行匹配
  • 与或非逻辑
  • 模糊匹配 支持 英文单词的变形
  • 通配符
  • 查询权重

以下的例子 都是从 sqlserver 官方文档 获取的

--多列查询
SELECT Name, ListPrice  
FROM Production.Product  
WHERE ListPrice = 80.99  
   AND CONTAINS((Name,title), 'Mountain');  
--column_list指定以逗号分隔的两个或更多个列。 column_list 必须用括号括起来。 除非指定 
--language_term,否则 column_list 中所有列的语言必须相同。
--------------------------------------------------------------------------------------
-- 与或非 逻辑
SELECT Name, ListPrice  
FROM Production.Product  
WHERE ListPrice = 80.99  
   AND CONTAINS(Name, '"Mountain" AND "WENJIE"'); 
-- ::={ AND | & }  
-- ::={ AND NOT | &! }  
-- ::=   { OR | | } 
--------------------------------------------------------------------------------------
-- 模糊匹配 支持 英文单词变形 类似于 FREETEXT
-- 可以读出ride 的各种形式(如 riding 和 ridden 等)
 SELECT Description  
FROM Production.ProductDescription  
WHERE CONTAINS(Description, ' FORMSOF (INFLECTIONAL, ride) ')

--------------------------------------------------------------------------------------
-- 通配符*的使用
SELECT Name  
FROM Production.Product  
WHERE CONTAINS(Name, ' "Chain*" ');  
--------------------------------------------------------------------------------------
--查询权重
SELECT Description  
FROM Production.ProductDescription  
WHERE CONTAINS(Description, 'ISABOUT (performance weight (.8),   
comfortable weight (.4), smooth weight (.2) )' );  
---------------------------------------------------------------------------------------
-- NEAR 使用 
-- 以下示例在 Production.ProductReview 表中搜索包含 bike 一词、在“control”词的 10 个词范围内且使用指定顺序(即,“bike”排在“control”前面)的所有注释。
SELECT Comments  
FROM Production.ProductReview  
WHERE CONTAINS(Comments , 'NEAR((bike,control), 10, TRUE)');  

注意以上的 所以 可以 混合使用 

比如我这里的sql

SELECT * FROM sku_price WHERE 
CONTAINS(sku_desc, 'ISABOUT("PJ" weight (.8) ,"PJ*" weight (.2)) AND ISABOUT("PA" weight (.8) ,"PA*" weight (.2))')

--查询 sku_price 中 匹配 PJ 或者 PJ* 但是 PJ 的权重大于 PJ* 的结果集

 

你可能感兴趣的:(sqlserver)