この章では、XML問合せの結果セット・インタフェースの使用方法について説明します。内容は次のとおりです。
アプリケーション内の検索結果のページは、多くの異種要素(最初のいくつかのドキュメントのメタデータ、合計ヒット数、ワード当たりのヒット数など)で構成されます。以前のバージョンのOracle Textでこれらの結果を生成するには、複数の問合せとコール(元表に対する問合せやCTX_QUERY.COUNT_HITSのコールなど)が必要でした。追加のコールのたびに、問合せを再解析して索引メタデータを検索するための時間がかかります。また、SQLでは、反復問合せ絞込みや上位10の内訳といった一部の検索操作が難しくなります。SQL文を構成して目的の結果を達成することが可能であっても、通常はこのようなSQLは次善の選択となります。
結果セット・インタフェースは、検索結果のページに必要な様々な種類のデータを同時に作成でき、オーバーヘッドを共有することでパフォーマンスを向上させます。結果セット・インタフェースは、SQLでは表現しにくいデータ・ビュー(カテゴリ問合せによる上位Nなど)も戻すことができます。
CTX_QUERY.RESULT_SET() APIにより、複数のCONTAINS()問合せで結果を取得することなく単一の問合せで問合せ結果を取得できます。たとえば、検索結果ページを表示するには、次の情報を最初に取得する必要があります。
日時および関連性でソートされた上位20個のヒット・リスト
指定されたテキスト問合せのヒットの総数
公開日でグループ化した件数
作成者でグループ化した件数
検索するドキュメントを格納する次の表定義を前提とします。
create table docs ( docid number, author varchar2(30), pubdate date, title varchar2(60), doc clob);
次のOracle Text索引の定義を前提とします。
create index docidx on docs(doc) indextype is ctxsys.context filter by author, pubdate, title, order by pubdate;
これらの定義を使用する場合、4つのSQL文を発行することによって、検索結果ページを表示するための4つの情報を取得できます。
-- Get top 20 hits sorted by date and relevancy select * from (select /*+ first_rows */ rowid, title, author, pubdate from docs where contains(doc, 'oracle',1)>0 order by pubdate desc, score(1) desc) where rownum < 21; -- Get total number of hits for the given Text query select count(*) from docs where contains(doc, 'oracle',1)>0; -- Get counts group by publication date select pubdate, count(*) from docs where contains(doc, 'oracle',1)>0 group by pubdate; -- Get counts group by author select author, count(*) from docs where contains(doc, 'oracle',1)>0 group by author;
表示されているとおり、同じ問合せを4回実行しているため、別々のSQL文を使用するとリソース集中型の問合せになります。ただし、CTX_QUERY.RESULT_SET()を使用すると、単一のOracle Textの問合せにこのすべての情報を入力できます。
declare
rs clob;
begin
dbms_lob.createtemporary(rs, true, dbms_lob.session);
ctx_query.result_set('docidx', 'oracle text performance tuning', '
<ctx_result_set_descriptor>
<count/>
<hitlist start_hit_num="1" end_hit_num="20" order="pubDate desc,
score desc">
<score/>
<rowid/>
<sdata name="title"/>
<sdata name="author"/>
<sdata name="pubDate"/>
</hitlist>
<group sdata="pubDate">
<count/>
</group>
<group sdata="author">
<count/>
</group>
</ctx_result_set_descriptor>
', rs);
-- Put in your code here to process the Output Result Set XML
dbms_lob.freetemporary(rs);
exception
when others then
dbms_lob.freetemporary(rs);
raise;
end;
/
結果セットの出力は、検索結果ページの作成に必要なすべての情報を含むXMLになります。
<ctx_result_set>
<hitlist>
<hit>
<score>90</score>
<rowid>AAAPoEAABAAAMWsAAC</rowid>
<sdata name="TITLE"> Article 8 </sdata>
<sdata name="AUTHOR">John</sdata>
<sdata name="PUBDATE">2001-01-03 00:00:00</sdata>
</hit>
<hit>
<score>86</score>
<rowid>AAAPoEAABAAAMWsAAG</rowid>
<sdata name="TITLE"> Article 20 </sdata>
<sdata name="AUTHOR">John</sdata>
<sdata name="PUBDATE">2001-01-03 00:00:00</sdata>
</hit>
<hit>
<score>78</score>
<rowid>AAAPoEAABAAAMWsAAK</rowid>
<sdata name="TITLE"> Article 17 </sdata>
<sdata name="AUTHOR">John</sdata>
<sdata name="PUBDATE">2001-01-03 00:00:00</sdata>
</hit>
<hit>
<score>77</score>
<rowid>AAAPoEAABAAAMWsAAO</rowid>
<sdata name="TITLE"> Article 37 </sdata>
<sdata name="AUTHOR">John</sdata>
<sdata name="PUBDATE">2001-01-03 00:00:00</sdata>
</hit>
...
<hit>
<score>72</score>
<rowid>AAAPoEAABAAAMWsAAS</rowid>
<sdata name="TITLE"> Article 56 </sdata>
<sdata name="AUTHOR">John</sdata>
<sdata name="PUBDATE">2001-01-03 00:00:00</sdata>
</hit>
</hitlist>
<count>100</count>
<groups sdata="PUBDATE">
<group value="2001-01-01 00:00:00"><count>25</count></group>
<group value="2001-01-02 00:00:00"><count>50</count></group>
<group value="2001-01-03 00:00:00"><count>25</count></group>
</groups>
<groups sdata="AUTHOR">
<group value="John"><count>50</count></group>
<group value="Mike"><count>25</count></group>
<group value="Steve"><count>25</count></group>
</groups>
</ctx_result_set>
|
関連項目: 構文の詳細は、『Oracle Textリファレンス』を参照してください。 |