[轉載]oracle Text 全文檢索功能對中文分詞的支持情況

下面例子在XE中測試通過。

準備工作:

CREATE TABLE issues (
ID NUMBER,
summary VARCHAR(120),
description CLOB,
author VARCHAR(80),
ot_version VARCHAR(10)
);


INSERT INTO issues
VALUES (1, 'Jane', 'Text does not make tea',
'Oracle Text is unable to make morning tea', 1);

INSERT INTO issues
VALUES (2, 'John', 'It comes in the wrong color',
'I want to have Text in pink', 1);

INSERT INTO issues
VALUES (3, 'Mike', 'I come from china', '所以我講中文', 1);
--下面兩句話很難解析的
INSERT INTO issues
VALUES (4, 'Mike', 'I come from china', '吉林省長春市的人民', 1);

INSERT INTO issues
VALUES (5, 'Mike', 'I come from china',
'我們要積極地主動作好計劃生育工作', 1);

-- define datastore preference for issues

BEGIN
--ctx_ddl.drop_preference ('issue_lexer');
ctx_ddl.set_attribute ('issue_store', 'output_type', 'CLOB');
ctx_ddl.create_preference ('issue_lexer', 'CHINESE_LEXER');
END;
/

-- index issues 沒有指定任何lexer
CREATE INDEX issue_index ON issues(author) INDEXTYPE IS ctxsys.CONTEXT;

--進行查詢
SELECT *
FROM issues
WHERE contains (author, '中文', 1) > 0;

會返回no rows selected。

說明:不使用lexer參數,oracle Text無法對中文進行有效檢索。

接下來我們使用oracle和網上各位仁兄推薦的CHINESE_LEXER看看,執行下列語句:
DROP INDEX issue_index;

-- index issues
CREATE INDEX issue_index ON issues(author) INDEXTYPE IS ctxsys.CONTEXT
PARAMETERS ('lexer issue_lexer');

SELECT *
FROM issues
WHERE contains (author, '中文', 1) > 0;

會返回一條記錄。

再執行下列查詢語句:
SELECT *
FROM issues
WHERE contains (author, '作好', 1) > 0;

SELECT *
FROM issues
WHERE contains (author, '吉林', 1) > 0;

都沒有任何返回結果。

執行下列語句:
SELECT *
FROM issues
WHERE contains (author, '中文', 1) > 0;

有一個返回結果。

說明:CHINESE_LEXER對中文分詞進行了優化,能夠識別大部分中文單詞,但是畢竟有很多單詞難以區分。比如說,‘我們要積極地主動作好計劃生育工作’被oracle 解釋爲:“我們要 積極 地主 動作 好 計劃生育 工作”;'吉林省長春市的人民'解釋爲:“吉林省 長春市 的 人民”。不過效率方面自然很高。

再看看CHINESE_VGRAM_LEXER:
執行下列語句
BEGIN
ctx_ddl.drop_preference ('issue_lexer');
ctx_ddl.set_attribute ('issue_store', 'output_type', 'CLOB');
ctx_ddl.create_preference ('issue_lexer', 'CHINESE_VGRAM_LEXER');
END;
/

-- index issues 沒有指定任何lexer
CREATE INDEX issue_index ON issues(author) INDEXTYPE IS ctxsys.CONTEXT
PARAMETERS ('lexer issue_lexer');

--進行查詢
SELECT *
FROM issues
WHERE contains (author, '中文', 1) > 0;

SELECT *
FROM issues
WHERE contains (author, '作好', 1) > 0;

SELECT *
FROM issues
WHERE contains (author, '吉林', 1) > 0;

SELECT *
FROM issues
WHERE contains (author, '計劃生育', 1) > 0;

SELECT *
FROM issues
WHERE contains (author, '地主', 1) > 0;

都有返回結果。

說明:CHINESE_VGRAM_LEXER使用的保守分詞方法,不求有功但求無過。對所有的詞都可以查詢到。不過效率方面就有不足了。

所有的分詞結果都可以在表DR$ISSUE_INDEX$I中看到。
例子中CHINESE_VGRAM_LEXER會創建39行數據,而CHINESE_LEXER只創建23行數據。


結論:oracle Text進行中文搜索必須指定lexer 參數。如果追求效率那麼使用CHINESE_LEXER,如果追求準確度那麼使用CHINESE_VGRAM_LEXER。
發佈了25 篇原創文章 · 獲贊 1 · 訪問量 1803
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章