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