Full Scanを速くしちゃう~Oracle Text編~その4

投稿日: 2010年12月08日

<Full Scanを速くしちゃう~Oracle Text編~その4>
ペンネーム: グリーンぺぺ

Oracle Textを利用する際に検索にヒットしない語句が出現する場合がある。
Oracle Textは日本語の語彙用語集(レキシコン)の組合せに存在するものを
索引として作成している。日本語レキシコンは以下のディレクトリに存在し
以下のコマンドで可読化することができる。

■$ORACLE_HOME/ctx/data/jalxにあるレキシコンを可読化する

$ ls -n $ORACLE_HOME/ctx/data/jalx
-rw-r--r-- 1 781 781 7641661 10月 20 17:23 droldJA.dat
-rw-r--r-- 1 781 781 1110128 10月 20 17:23 droliJA.dat
-rw-r--r-- 1 781 781   76894 10月 20 17:23 drolkJA.dat
-rw-r--r-- 1 781 781       8  9月 21 16:26 drolsJA.dat

$ ctxlc -ja -ocs JA16EUC > output.txt

$ head output.txt
あいあい
あいうえお
あいさつ
あいそ
あいだ
あいつ
あいにく
あいまい
あいまって
あうん

ctxlcコマンドを使用すればレキシコンに語彙追加することもできる。

■語彙追加コマンド例

$ ctxlc -ja -ics JA16EUC -i 追加する語彙ファイル

詳細は↓を参照して頂きたい。
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/text.102/B19214-01/cexec.htm#i1006575

更にOracle Textにはユーザからどのような全文検索が実行されているのか
ログを取得するモジュールも用意されている。

■Oracle Text問合せログの取得
–ログ取得開始(ログ名:query.log)

exec ctx_output.start_query_log('query.log');
--問合せ実行
select TITLE,ARTIST from scott.ranking where contains(lyric,'思いこんだら')>0;
select TITLE,ARTIST from ranking where contains(lyric,'デジャヴをリプレイ')>0;
select TITLE,ARTIST from ranking where contains(lyric,'デヂャブをリプレイ')>0;
select TITLE,ARTIST from ranking where contains(lyric,'fuzzy(デヂャブをリプレイ,,,n)')>0;
select TITLE,ARTIST from ranking where contains(lyric,'syn(実際,my_thes)')>0;
select TITLE,ARTIST from ranking where contains(lyric,'tr(本当,english,my_thes)')>0;
select TITLE,ARTIST from ranking where contains(lyric,'trsyn(本当,english,my_thes)')>0;
select TITLE,ARTIST from ranking where contains(lyric,'バイバイ バイヨン')>0;
select TITLE,ARTIST from ranking where contains(lyric,'不安が騒いで眠れなくなる')>0;
select TITLE,ARTIST from ranking where contains(lyric,'バイ バイヨン')>0;

–ログ取得終了

exec ctx_output.end_query_log;

–ログ確認
※デフォルトのログ出力先は以下ディレクトリになる

$ cat $ORACLE_HOME/ctx/log/query.log
14:35:22 10/22/10   IX_LYRIC  思いこんだら  Yes
14:35:22 10/22/10   IX_LYRIC  デジャヴをリプレイ  Yes
14:35:22 10/22/10   IX_LYRIC  デヂャブをリプレイ  No
14:35:22 10/22/10   IX_LYRIC  fuzzy(デヂャブをリプレイ,,,n)  Yes
14:35:22 10/22/10   IX_LYRIC  syn(実際,my_thes)  Yes
14:35:24 10/22/10   IX_LYRIC  tr(本当,english,my_thes)  Yes
14:35:25 10/22/10   IX_LYRIC  trsyn(本当,english,my_thes)  Yes
14:35:25 10/22/10   IX_LYRIC  バイバイ バイヨン  Yes
14:35:25 10/22/10   IX_LYRIC  不安が騒いで眠れなくなる  Yes
14:35:25 10/22/10   IX_LYRIC  バイ バイヨン  No 

xml形式のログファイルだと見づらいので見やすくレポートしてくれるパッケージが用意されている。

–ctxsysユーザでログイン

sqlplus ctxsys/???

–Oracle Text問合せログの出力

set serveroutput on;
declare
   the_queries ctx_report.query_table;
begin
   ctx_report.query_log_summary('query.log', null, the_queries,
                   row_num=>10, most_freq=>TRUE, has_hit=>TRUE);
   dbms_output.put_line('The 10 most frequent queries returning hits');
   dbms_output.put_line('number of times  query string');
   for i in 1..the_queries.count loop
     dbms_output.put_line(the_queries(i).times||'                '||the_queries(i).query);
   end loop;
end;
/

The 10 most frequent queries returning hits
number of times  query string
1                デジャヴをリプレイ
1                バイバイ バイヨン
1                syn(実際,my_thes)
1                trsyn(本当,english,my_thes)
1                fuzzy(デヂャブをリプレイ,,,n)
1                tr(本当,english,my_thes)
1                不安が騒いで眠れなくなる
1                思いこんだら

PL/SQLプロシージャが正常に完了しました。

■まとめ
Oracle Textは新たにオプションの購入の必要はなく、使い勝手のよい全文検索
エンジンだといえる。語彙字句についてもデフォルトのままで利用しても何ら
不足に感じる場合はないのではないだろうか。仮に不足があったとしても
問合せのログ出力にまで対応しているので問合せ精度を高めるようメンテナンス
をすることも可能となっている。積極的に取り込んでいきたい機能のひとつ
であるといえる。