 | 使用 DB2 Text Search 进行搜索
下面这些内建的 DB2 搜索函数可用于 DB2 中的全文本搜索:
- 用 CONTAINS() 或 xmlcolumn-contains() 查询一个单词或短语
- 用 SCORE() 获得一个文档的相关度
单词或短语可以用布尔操作符(AND、OR 和 NOT)进行组合,也可以用通配符(? 和 *)进行修饰,以限制或扩展搜索范围。
纯文本中的搜索
使用 CONTAINS 关键词提交一个搜索查询:
清单 12. 文本搜索的基本语法
SELECT author, year, substr(title,1,30)
FROM books
WHERE CONTAINS(title, 'mountain') = 1
AUTHOR YEAR 3
------------------------------ ----------- ------------------------------
Joe Climber 1995 Climber's Mountain Tops
Sam Climber 1966 Top of the Mountain: Mountain
2 record(s) selected.
|
CONTAINS 函数搜索文本索引以查找指定的搜索参数,并返回结果提示是否发现匹配项。如果文档包含与搜索参数匹配的项,则结果为 1,否则结果为 0。
DB2 Text Search 在搜索中自动使用派生形式。在前面的例子中,搜索不仅返回词语 “mountain”,还返回 “mountains” 以及其他派生词。
要发现包含单词组合的行,可以使用操作符 AND、OR 和 NOT,以包括或排除行,其中 AND 默认用于组合多个词。下面的查询返回在列 title 中同时包含词 “mountain” 和 “top” 的行,而不管每个词出现在列中的什么地方。
清单 13. 在文本搜索函数中使用默认的布尔操作符 AND
SELECT
author, year, substr(title,1,30)
FROM books WHERE CONTAINS(title, 'mountain top') = 1
AUTHOR YEAR 3
------------------------------ ----------- ------------------------------
Joe Climber 1995 Climber's Mountain Tops
Sam Climber 1966 Top of the Mountain: Mountain
2 record(s) selected.
|
注意,将词放入引号中将导致只搜索精确的短语 “mountain tops”:
清单 14. 对搜索参数使用引号查找精确的匹配项
SELECT
author, year, substr(title,1,30)
FROM books WHERE CONTAINS(title, '"mountain tops"') = 1
AUTHOR YEAR 3
------------------------------ ----------- ------------------------------
Joe Climber 1995 Climber's Mountain Tops
1 record(s) selected.
|
通配符 ?(用于单个字符)和 *(用于多个字符)返回与搜索词部分匹配的文档:
清单 15. 使用通配符进行搜索
SELECT
author, year, substr(title,1,30)
FROM books WHERE CONTAINS(title, 'comp*') = 1
AUTHOR YEAR 3
------------------------------ ----------- ------------------------------
Samantha Smitt 2001 The Database Compendium
1 record(s) selected.
|
应避免在搜索词的开头使用通配符,因为这对查询性能有明显的负面影响。
如果想获取结果示例,可以用 RESULTLIMIT 参数限制文档的数量:
清单 16. 用 RESULTLIMIT 参数限制文档的数量
SELECT
author, year, substr(title,1,30)
FROM books WHERE CONTAINS(title, 'mountain', 'RESULTLIMIT=1') = 1
AUTHOR YEAR 3
------------------------------ ----------- ------------------------------
Joe Climber 1995 Climber's Mountain Tops
1 record(s) selected.
|
根据相关度获取结果
使用 SCORE 函数确定一条结果相对于其他结果与搜索词的匹配程度。
清单 17. 通过使用 SCORE 函数获得文档的相关度
SELECT
title FROM books
WHERE CONTAINS(title, 'mountain') = 1 ORDER BY SCORE(title, 'mountain') DESC
TITLE
-------------------------------------------------------------------
Top of the Mountain: Mountain Lore
Climber's Mountain Tops
2 record(s) selected.
|
一个文档的得分由一个介于 0 到 1 之间的值表示,它考虑了搜索词在文档中出现的次数,并且与结果集中的其他文档进行比较,也就是说,它是针对当前结果集动态计算出来的。
搜索 XML 文档
可以使用一些不同的选项在 XML 文档中进行搜索:
- 使用 SQL/XML 进行搜索:
清单 18. 结合 XMLQUERY() 使用文本搜索功能
SELECT
xmlquery('$bi//author' passing bookinfo as "bi")
FROM books WHERE contains(bookinfo, 'range')=1
1
-------------------------------------------------------------------
<author>Joe Climber</author>
<author>Joe Smith</author>
<author>Samantha Smitt</author>
3 record(s) selected.
|
- 使用 XQuery 进行搜索:
清单 19. XQuery 上下文中的文本搜索
xquery db2-fn:xmlcolumn-contains('BOOKS.BOOKINFO', 'range')/bookinfo/author
1
-------------------------------------------------------------------
<author>Joe Climber</author>
<author>Joe Smith</author>
<author>Samantha Smitt</author>
3 record(s) selected.
|
- 使用 XPath 子句进行搜索:
清单 20. 使用 XPath 表达式的文本搜索
Example: 1
SELECT
author, year, substr(title,1,30) FROM books
WHERE contains(bookinfo, '_cnnew1@xpath:''/bookinfo/story [.contains("range")]''')=1
AUTHOR YEAR 3
------------------------------ ----------- ------------------------------
Joe Climber 1995 Climber's Mountain Tops
Joe Smith 1991 The Range
Samantha Smitt 2001 The Database Compendium
3 record(s) selected.
Example: 2
xquery
db2-fn:xmlcolumn-contains(
'BOOKS.BOOKINFO','@xpath:''/bookinfo/story[.contains("range")]''')/bookinfo/author
<author>Joe Climber</author>
<author>Joe Smith</author>
<author>Samantha Smitt</author>
3 record(s) selected
|

 |

|
|  |