- 浏览: 35761 次
- 性别:
- 来自: 他乡
最新评论
USER_LEXERによる Simple 2-Gram Lexer (検索対象がVARCHAR2列)
Oracle Text の USER_LEXER による Simple 2-Gram Lexer の実装サンプルで
す。検索対象はVARCHAR2列。データベース・キャラクタセット上の全てのコー
ドポイントを単純に2文字ずつ区切ってトークンを生成します。主な仕様は、
・ 一文字での検索も実行可能
・ 記号文字(全角の#$%、半角の#$%など)による検索も可能
・ 大文字と小文字の同一視は行わない(=大文字と小文字を区別して検
索)
・ 全角と半角の同一視は行わない(=全角と半角を区別して検索)
・ ワイルドカード検索には非対応
となっています。
http://otn.oracle.co.jp/otn_pl/otn_tool/code_detail?n_code_id=1933
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
发表评论
-
oracle文档
2012-10-30 13:27 578http://docs.oracle.com/cd/E1633 ... -
sqlplus乱码原因分析
2012-10-30 13:11 840如果客户端设定的字符集NLS_LANG和服务器端的字符集设定N ... -
ORACLE的路径
2012-10-30 12:16 7631.tnsnames.ora的路径设置 デフォルトで、tnsn ... -
数据库建库步骤
2012-10-22 10:13 01.使用用户sys登陆数据 ... -
Oracle权限那些事
2012-10-18 17:08 783dba_tab_privs直接授予用户的对象权限dba_sys ... -
Oracle认证的途径
2012-10-11 10:14 721http://education.oracle.com/pls ... -
Model的使用方法
2011-05-17 00:28 1178行变列 select b1,b2,b3 from ... -
不使用TNS直接链接数据库
2011-04-28 13:32 1038直接连接数据库 connect user/pass@//0. ... -
小技巧
2011-03-02 12:44 807取得某个表某个时段前的数据 SELECT * FROM 表 ... -
MERGE INTO的用法
2010-01-21 14:18 1955自从版本9i之后,对于“有则更新,无则插入”有了一个新的用法, ... -
关于Exists的那些事
2009-12-10 21:30 717在使用or exists时,如果速度太慢,那么就把它转为UNI ... -
设定Oracle客户端字符集
2009-12-08 09:47 1252oracle客户端字符集设置需要和服务器端一致,否则会出现乱码 ... -
分组抽取连续num
2009-11-18 17:30 764对于一个表的字段,首先同内容分组,组内抽取从1开始的连续编码, ... -
对特定session进行跟踪
2009-10-15 15:12 632accept p_osuser prompt 'OSUSE ... -
表主要信息抽出
2009-06-10 15:36 637SELECT A.COLUMN_NAME, A ... -
各种数据库分页SQL总结
2009-02-12 15:02 8611. Oracle,使用3层嵌套 引用 SELECT * ...
相关推荐
**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:解析化学光谱数据的利器》 在信息技术日益发达的今天,Python作为一门强大的编程语言,以其简洁的语法和丰富的库资源深受开发者喜爱。当我们谈论Python库时,往往是在讨论那些能够...
在编程语言领域,编译器是将源代码转换为目标代码的关键工具,而词法分析器(Lexer 或 Lex)则是编译器的第一步,它负责将源代码分解成一系列有意义的单元,即“词法单元”或“标记”(tokens)。本项目 "Lexer-...
标题"C_Compiler_Lexer_SimpleVersion.zip"指的是一个关于C语言词法分析器的简单实现,这通常涉及编译原理中的一个重要阶段。词法分析器(也称为扫描器或lexer)是编译器的第一个组成部分,它将源代码分解成一系列有...
标题“run_Lexer1.zip”表明这可能是一个包含Python编程相关的项目压缩包,其中的主程序名为“run_Lexer1.py”。描述提到这个程序实现了对文本内容的识别,暗示了它可能是一个词法分析器(Lexer)或扫描器,这是编译...
资源分类: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”似乎专注于编译器设计的一个核心部分,即词法分析器(Lexer)和解析器(Parser)的分离,以及抽象语法树(AST)的构建。 首先,词法分析器(Lexer)是编译器的第一阶段,...
要对查询进行词法处理并写回字符串: extern crate sql_lexer;fn main () { let sql = sql_lexer :: lex ( "SELECT * FROM `table`" . to_string ()). lex (); println! ( "{}" , sql_lexer :: write (sql));} 要...
其中,词法分析器(Lexer或Scanner)是编译器的第一步,它负责识别源代码中的各种符号,将其转化为一个个有意义的标记(Token)。在"2021-1-10 FSM_Lexer.zip"这个压缩包中,我们看到的是一个名为"zhangqi-lang"的...
输入:所给文法的源程序字符串 输出:二元组(syn, token或sum)构成的序列。其中syn 为单词种别码;token 为存放的单词自身字符串;sum为整型常量(作为常量的值)。实现时,可将单词的二元组用结构进行处理
3. 设置词法分析器(lexer):Oracle提供了多种词法分析器,如basic_lexer、chinese_vgram_lexer和chinese_lexer等。不同的词法分析器适用于不同的语言和字符集。 三、词法分析器(lexer) 词法分析器是Oracle全文...
Oracle 提供了针对不同语言的 lexer,例如 basic_lexer(默认,适用于英语)、chinese_vgram_lexer(专为汉语设计)和 chinese_lexer(优化后的汉语分析器,支持 UTF8 字符集)。 在使用 Oracle Text 时,需要关注 ...
在本项目"lexer_C语言_firstwbh_C++_visualc++_"中,开发者使用C++编程语言构建了一个词法分析器,其主要目标是解析名为SNL(Simple Notation Language)的自定义教学语言。开发环境是Microsoft的Visual Studio 2017...
5. **Chinese_lexer失败**:如果使用`chinese_lexer`时遇到问题,如ORA-29855和DRG-10502错误,可能是因为`chinese_lexer`只支持UTF8字符集。解决方法是接受`chinese_vgram_lexer`的限制,或者冒着可能导致应用无法...
Oracle的全文索引利用了其专利的词法分析器(lexer),将文本内容拆解成表意单元(term),并存储在以dr$开头的一系列系统表中,包括每个term的位置、频率和哈希值等信息,以供后续的搜索使用。 Oracle 提供了多种...
使用时需要对目标用户授权,例如`grant ctxapp to crmuser`,并为特定用户如`crmuser`授予执行`ctx_ddl`包的权限。 在Oracle Text中,可以自定义全文索引分析器,如设置为支持中文的`CHINESE_LEXER`。这有助于提高...
然而,Oracle Text 也存在一些缺陷,例如在使用中也发觉有遗憾的地点,Oracle Text 不管使用何种过滤器(INSO_FILTER 或 NULL_FILTER)及何种词法分析器(BASIC_LEXER, CHINESE_VGRAM_LEXER 依旧 CHINESE_LEXER)都...