Oracle 10g 的全文检索分为两个部分:
索引创建 – 使用过滤器(Filter)对不同格式的内容进行提取,通过词法分析器(Lexer)将文本分离为有效词列表,创建并设置噪声词表、相关词表。
查询处理 – 在标准 SELECT 语句中通过 CONTEXT 和 CTXCAT 使用全文索引搜索。
1. 索引创建
a. 数据存储(Datastore)
默认的数据存储方式为 DIRECT_DATASTORE。如果数据源通过 URL 地址定位,则使用 URL_DATASTORE。当多个数据源使用同一个索引时,要创建数据存储连接,并指定 MULTI_COLUMN_DATASTORE。
BEGIN
CTX_DDL.CREATE_PREFERENCE(‘FOOBAR_DATASTORE’, ‘MULTI_COLUMN_DATASTORE’);
CTX_DDL.SET_ATTRIBUTE(‘FOOBAR_DATASTORE’, ‘columns’, ‘FOO, BAR’);
END;
SET_ATTRIBUTE 指定列,指定表和索引的工作在创建索引时完成。
b. 过滤器(Filter)
c. 分段器(Sectioner)
d. 词法分析器(Lexer)
对于中文有两种可选的词法分析器。CHINESE_VGRAM_LEXER 提取的标识符更大,无效标识符多。CHINESE_LEXER 更可靠,更好一些。
BEGIN
CTX_DDL.CREATE_PREFERENCE(‘FOOBAR_LEXER’, ‘CHINESE_LEXER’);
END;
e. 相关词表(Wordlist)
f. 非索引字表(Stoplist)
排除在索引外的字词。如“的”、“了”等。Oracle 提供默认的 DEFAULT_STOPLIST。可扩展默认的 DEFAULT_STOPLIST,并通过 ADD_STOPWORD 添加自定义的非索引字表。也可通过扩展 BASIC_STOPLIST 创建全新的非索引字表。BASIC_STOPLIST 创建后是空的非索引字表。
BEGIN
CTX_DDL.CREATE_STOPLIST(‘FOOBAR_STOPLIST’, ‘DEFAULT_STOPLIST’);
CTX_DDL.ADD_STOPWORD(‘FOOBAR_STOPLIST’, ‘在’);
END;
g. 存储首选项(Storage Preference)
h. 索引类型
Oracle 提供四种类型的索引:CONTEXT、CTXCAT、CTXRULE、CTXXPATH。
CREATE INDEX FOOBAR_IDX ON FOOBAR(FOO)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS (
‘LEXER FOOBAR_LEXER
WORDLIST FOOBAR_LEXER
STOPLIST FOOBAR_STOPLIST
DATASTORE CTXSYS.DEFAULT_DATASTORE
SYNC (ON COMMIT)’
)
调用默认的索引参数,应加 CTXSYS 前缀,如:CTXSYS.DEFAULT_STOPLIST。
2. 查询处理
SELECT score(1), FOO, BAR
FROM FOOBAR
WHERE CONTAINS(FOO, ‘河蟹’, 1) > 0
多个关键词搜索:
SELECT score(1), ID, "FOO"
FROM FOOBAR
WHERE
CONTAINS("FOO", ‘数据,插入,验证’, 1) > 0
另外,当在多列上进行全文检索,在 SELECT 的 WHERE 中只能出现索引建立时指定的列。Oracle 会自动在所有 MULTI_COLUMN_DATASTORE 中指定的列中进行查询。但若指定的列为空,即便是其他列有匹配内容,也不会被查询到。
Leave a Reply