概要(列ABSTRACT)の内容から'#'で始まるタグを抽出し、ファイルの検索に利用します。
タグの抽出にはAPEX_STRING_UTIL.FIND_TAGSを使用します。
せっかくタグを抽出するので、それをマルチバリュー・ファセットとして使うファセット検索のページを作成します。
以下の動作をするページを作成します。
タグの抽出処理の追加
表SFM_CONTENTSに列TAGSを追加します。抽出したタグはJSON配列として保存します。Autonomous DatabaseのDB19cを想定しているため、format osonの指定を加えています。
alter table sfm_contents add (tags blob check (tags is json format oson));ページ番号3のフォームのページに、新たにプロセスを追加します。
プロセスの識別の名前はタグの抽出とし、タイプはコードの実行を選択します。実行するPL/SQLコードとして以下を記述します。
update sfm_contents set tags =
json_object(apex_string_util.find_tags(:P3_ABSTRACT))
where id = :P3_ID;
サーバー側の条件として、タイプにリクエストは値に含まれるを選択し、値としてCREATE SAVEを設定します。
ファイルの削除の下、ダイアログを閉じる - ファイル無しの上に配置します。
ファセット検索の追加
ファセット検索のページを作成します。
ページの作成を実行します。
ファセット検索を選択します。
ページ定義の名前はファセット検索とします。データ・ソースのソース・タイプにSQL問合せを選択し、SQL SELECT文を入力に以下を記述します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
select | |
id | |
,version | |
,title | |
,abstract | |
,content_filename | |
,content_mimetype | |
,json_serialize(tags) tags | |
from sfm_contents |
ナビゲーションはデフォルトから変更しません。デフォルトの設定で、ブレッドクラムとナビゲーション・メニューが作成されます。
次へ進みます。
表示形式はレポート、ファセットとして使用する列としてCONTENT_MIMETYPEとTAGSを選択します。
ページの作成を実行します。
ファセット検索のページが作成されます。
ファセットP5_TAGSは、JSON配列をデータとしたマルチバリュー・ファセットです。
自動的に認識されていないため、複数の値のタイプをJSON配列に変更します。フィルタの結合はAND(論理積)を選択しています。
レポート検索結果の列IDとVERSIONの識別のタイプを非表示に変更します。
対話モード・レポートと同様に、タイトルをクリックしてファイルのダウンロードができるように、HTML式として以下を記述します。
<a href="&G_DOWNLOAD_URL.#ID#&session=&APP_SESSION.">#TITLE#</a>
検索ファセットのデフォルトはRow Searchになっています。Row Searchの代わりにOracle Textを使うこともできます。
ファセットP5_SEARCHの設定の検索タイプをOracle Textに変更し、ソースのデータベース列をTITLEに限定します。列TITLEに作成した全文検索索引はユーザー・データストアを構成することにより、列TITLE、ABSTRACTそれとファイルの内容を元に作成されています。
以上でファセット検索のページは完成です。
ページを実行すると、先頭のGIF動画のように動作します。
今回作成したアプリケーションのエクスポートを以下に置きました。ファセット検索のページが追加されています。
https://github.com/ujnak/apexapps/blob/master/exports/simple-file-manager-tags.zip
APEX_STRING_UTIL.FIND_TAGSの問題
#で始まるタグが複数連続しているときに、1つの空白で分割されていると後続のタグが認識されません。空白が2つ以上あると複数のタグとして認識されます。
例えば、以下を実行すると結果は#日本だけになります。
select column_value from table(apex_string_util.find_tags('#日本 #北海道'));
空白が2つで分割されていると、#日本と#北海道になります。
select column_value from table(apex_string_util.find_tags('#日本 #北海道'));
空白の代わりにカンマで区切っても結果は同じです。
select column_value from table(apex_string_util.find_tags('#日本,#北海道'));
すでに開発元に報告済みの不具合のようです。
完