Oracle 散策

第1回 全文検索
第2回 Oracle9i(試用版)を Red Hat Linux9にインストールする
第3回 Oracle10g(試用版)を WindowsXPにインストールする
第4回 ODP.NET を使ってみる
第5回 ODP.NET を使ってみる(2)
第6回 ODP.NET を使ってみる(3)

第1回 全文検索

訳あって、Oracle Textを調べる機会があったので、簡単な使い方 をまとめてみました。

一般的にデータベースシステムは、定型データを扱うように設計 されています。定型データとは、社員情報を例にすると、まず、 氏名や所属、内線番号、勤務場所、入社年度、性別、住所といった 扱おうとする項目と、その各項目の大きさ(例えば氏名は80文字) があらかじめ決められているものです。

一方、インターネットの普及により、さまざまな文書やテキストを閲覧・ 入手することができるようになりました。そして、情報が増えれば 増えるほど、自分の欲しい情報をいかに速く検索できるかが重要に なってきます。

しかし、このような情報は定型なテキストデータではありません。 Oracle Textは、この非定型テキストデータを対象として、テキスト 検索を行います。全文検索とも言います。

Oracle Textでは、

のような表記のゆれを考慮した検索ができます。 さらに、定型データとの連携ができるのも大きな特徴です。 使い方の手順です。

手順1:検索対象となる表を作成します。
    SQL> CREATE TABLE texttest (
      2      no    NUMBER,
      3      text  VARCHAR2(100));

    SQL> INSERT INTO texttest VALUES(1, 'abc株式会社');
    SQL> INSERT INTO texttest VALUES(2, 'abc学校');
    SQL> INSERT INTO texttest VALUES(3, '有限会社ABC商事');
    SQL> INSERT INTO texttest VALUES(4, 'シティ・ホール');
    SQL> INSERT INTO texttest VALUES(5, 'シティホール');
    SQL> INSERT INTO texttest VALUES(6, 'シティ ホール');
    SQL> INSERT INTO texttest VALUES(7, 'ABC会館');
手順2:プリファレンスを作成します。
    SQL> BEGIN
      2> ctx_ddl.create_preference('japanese_lexer', 'JAPANESE_LEXER');
      3> END;
      4> /
手順3:索引の作成
    SQL> CREATE INDEX texttest_index ON texttest(text)
      2>  INDEXTYPE IS ctxsys.context
      3>  PARAMETERS('lexer japanese_lexer');

再作成は、

    SQL> ALTER INDEX texttest_index REBUILD;

手順4:検索
    SQL> SELECT * FROM texttest
      2> WHERE CONTAINS (text, 'abc') > 0;

各手順について説明します。

手順1について

ここでは、サンプルとして texttest表を作成し、'abc' を含む いくつかの文字列を挿入しています。 内容を確認すると、

SQL> col text format a40
SQL> select * from texttest;

        NO TEXT
---------- ----------------------------------------
         1 abc株式会社
         2 abc学校
         3 有限会社ABC商事
         4 シティ・ホール
         5 シティホール
         6 シティ ホール
         7 ABC会館

7行が選択されました。

となります。

手順2について

Oracle Textでは、索引を作成すると、検索対象のテキストを 「トークン」と呼ばれる短い文字列に分解し、その出現位置とと もに索引に格納します。 このテキストをトークンに分解するものを「レクサ」と呼びます。

索引を作成するには、CREATE INDEX 文に INDEXTYPE句と PARAMETER 句を指定します。このPARAMETER句の形式は、

    PARAMETERS('プリファレンス・クラス プリファレンス名')

です。

例えば、どのようなレクサを使うかといったオプションを指定する には、プリファレンス・クラスに LEXER を指定します。

ここでは、JAPANESE_LEXER というレクサを持つプリファレンスを 作成しています。ここで作成したプリファレンスを手順3の CREATE INDEX文で指定します。

通常のインデックスは、表にデータを挿入あるいは、表データを修正 した時点でインデックスが更新されますが、このインデックスは、 表のデータが修正されても更新されません。明示的にインデックスの 再作成を行う必要があります。

CTX_DDLパッケージを実行するには、CTXAPPロールが付与されて いる必要があります。以下のエラーが発生したときは、CTXAPP ロールを付与してください。

ctx_ddl.create_preference('japanese_lexr', 'JAPANESE_LEXER');
*
行2でエラーが発生しました。:
ORA-06550: 行2、列1:
PLS-00201: 識別子CTX_DDLを宣言してください。
ORA-06550: 行2、列1:
PL/SQL: Statement ignored
CTXAPPロールの付与
SQL> connect ctxsys/xxxx
SQL> grant ctxapp to user; (userは、ctx_ddlを実行するユーザ名)
SQL> connect user/xxxx

手順3について

CREATE INDEX文で、テキスト索引を作成します。 INDEXTYPE IS ctx.context で、テキスト索引であることを指定し ています。PARAMETERS句で、手順2で作成したプリファレンスを 指定しています。これにより、レクサとして JAPANESE_LEXER が 使用されます。

索引が作成されると、索引表という表が作成されます。索引表の 名前は、DR$索引名$表名 となります。 以下のように4つの表が作成されていることが分かります。

SQL> select table_name from user_tables
  2  where table_name like 'DR$TEXTTEST_INDEX$%';

TABLE_NAME
------------------------------
DR$TEXTTEST_INDEX$I
DR$TEXTTEST_INDEX$K
DR$TEXTTEST_INDEX$N
DR$TEXTTEST_INDEX$R

SQL> 

この4つの索引表のうち、$I表にトークンが格納されています。

SQL> select token_text from DR$TEXTTEST_INDEX$I;

TOKEN_TEXT
----------------------------------------------------------------
ABC
シティ
ホール
会館
会社
学校
株式
商事
有限

9行が選択されました。

SQL> 

このように分解されていることが分かります。また、いわるる全角のABC と小文字のabcがここに現れていないことからどちらも半角のABCに変換されていることや、 「・」のような文字は対象になっていないことがわかります。

手順4について

実際の検索です。テキスト検索の場合は、WHERE句に CONTAINS句 を指定します。CONTAINS句では、列名と検索文字列を指定します。 > 0 は、ヒットしたものすべてという意味です。

 検索文字列を 'ABC' として実行すると、

SQL> select * from texttest where contains(text, 'ABC') > 0;

        NO TEXT
---------- ----------------------------------------
         7 ABC会館
         3 有限会社ABC商事
         2 abc学校
         1 abc株式会社

SQL>

となります。

Likeを使った検索では以下のようになります。

SQL> select * from texttest where text like '%ABC%';

        NO TEXT
---------- ----------------------------------------
         3 有限会社ABC商事

SQL>

第1回終わり(シ) 次回(第2回)へ

このページトップへ


Copyright (c) 2003 OKI Software Co., Ltd.