4 Oracle Textでの問合せ
4.1 クエリの概要
Oracle Textの基本的な問合せでは、問合せ式を入力します。式は、通常はワードで、演算子を併用する場合と併用しない場合があります。式を満たすすべてのドキュメント(事前に索引付け済)が、各ドキュメントの関連性スコアとともに戻ります。スコアは、結果セットの中でドキュメントを順序付けるために使用できます。
Oracle Textの問合せを入力するには、SQLのSELECT
文を使用します。作成する索引のタイプに応じて、WHERE
句にCONTAINS
演算子またはCATSEARCH
演算子のいずれかを使用します。これらの演算子は、PL/SQLカーソル内など、SELECT
文を使用できる状況であれば、いつでもプログラムで使用できます。
CTXRULE
索引を使用してドキュメントを分類するには、MATCHES
演算子を使用します。
4.1.1 CONTAINSによる問合せ
CONTEXT
索引タイプを作成する場合は、CONTAINS
演算子を使用して問合せを入力する必要があります。大量のまとまったドキュメントのコレクションを索引付けするには、CONTEXT
索引タイプが最適です。
CONTAINS
演算子では、複数の演算子を使用して検索条件を定義できます。これらの演算子によって、論理、近接、ファジー、ステミング、シソーラスおよびワイルド・カードの各検索を入力できます。また、適切に構成された索引を使用すると、HTMLやXMLのような内部構造を持つドキュメントに対してセクション検索を入力することもできます。
CONTAINS
では、ABOUT
演算子を使用して、ドキュメント・テーマを検索できます。
4.1.1.1 CONTAINS SQL例
SELECT
文では、CONTAINS
演算子を使用してWHERE
句で問合せを指定します。また、ヒットリストのヒットごとにスコアを戻すには、SCORE
演算子を指定します。次の例では、問合せの入力方法を示します。
SELECT SCORE(1), title from news WHERE CONTAINS(text, 'oracle', 1) > 0;
次のように、ORDER
BY
句を使用して、結果を最も高いスコアのドキュメントから最も低いスコアのドキュメントに順序付けることができます。
SELECT SCORE(1), title from news WHERE CONTAINS(text, 'oracle', 1) > 0 ORDER BY SCORE(1) DESC;
CONTAINS
演算子の後には、> 0構文が必要です。この構文は、CONTAINS
演算子によって戻されるスコアの値が、戻される行に対してゼロより大きい必要があることを指定します。
SELECT
文でSCORE
演算子がコールされた場合、CONTAINS
演算子は、前述の例の3番目のパラメータで、スコア・ラベルの値を参照する必要があります。
4.1.1.2 CONTAINS PL/SQL例
PL/SQLアプリケーションでは、カーソルを使用して問合せ結果をフェッチできます。
次の例では、CONTAINS
問合せをNEWS
表に対して入力し、ワードoracleを含むすべての記事を検索します。ヒットしたもののうち上位10個のタイトルとスコアが出力されます。
declare rowno number := 0; begin for c1 in (SELECT SCORE(1) score, title FROM news WHERE CONTAINS(text, 'oracle', 1) > 0 ORDER BY SCORE(1) DESC) loop rowno := rowno + 1; dbms_output.put_line(c1.title||': '||c1.score); exit when rowno = 10; end loop; end;
この例では、カーソルFOR
ループを使用して、ヒットしたもののうち上位10個を取り出します。SCORE
演算子の戻り値に対して、別名scoreが宣言されています。カーソル・ドット表記法を使用して、スコアとタイトルが標準出力に出力されます。
4.1.1.3 CONTAINSによる構造化問合せ
構造化問合せは複合問合せとも呼ばれ、テキスト列を問い合せるCONTAINS
述語と、構造化データ列を問い合せる別の述語を持つ問合せです。
構造化問合せを入力するには、SELECT
文のWHERE
条件に構造化句を指定します。
たとえば、次のSELECT
文は、1997年10月1日以降に書かれた、ワードoracleを含む記事をすべて検索します。
SELECT SCORE(1), title, issue_date from news WHERE CONTAINS(text, 'oracle', 1) > 0 AND issue_date >= ('01-OCT-97') ORDER BY SCORE(1) DESC;
注意:
CONTAINS
で構造化問合せを入力できる場合でも、CTXCAT
索引を作成し、CATSEARCH
で問合せを発行することを検討してください。そのほうが構造化問合せのパフォーマンスが向上します。
4.1.2 CATSEARCHによる問合せ
CTXCAT
索引タイプを作成する場合は、CATSEARCH
演算子を使用して問合せを入力する必要があります。使用しているアプリケーションで、テキスト列に短いテキスト断片や関連列にその他の関連情報を格納する場合は、CTXCAT
索引タイプが最適です。
たとえば、オンライン・オークション・サイトを提供しているアプリケーションでは、表のテキスト列に品目の説明を格納し、その他の列に日付や価格などの関連情報を格納する場合があります。CTXCAT
索引を使用すると、これらの列の1つ以上にBツリー索引を作成できます。その結果、CATSEARCH
演算子を使用してCTXCAT
索引を検索すると、通常、複合問合せの問合せパフォーマンスが向上します。
CATSEARCH
による問合せに使用できる演算子は、AND
やOR
などの論理操作に制限されています。構造化基準の定義に使用できる演算子は、>、<、=、BETWEEN
およびIN
です。
4.1.2.1 CATSEARCH SQL問合せ
CATSEARCH
による一般的な問合せの例として、次のように、ワードcameraを含むすべての行を検索してbid_close
の日付順にソートする構造化句が組み込まれていることがあります。
SELECT FROM auction WHERE CATSEARCH(title, 'camera', 'order by bid_close desc')> 0;
入力できる構造化問合せのタイプは、サブ索引の作成方法によって異なります。
関連項目:
前述の例のように、CATSEARCH
問合せの構造化部分を指定するには、3番目のstructured_query
パラメータを使用します。構造化式で名前を指定する列には、対応するサブ索引が必要です。
たとえば、category_id
とbid_close
には、AUCTION
表のCTXCAT
索引内にサブ索引があるとします。この場合は、次のような構造化問合せを入力します。
SELECT FROM auction WHERE CATSEARCH(title, 'camera', 'category_id=99 order by bid_close desc')> 0;
4.1.2.2 CATSEARCH例
次の例は、CATSEARCH
問合せ内の問合せテンプレートにより、CONTEXT
文法を使用した、CTXCAT
索引に対するフィールド・セクション検索を示します。
-- Create and populate table create table BOOKS (ID number, INFO varchar2(200), PUBDATE DATE); insert into BOOKS values(1, '<author>NOAM CHOMSKY</author><subject>CIVIL RIGHTS</subject><language>ENGLISH</language><publisher>MIT PRESS</publisher>', '01-NOV-2003'); insert into BOOKS values(2, '<author>NICANOR PARRA</author><subject>POEMS AND ANTIPOEMS</subject><language>SPANISH</language> <publisher>VASQUEZ</publisher>', '01-JAN-2001'); insert into BOOKS values(1, '<author>LUC SANTE</author><subject>XML DATABASE</subject><language>FRENCH</language><publisher>FREE PRESS</publisher>', '15-MAY-2002'); commit;
-- Create index set and section group exec ctx_ddl.create_index_set('BOOK_INDEX_SET'); exec ctx_ddl.add_index('BOOK_INDEX_SET','PUBDATE'); exec ctx_ddl.create_section_group('BOOK_SECTION_GROUP', 'BASIC_SECTION_GROUP'); exec ctx_ddl.add_field_section('BOOK_SECTION_GROUP','AUTHOR','AUTHOR'); exec ctx_ddl.add_field_section('BOOK_SECTION_GROUP','SUBJECT','SUBJECT'); exec ctx_ddl.add_field_section('BOOK_SECTION_GROUP','LANGUAGE','LANGUAGE'); exec ctx_ddl.add_field_section('BOOK_SECTION_GROUP','PUBLISHER','PUBLISHER'); -- Create index create index books_index on books(info) indextype is ctxsys.ctxcat parameters('index set book_index_set section group book_section_group'); -- Use the index -- Note that: even though CTXCAT index can be created with field sections, it -- cannot be accessed using CTXCAT grammar (default for CATSEARCH). -- We need to use query template with CONTEXT grammar to access field -- sections with CATSEARCH select id, info from books where catsearch(info, '<query> <textquery grammar="context"> NOAM within author and english within language </textquery> </query>', 'order by pubdate')>0;
4.1.3 MATCHESによる問合せ
CTXRULE
索引タイプを作成する場合は、MATCHES
演算子を使用してドキュメントを分類する必要があります。CTXRULE
索引は、本来は分類を定義する問合せのセットに作成される索引です。
たとえば、ドキュメントの着信ストリームをドキュメントの内容に基づいて分類する必要がある場合は、カテゴリを定義する問合せのセットを作成できます。この問合せは、テキスト列の行として作成します。このタイプの表は、CTX_CLS.TRAIN
プロシージャを使用して作成することもできます。
次に、CTXRULE
索引を作成するために表を索引付けします。ドキュメントの着信時に、MATCHES
演算子を使用して各ドキュメントを分類します。
関連項目:
4.1.3.1 MATCHES SQL問合せ
MATCHES
問合せでは、指定したドキュメントに一致する問合せ表内のすべての行を検索します。表querytable
にCTXRULE
索引が関連付けられている場合、次の問合せを入力します。
SELECT classification FROM querytable WHERE MATCHES(query_string,:doc_text) > 0;
バインド変数:doc_text
には、分類されるドキュメントCLOB
が含まれています。
次の簡単な例に、すべてをまとめて示します。
create table queries ( query_id number, query_string varchar2(80) ); insert into queries values (1, 'oracle'); insert into queries values (2, 'larry or ellison'); insert into queries values (3, 'oracle and text'); insert into queries values (4, 'market share'); create index queryx on queries(query_string) indextype is ctxsys.ctxrule; select query_id from queries where matches(query_string, 'Oracle announced that its market share in databases increased over the last year.')>0
この問合せでは、問合せ1(ドキュメントにoracleというワードが表示される)および4(ドキュメントにmarket shareという語句が表示される)が返され、問合せ2(larryおよびellisonというワードは表示されない)および3(ドキュメント内にテキストがないため問合せに一致しない)は返されません。
この例では、簡略化するために、ドキュメントを文字列として渡しています。通常は、ドキュメントはバインド変数で渡されます。
MATCHES問合せで使用されるドキュメント・テキストは、VARCHAR2
またはCLOB
になります。BLOB
入力は使用できないため、フィルタ処理済のドキュメントに直接一致させることはできません。かわりに、AUTO_FILTER
フィルタを使用してバイナリ・コンテンツをCLOB
にフィルタ処理する必要があります。次の例では、ドキュメント・データがバインド変数:doc_blob
内にあることと、CTX_DOC.POLICY_FILTER
が使用できるポリシーmy_policy
がすでに定義されていることの2つを前提としています。次にその例を示します。
declare doc_text clob; begin -- create a temporary CLOB to hold the document text doc_text := dbms_lob.createtemporary(doc_text, TRUE, DBMS_LOB.SESSION); -- create a simple policy for this example ctx_ddl.create_preference(preference_name => 'fast_filter', object_name => 'AUTO_FILTER'); ctx_ddl.set_attribute(preference_name => 'fast_filter', attribute_name => 'OUTPUT_FORMATTING', attribute_value => 'FALSE'); ctx_ddl.create_policy(policy_name => 'my_policy', filter => 'fast_filter); -- call ctx_doc.policy_filter to filter the BLOB to CLOB data ctx_doc.policy_filter('my_policy', :doc_blob, doc_text, FALSE); -- now do the matches query using the CLOB version for c1 in (select * from queries where matches(query_string, doc_text)>0) loop -- do what you need to do here end loop; dbms_lob.freetemporary(doc_text); end;
テキストをCLOB
に取り込んでMATCHES
問合せを入力する必要があるため、プロシージャCTX_DOC.POLICY_FILTER
によりBLOB
をCLOB
データにフィルタ処理します。これは、CTX_DDL.CREATE_POLICY
を使用してすでに作成されたポリシーの名前を1つの引数として受け取ります。
関連項目:
CTX_DOC.POLICY_FILTER
の詳細は、『Oracle Textリファレンス』を参照してください
ファイルがデータベース・キャラクタ・セット内のテキストである場合、BFILE
を作成し、ファンクションDBMS_LOB.LOADFROMFILE
を使用してCLOB
にロードするか、UTL_FILE
を使用して、ファイルを一時的なCLOB
ロケータに読み込むことができます。
ファイルがAUTO_FILTER
フィルタ処理を必要とする場合は、ファイルをBLOB
にロードして、前述のように、CTX_DOC.POLICY_FILTER
をコールします。
関連項目:
拡張された分類の例は、「Oracle Textでのドキュメントの分類」を参照してください
4.1.3.2 MATCHES PL/SQL例
次の例では、問合せprofiles
の表にCTXRULE
索引が関連付けられていることが前提となります。また、表newsfeed
に分類対象の記事のセットが含まれていることも前提となります。
この例では、newsfeed
表内をループし、MATCHES
演算子を使用して各記事を分類します。結果は、results
表に格納されます。
PROMPT Populate the category table based on newsfeed articles PROMPT set serveroutput on; declare mypk number; mytitle varchar2(1000); myarticles clob; mycategory varchar2(100); cursor doccur is select pk,title,articles from newsfeed; cursor mycur is select category from profiles where matches(rule, myarticles)>0; cursor rescur is select category, pk, title from results order by category,pk; begin dbms_output.enable(1000000); open doccur; loop fetch doccur into mypk, mytitle, myarticles; exit when doccur%notfound; open mycur; loop fetch mycur into mycategory; exit when mycur%notfound; insert into results values(mycategory, mypk, mytitle); end loop; close mycur; commit; end loop; close doccur; commit; end;
次の例では、分類された記事をカテゴリ別に表示します。
PROMPT display the list of articles for every category PROMPT set serveroutput on; declare mypk number; mytitle varchar2(1000); mycategory varchar2(100); cursor catcur is select category from profiles order by category; cursor rescur is select pk, title from results where category=mycategory order by pk; begin dbms_output.enable(1000000); open catcur; loop fetch catcur into mycategory; exit when catcur%notfound; dbms_output.put_line('********** CATEGORY: '||mycategory||' *************'); open rescur; loop fetch rescur into mypk, mytitle; exit when rescur%notfound; dbms_output.put_line('** ('||mypk||'). '||mytitle); end loop; close rescur; dbms_output.put_line('**'); dbms_output.put_line('*******************************************************'); end loop; close catcur; end;
関連項目:
拡張された分類の例は、「Oracle Textでのドキュメントの分類」を参照してください
4.1.4 ワード問合せと句問合せ
ワード問合せは、ワードまたは句に対する問合せです。たとえば、テキスト表でワードdogを含むすべての行を検索するには、問合せ語句として、dogを指定して問合せを入力します。
ワード問合せは、SQL演算子のCONTAINS
とCATSEARCH
の両方で入力できます。ただし、句問合せは、異なる方法で解釈されます。
4.1.4.1 CONTAINS句問合せ
問合せ式に複数のワードが空白のみ(演算子なし)で区切られて含まれている場合、そのワードの文字列は句とみなされ、問合せ時に文字列全体が検索されます。
たとえば、句international lawを含むすべてのドキュメントを検索するには、句international lawを指定して問合せを入力します。
4.1.5 ストップワードの問合せ
ストップワードは、索引エントリが作成されないワードです。ストップワードは、通常、それ自体は検索の対象とならない、その言語の一般的なワードです。
Oracle Textには、使用言語のデフォルトのストップワード・リストが組み込まれています。このリストは、ストップリストと呼ばれます。たとえば、英語では、ワードthisおよびthatは、デフォルトのストップリストでストップワードとして定義されています。このデフォルトのストップリストを変更したり、CTX_DDL
パッケージを使用して新しいストップリストを作成できます。また、索引を作成した後で、ALTER INDEX
文でストップワードを追加することもできます。
ストップワードまたはストップワードのみで構成されている句に対する問合せは発行できません。たとえば、thisがストップワードとして定義されている場合は、ワードthisを問い合せても、ヒットは戻りません。
ただし、this boy talks to that girlのように、ストップワードとストップワード以外のワードが含まれている句を問い合せることはできます。これは、Oracle Textの索引では、ストップワードの索引エントリは作成しませんが、ストップワードの位置は記録しているためです。
問合せ句内にストップワードが含まれている場合、このストップワードは任意のワードに一致します。たとえば、次の問合せ
'Jack was big'
ストップワードがwasの場合、Jack is bigおよびJack grew bigなどの句が一致します。grewはストップワードではありませんが、この問合せでは一致します。
Oracle Database 12cリリース2 (12.2)より、ストップワードとストップワードの単項演算子が問合せ結果の初期段階で無視されるため、前のリリースと異なるクエリ結果になります。次にその例を示します。
SQL> select count(1) from tabx where contains(text,'$the')>0;
.
COUNT(1)
----------
0
前述の問合せでは、the
がストップワードで、問合せ処理中にストップワードとともに$
演算子が無視されるため、ドキュメントは返されません。
SQL> select count(1) from tabx where contains(text,'first and $the')>0;
.
COUNT(1)
----------
2
前述の問合せでは、the
がストップワードで、$
演算子とともに無視されるため、first
を含むドキュメントが返されます。指定された$
演算子に関係なく、拡張は実行されません。
4.1.6 ABOUT問合せおよびテーマ
ABOUT
問合せは、ドキュメント・テーマに対する問合せです。ドキュメント・テーマは、テキスト内で詳しく展開されている概念のことです。たとえば、US politicsのABOUT
問合せでは、アメリカの大統領選挙や外交政策に関する情報を含むドキュメントが戻る可能性があります。戻るドキュメントには、US politicsと正確に一致する句が含まれている必要はありません。
索引付け時に、ドキュメント・テーマはナレッジ・ベースから導出され、このナレッジ・ベースには、一般的な知識を表すカテゴリと概念が階層式にリストされています。たとえば、ナレッジ・カタログのテーマには、jazz music、footballまたはNelson Mandelaなどの具体的な概念も含まれています。また、テーマには、happinessやhonestyなどの抽象的な概念もあります。
索引付け時に、システムでは、ドキュメント内で詳しく展開されているが、ナレッジ・ベースには存在しないドキュメント・テーマも識別し、索引付けすることができます。
ナレッジ・ベースは、業界または問合せアプリケーション固有の概念や用語を定義して補強できます。補強した場合は、追加した概念に対するABOUT
問合せの精度が向上します。
索引内にテーマ・コンポーネントを作成すると、ABOUT
問合せのパフォーマンスが最も向上します。テーマ・コンポーネントは、英語とフランス語ではデフォルトで作成されます。
関連項目:
ストップテーマの問合せ
ABOUT
演算子を使用すると、テーマを問い合せることができます。ストップテーマは、索引付けされていないテーマです。ストップテーマは、CTX_DDL
パッケージを使用して追加および削除できます。また、索引を作成した後で、ALTER INDEX
文でストップテーマを追加することもできます。
4.1.7 問合せ式
問合せ式とは、CONTAINS
演算子またはCATSEARCH
演算子のtext_query
引数内で一重引用符で囲まれたものを指します。CONTAINS
問合せの問合せ式に組み込むことができる内容は、CATSEARCH
演算子に組み込める内容とは異なります。
4.1.7.1 CONTAINS演算子
CONTAINS
の問合せ式には、論理検索、近接検索、シソーラスを使用した検索、ファジー検索およびワイルド・カード検索を行う問合せ演算子を含めることができます。ストアド式を使用した問合せも可能です。問合せ式内でグループ化文字を使用すると、演算子の優先順位を変更できます。このマニュアルでは、このような演算子をCONTEXT
文法と呼びます。
CONTAINS
では、ABOUT
問合せを使用して、ドキュメント・テーマを問い合せることもできます。
関連項目:
4.1.7.2 CATSEARCH演算子
CATSEARCH
演算子では、text_query
引数を使用して問合せ式を指定し、structured_query
引数を使用してオプションの構造化基準を指定できます。text_query
引数を使用すると、ワードと句を問い合せることができます。AND、ORおよびNOTなどの論理操作を使用できます。このマニュアルでは、このような演算子をCTXCAT
文法と呼びます。
CONTEXT
文法によりサポートされているさらに豊富な演算子を使用する場合は、CATSEARCH
で問合せテンプレート機能を使用できます。
structured_query
引数では、構造化基準を指定します。次のSQL操作を使用できます。
-
=
-
<=
-
>=
-
>
-
<
-
IN
-
BETWEEN
また、ORDER BY
句を使用して出力を順序付けできます。
関連項目:
「CTXCAT構文」
4.1.8 大/小文字を区別する検索
4.1.8.1 ワード問合せ
ワード問合せでは、デフォルトで大/小文字を区別していません。たとえば、語句dogを問い合せると、テキスト表のワードdogを含む行が検出されますが、DogまたはDOGを含む行は検出されません。
BASIC_LEXER
索引プリファレンスのMIXED_CASE
属性を使用すると、大/小文字を区別する検索の有効/無効を切り替えることができます。大/小文字を区別する索引の場合は、大/小文字を正確に区別して問合せを入力する必要があります。たとえば、Dogへの問合せは、Dogを含むドキュメントのみと一致します。dogまたはDOGを含むドキュメントは、ヒットとして戻りません。
大/小文字を区別しない検索を有効にするには、BASIC_LEXER
索引プリファレンスのMIXED_CASE
属性をNO
に設定します。
ストップワードと大/小文字区別
ワード問合せに大/小文字区別を使用可能に設定して、ストップワードとストップワード以外のワードを含む句に問合せを入力する場合は、そのストップワードの大/小文字の区別を正確に指定する必要があります。たとえば、theがストップワードとして定義されている場合は、the dogを問い合せても、The Dogを含むテキストは戻りません。
4.1.8.2 ABOUT問合せ
問合せを適切な文字で表すと、ABOUT
問合せの結果が最も向上します。これは、問合せの正規化が、大/小文字が区別されるナレッジ・カタログに基づくためです。大文字/小文字によって意味が異なるワードの場合は、特に注意が必要です(たとえば、turkeyは鳥の名で、Turkeyは国名です)。
ただし、ABOUT
問合せの関連結果を取得するために、大/小文字を正確に区別して問合せを入力する必要はありません。システムが、最適な方法で問合せを解釈します。たとえば、ORACLE
という問合せを入力し、この概念がナレッジ・カタログで検索されない場合、システムは検索用の関連概念としてOracleを使用する場合があります。
4.1.9 問合せのフィードバック
フィードバック情報には、CONTEXT索引で指定した問合せに対する上位語、下位語および関連語の情報が含まれています。フィードバック情報は、CTX_QUERY.HFEEDBACK
プロシージャを使用してプログラムで取得します。
上位語、下位語および関連語の情報は、他の問合せ語句を問合せアプリケーションのユーザーに提示する場合に役立ちます。
戻されるフィードバック情報はナレッジ・ベースから取得され、索引中にも存在する語句のみを含みます。これによって、HFEEDBACK
プロシージャから戻された語句が、現在索引付けされているドキュメント・セットよりヒットする可能性が高くなります。
4.1.10 問合せの実行計画
実行計画情報では、CONTAINS
問合せ式の解析ツリーがグラフィカルに表示されます。実行計画情報は、CTX_QUERY.EXPLAIN
プロシージャを使用してプログラムで取得できます。
実行計画情報を使用すると、問合せを実行しなくても、問合せの拡張方法や解析方法がわかります。実行計画情報を取得すると、STEM、ワイルド・カード、シソーラス、FUZZY、SOUNDEX、ABOUT
などの特定の問合せの拡張方法がわかります。解析ツリーには、次の情報も表示されます。
-
実行の順序
-
ABOUT
問合せの正規化 -
問合せ式の最適化
-
ストップワード変換
-
サポート対象言語の複合語トークンの分類
4.1.11 問合せでのシソーラスの使用
Oracle Textでは、問合せアプリケーション用のシソーラスを定義できます。
カスタム・シソーラスを定義すると、問合せをより優れた方法で処理できます。使用しているアプリケーションのユーザーには、トピックを表現するワードがわからない場合があるため、予想される問合せ語句にシノニムまたは下位語を定義できます。シソーラス演算子を使用すると、シソーラス語句を含むように問合せを拡張できます。
関連項目:
4.1.12 ドキュメントのセクション検索について
セクション検索を使用すると、テキスト問合せをドキュメント内のセクションに絞り込むことができます。
セクション検索は、HTMLやXMLのドキュメントのように、ドキュメントに内部構造がある場合に実現できます。たとえば、<H1>タグに対してセクションを定義すると、WITHIN
演算子を使用してこのセクション内を問い合せることができます。
XMLドキュメントからセクションを自動的に作成するようにシステムを設定できます。
また、属性セクションを定義して、XMLドキュメントの属性テキストを検索できます。
注意:
セクション検索がサポートされているのは、CONTEXT
索引によるワード問合せのみです。
4.1.13 問合せテンプレートの使用
4.1.14 クエリー・リライト
問合せアプリケーションは、エンド・ユーザー問合せを解析し、異なる演算子の組合せを使用して、1つ以上の方法で問合せ文字列を解釈することがあります。たとえば、ユーザーがkukui nutという問合せを入力すると、アプリケーションでは、再コールを増やすために、問合せ{kukui nut}および{kukui or nut}が入力されます。
クエリー・リライト機能を使用すると、元の問合せをリライトされたバージョンに拡張する単一の問合せを発行できます。これにより、重複のない結果が戻されます。
問合せテンプレート機能を使用して、リライトの順序を指定します。リライトされた問合せのバージョンは、CONTAINS
またはCATSEARCH
の単一のコールを使用して、効率的に実行されます。
次のテンプレートは、クエリー・リライトの順序を定義します。問合せ{kukui nut}は、次のようにリライトされます。
{kukui} {nut}
{kukui} ; {nut}
{kukui} AND {nut}
{kukui} ACCUM {nut}
この変換のクエリー・リライト・テンプレートは、次のとおりです。
select id from docs where CONTAINS (text, '<query> <textquery lang="ENGLISH" grammar="CONTEXT"> kukui nut <progression> <seq><rewrite>transform((TOKENS, "{", "}", " "))</rewrite></seq> <seq><rewrite>transform((TOKENS, "{", "}", " ; "))</rewrite></seq> <seq><rewrite>transform((TOKENS, "{", "}", "AND"))</rewrite></seq> <seq><rewrite>transform((TOKENS, "{", "}", "ACCUM"))</rewrite></seq> </progression> </textquery> <score datatype="INTEGER" algorithm="COUNT"/> </query>')>0;
4.1.15 問合せ緩和
問合せ緩和を使用すると、アプリケーションでは、最も制限されたバージョンの問合せを最初に実行して、必要なヒット数を得るまで、問合せを徐々に緩和できます。
たとえば、アプリケーションが最初にblack penを検索した後、より多くのヒットを得るため、問合せがblack NEAR penに緩和されます。
次の問合せテンプレートは、問合せ緩和の順序を定義します。問合せblack penは、次の順序で入力されます。
{black} {pen}
{black} NEAR {pen}
{black} AND {pen}
{black} ACCUM {pen}
select id from docs where CONTAINS (text, '<query> <textquery lang="ENGLISH" grammar="CONTEXT"> <progression> <seq>{black} {pen}</seq> <seq>{black} NEAR {pen}</seq> <seq>{black} AND {pen}</seq> <seq>{black} ACCUM {pen}</seq> </progression> </textquery> <score datatype="INTEGER" algorithm="COUNT"/> </query>')>0;
アプリケーションが結果を必要とするかぎり、問合せのヒットは、この順序で重複なしで戻されます。
アプリケーションが問合せの上位N個のヒット数を必要とする場合、問合せ緩和が最も効率的です。このヒット数は、DOMAIN_INDEX_SORT
またはPL/SQLカーソルで取得できます。
したがって、問合せテンプレートを使用した問合せの緩和は、問合せの再実行よりも効率的です。
4.1.16 問合せ言語
MULTI_LEXER
を使用して、異なる言語の文書を含む列を索引付けする場合、問合せ中に使用する言語レクサーを指定できます。これを実行するには、問合せパラメータでlang
パラメータを使用し、そこでドキュメントレベル・レクサーを指定します。
select id from docs where CONTAINS (text, '<query><textquery lang="french">bon soir</textquery></query>')>0;
関連項目:
ALTER INDEXとドキュメント・サブレクサーを使用するLANGUAGE
およびlang
の詳細は、『Oracle Textリファレンス』を参照してください
4.1.17 SDATAセクションによる並替え
問合せテンプレートの<order>
および<orderkey>
要素を使用すると、SDATAセクションの内容に応じて問合せ結果を並べ替えることができます。
次の例では、第1レベルの並替えがSDATAセクションのprice
に基づいて実行され、昇順でソートされます。第2レベルと第3レベルの並替えはSDATAセクションのpub_date
とスコアに基づいて実行され、これによって降順でソートされます。
select id from docs where CONTAINS (text, ' <query> <textquery lang="ENGLISH" grammar="CONTEXT"> Oracle </textquery> <score datatype="INTEGER" algorithm="COUNT"/> <order> <orderkey> SDATA(price) ASC </orderkey> <orderkey> SDATA(pub_date) DESC </orderKey> <orderkey> Score DESC </orderkey> </order> </query>', 1)>0;
注意:
索引にSDATAセクションを追加するとき、索引を完全に再構築する必要はありません。『Oracle Textリファレンス』で、ALTER INDEXのADD SDATA SECTIONパラメータ文字列に関する項を参照してください。
関連項目:
問合せテンプレートの<order>
および<orderkey>
要素の構文は、『Oracle Textリファレンス』を参照してください。
4.1.18 代替スコアリングおよびユーザー定義スコアリング
問合せテンプレートを使用して、デフォルト以外の代替スコアリング・アルゴリズムを指定することにより、CONTAINS
をスコアリングする方法をカスタマイズしたり、SDATA
をスコアリング式の一部として使用できます。このようにして、事前定義済スコアリング・コンポーネントのみでなくSDATA
コンポーネントを使用してスコアリング式を数学的に定義できます。
代替のユーザー定義スコアリングを使用して、次の操作を実行できます。
-
次を使用して、問合せのスコアリング方法を定義する演算式を定義して、語句のスコアリング式を指定します。
-
事前定義済スコアリング・アルゴリズム:
DISCRETE
、OCCURRENCE
、RELEVANCE
およびCOMPLETION
-
算術操作: 加算、減算、乗算、除算
-
算術関数:
ABS(n)
、n ;LOG(n)
の絶対値の検索、10を底とするnの対数値の検索 -
数値リテラル
-
-
語句レベルでスコアリング式を指定します。
-
スコアの計算時に考慮に入れない語句を指定します。
-
OR
演算子およびAND
演算子の子要素によるスコアをどのようにマージするかを指定します。 -
数値を格納する
SDATA
またはDATETIME
値を使用して、ドキュメントの最終スコアに影響を与えます。
次の例では、代替スコアリング・アルゴリズムを指定します。
select id from docs where CONTAINS (text, '<query> <textquery grammar="CONTEXT" lang="english"> mustang </textquery> <score datatype="float" algorithm="DEFAULT"/> </query>')>0
次の問合せテンプレート例には、SDATA
値が、最終スコアの一部として含まれています。
select id from docs where CONTAINS (text, '<query> <textquery grammar="CONTEXT" lang="english"> mustang </textquery> <score datatype="float" algorithm="DEFAULT" normalization_expr ="doc_score+SDATA(price)"/> </query>')>0"
4.1.20 問合せ分析
Oracle Textを使用すると、問合せのログを作成して、そのログに含まれる問合せを分析できます。たとえば、大きい動物のデータベースを検索するアプリケーションがあり、その問合せの分析で、ユーザーがワードmouseを頻繁に検索することが示されているとします。この分析は、mouseの検索で、検索の失敗を戻すだけでなく、ユーザーを小さい動物のデータベースにリダイレクトするようにアプリケーションをリライトすることを促しています。
問合せ分析では、次のことがわかります。
-
発行された問合せ
-
成功した問合せ
-
失敗した問合せ
-
各問合せの発行回数
これらの要素を様々な方法で組み合せ、たとえばアプリケーションで失敗した問合せの上位50位までを調べることが可能です。
問合せのロギングは、CTX_OUTPUT.START_QUERY_LOG
によって開始します。CTX_OUTPUT.END_QUERY_LOG
プロシージャが入力されるまで、プログラムで使用しているすべてのコンテキスト索引に対するすべての問合せが問合せログに書き込まれます。行われた問合せのレポートを取得するには、CTX_REPORT.QUERY_LOG_SUMMARY
を使用します。
4.1.21 その他の問合せ機能
問合せアプリケーションでは、近接検索などのその他の問合せ機能を使用できます。表4-1は、これらの問合せ機能のいくつかを示しています。
表4-1 Oracle Textのその他の問合せ機能
機能 | 説明 | 実装 |
---|---|---|
大/小文字を区別する検索 |
問合せに入力したとおりに、ワードまたは句を正確に検索できます。たとえば、Romanの検索は、Romanを含み、romanを含まないドキュメントを戻します。 |
索引作成時に |
基本文字変換 |
ティルデ、アクセント、ウムラウトなどの発音区別符号に関係なく、ワードを問い合せます。たとえば、スペイン語の基本文字索引を使用すると、energíaの問合せでは、energíaおよびenergiaが含まれているドキュメントが一致します。 |
索引作成時に |
ワード分割処理 (ドイツ語およびオランダ語) |
指定した語句が複合語の要素として含まれているワードを検索できます。 |
索引作成時に |
代替スペル (ドイツ語、オランダ語およびスウェーデン語) |
ワードの代替スペルを検索します。 |
索引作成時に |
近接検索 |
相互に近接しているワードを検索します。 |
問合せ入力時に |
|
特定の問合せに基づいてドキュメントをクランプに分割します。各クランプはプライマリ機能に基づいて分類され、2次機能に基づいてスコア付けされます。最終的なドキュメント・スコアにはクランプ・スコアが追加され、プライマリ機能の順序によってドキュメント・スコアの初期の順序が決まります。 |
問合せ入力時に |
ステミング |
指定した語句と同じ語幹を持つワードを検索します。 |
問合せ入力時に$演算子を使用します。 |
ファジー検索 |
指定した語句に類似するスペルを持つワードを検索します。 |
問合せ入力時に |
問合せの実行計画 |
問合せの解析情報を生成します。 |
索引作成後にPL/SQLプロシージャ |
階層問合せフィードバック |
問合せに対する上位語、下位語および関連語の情報を生成します。 |
索引作成後にPL/SQLプロシージャ |
索引のブラウズ |
索引内のシード・ワードに関するワードをブラウズします。 |
索引作成後にPL/SQLプロシージャ |
ヒット数のカウント |
問合せのヒット数をカウントします。 |
索引作成後にPL/SQLプロシージャ |
ストアド・クエリー式 |
後で別の問合せで再利用するために、問合せ式のテキストを保存します。 |
索引作成後にPL/SQLプロシージャ |
シソーラスを使用した問合せ |
シソーラスを使用して問合せを拡張します。 |
シソーラスのメンテナンスには |
4.2 CONTEXT構文
CONTEXT
文法は、CONTAINS
のデフォルトの文法です。この文法では、演算子を使用してさらに複雑な検索を行うことができます。問合せ演算子は問合せ式で使用します。たとえば、論理演算子AND
を使用すると、2つの異なるワードを含むすべてのドキュメントを検索できます。ABOUT
演算子を使用すると、概念を検索できます。
また、セクション検索にはWITHIN
演算子を、近接検索にはNEAR
演算子を使用できます。さらに、問合せ式の拡張には、STEM演算子、FUZZY演算子およびシソーラス演算子を使用できます。
CONTAINS
では、問合せテンプレート機能を使用してCTXCAT
文法を使用できます。
次の各項では、Oracle Textの演算子について説明します。
4.2.1 ABOUT問合せ
英語またはフランス語での概念の問合せには、ABOUT
演算子を使用します。通常、問合せ文字列は、検索する内容を表す概念またはテーマになります。Oracle Textでは、そのテーマを含むドキュメントを戻します。
ワード情報とテーマ情報は、単一の索引に結合されます。テーマ問合せを入力するには、索引内にテーマ・コンポーネントが存在している必要があります(英語とフランス語の場合は、デフォルトで作成されます)。
テーマ問合せは、問合せ式内でABOUT
演算子を使用して入力します。たとえば、politicsに関するすべてのドキュメントを取り出すには、次のように問合せを記述します。
SELECT SCORE(1), title FROM news WHERE CONTAINS(text, 'about(politics)', 1) > 0 ORDER BY SCORE(1) DESC;
4.2.2 論理演算子
AND
やOR
などの論理演算子を使用すると、様々な方法で検索条件を制限できます。表4-2では、論理演算子について説明します。
表4-2 論理演算子
演算子 | 記号 | 説明 | 式の例 |
---|---|---|---|
|
& |
各問合せ語句が1つ以上出現するドキュメントを検索するには、 オペランドの最小値がスコアとして戻ります。 |
'cats AND dogs' 'cats & dogs' |
|
| |
いずれかの問合せ語句が1つ以上含まれるドキュメントを検索するには、 オペランドの最大値がスコアとして戻ります。 |
'cats | dogs' 'cats OR dogs' |
|
~ |
1つの問合せ語句が含まれているが、もう1つの問合せ語句が含まれていないドキュメントを検索するには、 |
たとえば、animalsという語句が含まれていて、dogsという語句は含まれていないドキュメントを取得するには、次の式を使用します。 'animals ~ dogs' |
|
, |
問合せ語句のいずれかが1つ以上出現するドキュメントを検索するには、 |
次の問合せは、dogs、catsおよびpuppiesという語句を含むすべてのドキュメントを検出し、3つの語句をすべて含むドキュメントに最も高いスコアを割り当てます。 'dogs, cats, puppies' |
|
= |
問合せ時に条件を満たすワードの置換を指定するには、 |
次の例は、句alsatians are big dogsまたはGerman shepherds are big dogsのいずれかを含むすべてのドキュメントを検出します。 'German shepherds=alsatians are big dogs' |
4.2.3 セクション検索とHTMLおよびXML
4.2.4 NEAR、NEAR_ACCUMおよびNEAR2演算子による近接問合せ
NEAR
演算子を使用すると、ドキュメント内で互いに近接している語句を検索できます。
たとえば、dogがcatの6ワード以内にあるすべてのドキュメントを検索する場合は、次の問合せを入力します。
'near((dog, cat), 6)'
NEAR
演算子が変更され、NESTED NEAR
内の句間での距離の測定方法が変わりました。
NEAR_ACCUM
演算子は、NEAR
演算子の機能とACCUM
演算子の機能を結合します。これは、NEAR
と同様に、互いに指定の範囲内に近接した語句を戻します。ただし、一方の語句が見つからなかった場合、見つかった方の語句が出現する頻度に従って、ドキュメントがランク付けされます。
NEAR2
演算子には、PHRASE
、NEAR
、およびAND
演算子の機能が結合されています。また、NEAR2
演算子ではオプションで位置情報を使用してそのヒット数のスコアを上げることができます。つまり、1つのドキュメントの先頭で1つの句がヒットし、ドキュメントの終わりに別の句がヒットすると、最初のヒットに2つ目のヒットよりも高い重みが与えられます。
関連項目:
NEAR
、NEAR_ACCUM
およびNEAR2
演算子の使用方法の詳細は、『Oracle Textリファレンス』を参照
4.2.5 FUZZY、STEM、SOUNDEX、ワイルド・カードおよびシソーラスの拡張演算子
ワイルド・カード、FUZZY、STEM、SOUNDEX、シソーラスなどの演算子を使用すると、問合せを長いワード・リストに拡張できます。
関連項目:
4.2.7 ストアド・クエリー式
問合せの結果を保存せずに、問合せの定義を格納するには、CTX_QUERY.STORE_SQE
プロシージャを使用できます。CONTAINS
のSQL演算子によって、その問合せの定義を参照します。このように、ストアド・クエリー式を使用すると、長い問合せ式や使用頻度の高い問合せ式を簡単に定義できます。
ストアド・クエリー式は索引に連結されません。CTX_QUERY.STORE_SQE
をコールする場合、指定するのはストアド・クエリー式の名前と問合せ式のみです。
問合せの定義は、テキスト・データ・ディクショナリに格納されます。ストアド・クエリー式は、すべてのユーザーが参照できます。
4.2.7.2 SQEの例
次の例では、disasterというストアド・クエリー式を作成します。この式は、tornado、hurricaneまたはearthquakeのいずれかのワードを含むドキュメントを検索します。
begin ctx_query.store_sqe('disaster', 'tornado | hurricane | earthquake'); end;
この問合せを1つの式で実行するには、次のように問合せを記述します。
SELECT SCORE(1), title from news WHERE CONTAINS(text, 'SQE(disaster)', 1) > 0 ORDER BY SCORE(1);
4.2.8 CONTAINSでのPL/SQLファンクションのコール
ユーザー定義ファンクションは、SQL文で指定されるための要件を満たしていれば、CONTAINS
句内で直接コールできます。コール側には、そのファンクションに対するEXECUTE
権限も必要です。
たとえば、ファンクションfrenchが英語のワードに相当するフランス語を戻すとします。次の問合せを記述すると、catに相当するフランス語のワードを検索できます。
SELECT SCORE(1), title from news WHERE CONTAINS(text, french('cat'), 1) > 0 ORDER BY SCORE(1);
4.2.9 応答時間短縮のための最適化
CONTAINS
問合せを応答時間短縮のために最適化すると、ヒットリストの最もスコアの高いドキュメントが必要な場合に、高速なソリューションとなります。
次の例では、標準出力に最初の20個のヒットを戻します。この例では、FIRST_ROWS(n)
ヒントとカーソルを使用します。
declare cursor c is select /*+ FIRST_ROWS(20) */ title, score(1) score from news where contains(txt_col, 'dog', 1) > 0 order by score(1) desc; begin for c1 in c loop dbms_output.put_line(c1.score||':'||substr(c1.title,1,50)); exit when c%rowcount = 21; end loop; end; /
問合せヒントの使用以外にも、次のような要因が問合せ応答時間に影響します。
-
表統計の収集
-
メモリー割当て
-
ソート
-
元表に存在するLOB列
-
パーティション化
-
並列性
-
問合せで語句を拡張する回数
4.2.10 ヒット数のカウント
CONTAINS
述語のみが指定された問合せから戻されたヒット数をカウントするには、PL/SQLのCTX_QUERY.COUNT_HITS
またはSQL SELECT
文のCOUNT(*)
を使用できます。
おおまかなヒット件数が必要な場合は、CTX_QUERY.COUNT_HITS
を予測モード(EXACT
パラメータをFALSE
に設定)で使用できます。応答時間の点では、これが最も高速なカウント方法です。
構造化述語が含まれた問合せから戻されるヒット数をカウントするには、SELECT
文のCOUNT(*)
関数を使用します。
4.2.10.1 SQLによるヒット数のカウント例
ワードoracleを含むドキュメント数を検索するには、SQLのCOUNT
ファンクションによる問合せを次のように入力します。
SELECT count(*) FROM news WHERE CONTAINS(text, 'oracle', 1) > 0;
4.2.10.2 構造化述語によるヒット数のカウント
構造化述語による問合せで戻されるドキュメント数を検索するには、COUNT(*)
を次のように使用します。
SELECT COUNT(*) FROM news WHERE CONTAINS(text, 'oracle', 1) > 0 and author = 'jones';
4.2.11 ユーザー定義スコアリングでのDEFINESCOREおよびDEFINEMERGEの使用
DEFINESCORE
演算子を使用すると、語句または句のスコアの計算方法を定義できます。DEFINEMERGE
演算子では、AND
演算子およびOR
演算子の子要素のスコアのマージ方法を定義します。また、SDATA
とともに代替スコアリング・テンプレートを使用して、ドキュメントの最終スコアリングに影響を与えることができます。
関連項目:
-
代替スコアリング・テンプレートの詳細は、「代替スコアリングおよびユーザー定義スコアリング」を参照してください
-
DEFINESCORE
およびDEFINEMERGE
の構文の詳細は、『Oracle Textリファレンス』を参照してください。
4.3 CTXCAT構文
CTXCAT
文法は、CATSEARCH
のデフォルトの文法です。この文法は、句問合せの他に、AND
やOR
などの論理操作もサポートしています。
CATSEARCH
の問合せ演算子は、次の構文です。
表4-3 CATSEARCH問合せ演算子の構文
演算子 | 構文 | 演算子の説明 |
---|---|---|
論理 |
a b c |
a、bおよびcを含む行を戻します。 |
論理 |
a | b | c |
a、bまたはcを含む行を戻します。 |
論理 |
a - b |
aを含み、bを含まない行を戻します。 |
空白なしのハイフン |
a-b |
通常の文字として処理されるハイフンです。 たとえば、ハイフンがskipjoinとして定義されている場合、web-siteなどのワードは、単一の問合せ語句websiteとして処理されます。 同様に、ハイフンがprintjoinとして定義されている場合、web-siteなどのワードは、 |
" " |
"a b c" |
句"a b c"を含む行を戻します。 たとえば、"Sony CD Player"と入力すると、この一連のワードを含むすべての行を戻します。 |
( ) |
(A B) | C |
カッコは演算をグループ化します。この問合せは、 |
CONTEXT
文法をCATSEARCH
問合せで使用できます。そのためには、text_queryパラメータに問合せテンプレート指定を使用します。
CTXCAT
索引で近接問合せ、シソーラス問合せまたはABOUT
問合せを入力する必要がある場合に、CONTAINS
文法を使用することがあります。