Oracle 10g 全文检索的一些笔记

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 comment

Your email address will not be published. Required fields are marked *