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('MCDS_23');

BEGIN
	CTX_DDL.CREATE_PREFERENCE('MCDS_23', 'MULTI_COLUMN_DATASTORE');
	CTX_DDL.SET_ATTRIBUTE('MCDS_23', 'columns', 'DESCRIPTION, CONTENTS, FORM_SAMPLE');
END;

BEGIN
	CTX_DDL.CREATE_PREFERENCE('MCDS_24', 'MULTI_COLUMN_DATASTORE');
	CTX_DDL.SET_ATTRIBUTE('MCDS_24', 'columns', 'DESCRIPTION, CONTENTS');
END;

BEGIN
	CTX_DDL.CREATE_PREFERENCE('MCDS_25', 'MULTI_COLUMN_DATASTORE');
	CTX_DDL.SET_ATTRIBUTE('MCDS_25', '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(FORM_SAMPLE)
	INDEXTYPE IS CTXSYS.CONTEXT
	PARAMETERS ('DATASTORE MCDS_23');

CREATE INDEX GF24_TXT_IDX ON GF24(CONTENTS)
	INDEXTYPE IS CTXSYS.CONTEXT
	PARAMETERS ('DATASTORE MCDS_24');

CREATE INDEX GF25_TXT_IDX ON GF25(FORM_SAMPLE)
	INDEXTYPE IS CTXSYS.CONTEXT
	PARAMETERS ('DATASTORE MCDS_25');


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

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

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

DROP INDEX GF70_PATH_IDX;


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

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

CREATE INDEX GF25_TXT_IDX ON GF25(FORM_SAMPLE)
	INDEXTYPE IS CTXSYS.CONTEXT
	PARAMETERS ('DATASTORE MCDS_25 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 (FORM_SAMPLE, 'オラクル') > 0
	and verno = (select max(verno) from GF23);


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


SELECT * FROM GF25 WHERE CONTAINS (FORM_SAMPLE, '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 (FORM_SAMPLE, 'オラクル') > 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 (FORM_SAMPLE, 'オラクル') > 0
	and verno = (select max(verno) from GF23)


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

select SCORE(1),CTX_DOC.SNIPPET('GF23_TXT_IDX',UNIQ,'オラクル')
	from GF23
	WHERE CONTAINS (FORM_SAMPLE, 'オラクル',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 (FORM_SAMPLE, 'オラクル',1) > 0
		and verno = (select max(verno) from GF23)
		ORDER BY SCORE(1) DESC
)
where rownum < 11


