`
NoWhy
  • 浏览: 35761 次
  • 性别: Icon_minigender_1
  • 来自: 他乡
社区版块
存档分类
最新评论

简易USER_LEXER

阅读更多
USER_LEXERによる Simple 2-Gram Lexer (検索対象がVARCHAR2列)
Oracle Text の USER_LEXER による Simple 2-Gram Lexer の実装サンプルで
す。検索対象はVARCHAR2列。データベース・キャラクタセット上の全てのコー
ドポイントを単純に2文字ずつ区切ってトークンを生成します。主な仕様は、

・ 一文字での検索も実行可能
・ 記号文字(全角の#$%、半角の#$%など)による検索も可能
・ 大文字と小文字の同一視は行わない(=大文字と小文字を区別して検
索)
・ 全角と半角の同一視は行わない(=全角と半角を区別して検索)
・ ワイルドカード検索には非対応

となっています。

/*------------------------------------------------
 * ユーザ作成
 *----------------------------------------------*/

CONNECT / AS SYSDBA
CREATE USER testctx IDENTIFIED BY testctx;
GRANT connect, resource, ctxapp TO testctx;

ALTER USER ctxsys IDENTIFIED BY ctxsys ACCOUNT UNLOCK;
CONNECT ctxsys/ctxsys
GRANT EXECUTE ON CTX_ULEXER TO testctx;


/*------------------------------------------------
 * INDEX_PROCEDURE for 2-Gram Lexer
 * INPUT_TYPE=VARCHAR2
 *----------------------------------------------*/

CONNECT testctx/testctx
CREATE OR REPLACE PROCEDURE ind_ngram
(
    v_a  IN      VARCHAR2,
    v_b  IN OUT  VARCHAR2,
    v_c  IN      BOOLEAN
)
IS
    v_len  NUMBER;
BEGIN
    v_len := LENGTH(v_a);
    v_b := '<tokens>';
    FOR i IN 1 .. v_len - 1 LOOP
        v_b := v_b || '<word>' || SUBSTR(v_a, i, 2) || '</word>';
    END LOOP;
    v_b := v_b || '<word>' || SUBSTR(v_a, v_len, 1) 
|| '</word></tokens>';
END ind_ngram;
/


/*------------------------------------------------
 * QUERY_PROCEDURE for 2-Gram Lexer
 *----------------------------------------------*/

CONNECT testctx/testctx
CREATE OR REPLACE PROCEDURE que_ngram
(
    v_a  IN      VARCHAR2,
    v_b  IN      CTX_ULEXER.WILDCARD_TAB,
    v_c  IN OUT  VARCHAR2
)
IS
    v_len  NUMBER;
BEGIN
    v_len := LENGTH(v_a);
    v_c := '<tokens>';
    IF v_len >= 2 THEN
        FOR i IN 1 .. v_len - 1 LOOP
            v_c := v_c || '<word>' || SUBSTR(v_a, i, 2) || '</word>';
        END LOOP;
    ELSIF v_len = 1 THEN
        v_c := v_c || '<word wildcard="1">' || v_a || '%</word>';
    END IF;
    v_c := v_c || '</tokens>';
END que_ngram;
/


/*------------------------------------------------
 * 検索対象表作成
 *----------------------------------------------*/

CONNECT testctx/testctx
CREATE TABLE test_tab
(
    id    NUMBER  PRIMARY KEY,
    text  VARCHAR2(4000)
);
INSERT INTO test_tab VALUES (1, 'オラクルOracle');
INSERT INTO test_tab VALUES (2, 'Oracle');
INSERT INTO test_tab VALUES (3, 'z');
INSERT INTO test_tab VALUES (4, '¥/※○×\/*+-');
INSERT INTO test_tab VALUES (5, 'Oracle Text');
INSERT INTO test_tab VALUES (6, 'Oracle Text');
INSERT INTO test_tab VALUES (7, 'Oracle  Text');
INSERT INTO test_tab VALUES (8, 'OracleText');
COMMIT;


/*------------------------------------------------
 * 索引作成
 *----------------------------------------------*/

CONNECT testctx/testctx
BEGIN
    CTX_DDL.CREATE_PREFERENCE('my_lexer', 'user_lexer');
    CTX_DDL.SET_ATTRIBUTE
('my_lexer', 'index_procedure', 'ind_ngram');
    CTX_DDL.SET_ATTRIBUTE('my_lexer', 'input_type', 'varchar2');
    CTX_DDL.SET_ATTRIBUTE
('my_lexer', 'query_procedure', 'que_ngram');
END;
/
BEGIN
    CTX_DDL.CREATE_STOPLIST('my_stoplist', 'basic_stoplist');
END;
/
CREATE INDEX test_idx ON test_tab(text)
    INDEXTYPE IS ctxsys.context
    PARAMETERS
    ('
        LEXER     my_lexer
        STOPLIST  my_stoplist
    ');


/*------------------------------------------------
 * 検索
 *----------------------------------------------*/

CONNECT testctx/testctx
COLUMN text FORMAT A80
SELECT * FROM test_tab WHERE CONTAINS (text, 'ルo') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, 'オラ') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, 'e') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, 'z') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, 'Ora%') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, '○×') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, '○○') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, '\/*') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, '\/-') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, '\\\/\*') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, '\\\/\-') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, 'Oracle Text') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, 'Oracle\ Text') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, ' T') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, 'T ') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, 'T') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, 'Oracle Tex
t') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, ' T') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, '\ \ ') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, 'Oracle\ \ Text') > 0;
SELECT * FROM test_tab WHERE CONTAINS (text, 'Oracle\ Text') > 0;

/*
 ※ 問合せ演算子はバックスラッシュ「\」でエスケープすることで検索でき
ます。
 */

http://otn.oracle.co.jp/otn_pl/otn_tool/code_detail?n_code_id=1933
分享到:
评论

相关推荐

    Python库 | pygments_ccl_lexer-0.7.23-py2-none-any.whl

    **Python库pygments_ccl_lexer-0.7.23-py2-none-any.whl详解** `pygments_ccl_lexer` 是一个基于Python的语法高亮库`Pygments`的扩展,专为处理CCL(Concurrent Constraint Language)语言设计。CCL是一种并发编程...

    Python库 | spectra_lexer-0.3.0.tar.gz

    《Python库spectra_lexer-0.3.0:解析化学光谱数据的利器》 在信息技术日益发达的今天,Python作为一门强大的编程语言,以其简洁的语法和丰富的库资源深受开发者喜爱。当我们谈论Python库时,往往是在讨论那些能够...

    Lexer-master_编译器_词法分析器_lexer_

    在编程语言领域,编译器是将源代码转换为目标代码的关键工具,而词法分析器(Lexer 或 Lex)则是编译器的第一步,它负责将源代码分解成一系列有意义的单元,即“词法单元”或“标记”(tokens)。本项目 "Lexer-...

    C_Compiler_Lexer_SimpleVersion.zip

    标题"C_Compiler_Lexer_SimpleVersion.zip"指的是一个关于C语言词法分析器的简单实现,这通常涉及编译原理中的一个重要阶段。词法分析器(也称为扫描器或lexer)是编译器的第一个组成部分,它将源代码分解成一系列有...

    run_Lexer1.zip

    标题“run_Lexer1.zip”表明这可能是一个包含Python编程相关的项目压缩包,其中的主程序名为“run_Lexer1.py”。描述提到这个程序实现了对文本内容的识别,暗示了它可能是一个词法分析器(Lexer)或扫描器,这是编译...

    Python库 | vue_lexer-0.0.2-py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:vue_lexer-0.0.2-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    2021-1-26 Pool_Lexer_Parser.zip

    本项目“2021-1-26 Pool_Lexer_Parser.zip”似乎专注于编译器设计的一个核心部分,即词法分析器(Lexer)和解析器(Parser)的分离,以及抽象语法树(AST)的构建。 首先,词法分析器(Lexer)是编译器的第一阶段,...

    sql_lexer:Rust库来lex和清理SQL

    要对查询进行词法处理并写回字符串: extern crate sql_lexer;fn main () { let sql = sql_lexer :: lex ( "SELECT * FROM `table`" . to_string ()). lex (); println! ( "{}" , sql_lexer :: write (sql));} 要...

    2021-1-10 FSM_Lexer.zip

    其中,词法分析器(Lexer或Scanner)是编译器的第一步,它负责识别源代码中的各种符号,将其转化为一个个有意义的标记(Token)。在"2021-1-10 FSM_Lexer.zip"这个压缩包中,我们看到的是一个名为"zhangqi-lang"的...

    my_lexer.cpp

    输入:所给文法的源程序字符串 输出:二元组(syn, token或sum)构成的序列。其中syn 为单词种别码;token 为存放的单词自身字符串;sum为整型常量(作为常量的值)。实现时,可将单词的二元组用结构进行处理

    如何更好的利用Oracle全文检索.docx

    3. 设置词法分析器(lexer):Oracle提供了多种词法分析器,如basic_lexer、chinese_vgram_lexer和chinese_lexer等。不同的词法分析器适用于不同的语言和字符集。 三、词法分析器(lexer) 词法分析器是Oracle全文...

    oracle text全文检索的开发和相关文档

    Oracle 提供了针对不同语言的 lexer,例如 basic_lexer(默认,适用于英语)、chinese_vgram_lexer(专为汉语设计)和 chinese_lexer(优化后的汉语分析器,支持 UTF8 字符集)。 在使用 Oracle Text 时,需要关注 ...

    lexer_C语言_firstwbh_C++_visualc++_

    在本项目"lexer_C语言_firstwbh_C++_visualc++_"中,开发者使用C++编程语言构建了一个词法分析器,其主要目标是解析名为SNL(Simple Notation Language)的自定义教学语言。开发环境是Microsoft的Visual Studio 2017...

    在Unix服务器上设置Oracle全文检索 (2)

    5. **Chinese_lexer失败**:如果使用`chinese_lexer`时遇到问题,如ORA-29855和DRG-10502错误,可能是因为`chinese_lexer`只支持UTF8字符集。解决方法是接受`chinese_vgram_lexer`的限制,或者冒着可能导致应用无法...

    Oracle 如何创建和使用全文索引

    Oracle的全文索引利用了其专利的词法分析器(lexer),将文本内容拆解成表意单元(term),并存储在以dr$开头的一系列系统表中,包括每个term的位置、频率和哈希值等信息,以供后续的搜索使用。 Oracle 提供了多种...

    基于ORACLE数据库的全文检索技术的安装和使用方法

    使用时需要对目标用户授权,例如`grant ctxapp to crmuser`,并为特定用户如`crmuser`授予执行`ctx_ddl`包的权限。 在Oracle Text中,可以自定义全文索引分析器,如设置为支持中文的`CHINESE_LEXER`。这有助于提高...

    Oracle的全文检索技术.doc

    然而,Oracle Text 也存在一些缺陷,例如在使用中也发觉有遗憾的地点,Oracle Text 不管使用何种过滤器(INSO_FILTER 或 NULL_FILTER)及何种词法分析器(BASIC_LEXER, CHINESE_VGRAM_LEXER 依旧 CHINESE_LEXER)都...

Global site tag (gtag.js) - Google Analytics