GF23 JAVADOCクラス定義ファイル
	概要説明		DESCRIPTION	X(4000)
	内容			CONTENTS	CLOB
	形式サンプル	FORM_SAMPLE	CLOB

GF24 JAVADOC属性定義ファイル
	概要説明	DESCRIPTION	X(4000)
	内容		CONTENTS	CLOB

GF25 JAVADOC属性クラス定義ファイル
	属性名称		VALUENAME	X(30)
	概要説明		DESCRIPTION	X(4000)
	内容			CONTENTS	CLOB
	形式サンプル	FORM_SAMPLE	CLOB

①複数列のデータストア・プリファレンスを作成します。


EXEC CTX_DDL.DROP_PREFERENCE('GF23_TXT');
EXEC CTX_DDL.DROP_PREFERENCE('GF24_TXT');
EXEC CTX_DDL.DROP_PREFERENCE('GF25_TXT');

BEGIN
	CTX_DDL.CREATE_PREFERENCE('GF23_TXT', 'MULTI_COLUMN_DATASTORE');
	CTX_DDL.SET_ATTRIBUTE('GF23_TXT', 'COLUMNS', 'DESCRIPTION, CONTENTS, FORM_SAMPLE');
END;

BEGIN
	CTX_DDL.CREATE_PREFERENCE('GF24_TXT', 'MULTI_COLUMN_DATASTORE');
	CTX_DDL.SET_ATTRIBUTE('GF24_TXT', 'COLUMNS', 'DESCRIPTION, CONTENTS');
END;

BEGIN
	CTX_DDL.CREATE_PREFERENCE('GF25_TXT', 'MULTI_COLUMN_DATASTORE');
	CTX_DDL.SET_ATTRIBUTE('GF25_TXT', 'COLUMNS', 'VALUENAME, DESCRIPTION, CONTENTS, FORM_SAMPLE');
END;


②.インデックスの作成。
  CTXSYS.CONTEXT で、先ほどの、DATASTORE を指定します。

--  CTX_DDL.CREATE_PREFERENCE('MY_MULTI','MULTI_COLUMN_DATASTORE');
--  CTX_DDL.SET_ATTRIBUTE('MY_MULTI', 'COLUMNS','foo,bar');

  複数列のデータストアは、foo列およびbar列の内容をフェッチして、barをフィルタ処理し、
  複合ドキュメントを次のように構成します。
	<FOO>
	foo contents
	</FOO>
	<BAR>
	bar filtered contents (probably originally HTML)
	</BAR>


--CREATE INDEX GF23_TXT_IDX ON GF23(FGJ)
--	INDEXTYPE IS CTXSYS.CONTEXT
--	PARAMETERS ('DATASTORE GF23_TXT');
--
--CREATE INDEX GF24_TXT_IDX ON GF24(FGJ)
--	INDEXTYPE IS CTXSYS.CONTEXT
--	PARAMETERS ('DATASTORE GF24_TXT');
--
--CREATE INDEX GF25_TXT_IDX ON GF25(FGJ)
--	INDEXTYPE IS CTXSYS.CONTEXT
--	PARAMETERS ('DATASTORE GF25_TXT');


④.日本語用のﾚｸｻｰも追加します。
  JAPANESE_LEXER と JAPANESE_VGRAM_LEXER がありますが、JAPANESE_LEXER を使用します。
  これは、文をワードに変換するために、内部ディクショナリが参照されます。
  トークンを固定文字数ごとに切り出す JAPANESE_VGRAM_LEXER と比較して、
  小型の索引の生成、問合せ応答時間の短縮、実ワード・トークンの生成による問合せ精度の向上 という
  利点がありますが、索引付けに要する時間は、JAPANESE_VGRAM_LEXERを使用した場合より長くなります。

BEGIN
	CTX_DDL.CREATE_PREFERENCE('JPN_LX','JAPANESE_LEXER');
END;

  ※ MULTI_COLUMN_DATASTORE のインデックスは、ダミーのカラムを用意するらしい。
		Oracle Textリファレンス 11g リリース1（11.1）E05789-02
		2.2.2.1 索引付けとDML
			索引付けには、CREATE INDEX文で指定するダミー列を作成する必要があります。
			ダミー列の内容は、その列名が列属性で指定されていないかぎり、仮想ドキュメントの一部にはなりません。
			索引は、ダミー列の更新時にのみ同期化されます。必要に応じて、変更内容を伝播するために
			トリガーを作成できます。

  ※ 良く判らないので、とりあえず FGJ の実カラムにインデックスを指定してみます。

DROP INDEX GF23_TXT_IDX;
DROP INDEX GF24_TXT_IDX;
DROP INDEX GF25_TXT_IDX;

CREATE INDEX GF23_TXT_IDX ON GF23 (FGJ)
	INDEXTYPE IS CTXSYS.CONTEXT
	PARAMETERS ('DATASTORE GF23_TXT LEXER JPN_LX');

CREATE INDEX GF24_TXT_IDX ON GF24(FGJ)
	INDEXTYPE IS CTXSYS.CONTEXT
	PARAMETERS ('DATASTORE GF24_TXT LEXER JPN_LX');

CREATE INDEX GF25_TXT_IDX ON GF25(FGJ)
	INDEXTYPE IS CTXSYS.CONTEXT
	PARAMETERS ('DATASTORE GF25_TXT LEXER JPN_LX');


⑤全文検索用のトークンが参照できる。GF70_PATH_IDX はさっき作ったインデックスを指定します。
select count(*) from DR$GF23_TXT_IDX$I ;
select count(*) from DR$GF24_TXT_IDX$I ;
select count(*) from DR$GF25_TXT_IDX$I ;
SELECT TOKEN_TEXT FROM DR$GF23_TXT_IDX$I ORDER BY TOKEN_TEXT;


⑥検索してみます。
SELECT * FROM GF23 WHERE CONTAINS (FGJ, 'オラクル') > 0
	and verno = (select max(verno) from GF23);


SELECT * FROM GF24 WHERE CONTAINS (FGJ, 'デフォルト') > 0
	and verno = (select max(verno) from GF24);


SELECT * FROM GF25 WHERE CONTAINS (FGJ, 'Reader') > 0
	and verno = (select max(verno) from GF25);

=====================================================
テキスト索引の同期化
EXEC CTX_DDL.SYNC_INDEX( 'GF23_TXT_IDX' );

テキスト索引のメンテナンス
EXEC CTX_DDL.OPTIMIZE_INDEX( 'GF23_TXT_IDX','FAST' );

削除されて既に検索対象表に存在していないトークンを削除
EXEC CTX_DDL.OPTIMIZE_INDEX( 'GF23_TXT_IDX','FULL' );

=====================================================
⑦SNIPPET
  ドキュメントの用語索引を作成するには、CTX_DOC.SNIPPETプロシージャを使用します。
  用語索引とは、問合せ語句とその前後のテキストを含むテキストの断片（フラグメント）です。
  この用語索引は、マークアップされた問合せキーワードを前後のテキストと一緒に戻すため、
  文脈付きキーワード（KWIC）としても知られており、ユーザーは問合せキーワードを文脈で評価できます。

SELECT UNIQ FROM GF23 WHERE CONTAINS (FGJ, 'オラクル') > 0
and verno = (select max(verno) from GF23)
結果、UNIQ = 43733 の SNIPPET を求める。
select CTX_DOC.SNIPPET('GF23_TXT_IDX','43733','オラクル') from dual

実際には、プライマリキーを JOIN することで、検索結果の 用語索引
を取り出すことができます。

select CTX_DOC.SNIPPET('GF23_TXT_IDX',UNIQ,'オラクル')
	from GF23
	WHERE CONTAINS (FGJ, 'オラクル') > 0
	and verno = (select max(verno) from GF23)


スコアを戻すには、SCORE演算子を指定します。
逆順に表示すれば、スコアの高い順に表示できます。

select SCORE(1),CTX_DOC.SNIPPET('GF23_TXT_IDX',UNIQ,'オラクル')
	from GF23
	WHERE CONTAINS (FGJ, 'オラクル',1) > 0
	and verno = (select max(verno) from GF23)
	ORDER BY SCORE(1) DESC ;

表示件数を絞るには、副問合せで、ROWNUM を使います。
件数を絞り込んでから、SNIPPET を表示させます。

select SCR,CTX_DOC.SNIPPET('GF23_TXT_IDX',UNIQ,'オラクル') as TXT
from (
	select SCORE(1) as SCR,UNIQ
		from GF23
		WHERE CONTAINS (FGJ, 'オラクル',1) > 0
		and verno = (select max(verno) from GF23)
		ORDER BY SCORE(1) DESC
)
where rownum < 11


