3 SODA索引付けの概要

SODA QBEのパフォーマンスは、索引を使用することによって改善されることがあります。より高速な照合のために特定のQBEパターンを索引付けする方法を指定するJSONオブジェクトである索引仕様を使用してSODA索引を定義します。

注意:

Bツリー索引を作成するには、Oracle Databaseリリース12c (12.2.0.1)以上が必要です。DATEまたはTIMESTAMP値に索引付けするBツリー索引を作成するには、Oracle Databaseリリース18c (18.1)以上が必要です。

{"dateField" : {"$date" : DATE-STRING}}などの問合せをよく使用するものとします。DATE-STRINGはSODAによってサポートされているISO 8601形式の文字列です。ここで、項目メソッド$dateが、DATE-STRINGをデータ型DATEのSQL値に変換します。一般に、Bツリー索引を作成することによって、"dateField"などのフィールドに対する問合せのパフォーマンスを向上させることができます。

または、GeoJSONジオメトリ・オブジェクトの空間データを問い合せるとします。このデータのSODA空間索引を作成すると、このような問合せのパフォーマンスを改善できます。

または、QBE演算子$containsを使用した全文問合せを実行できるようにするものとします。このような問合せは、データのJSON検索索引を作成することで有効にできます。

または、JSONデータ・ガイドに対してメタデータ問合せを実行するものとします。このガイドは、一連のJSONドキュメントに関する構造および型の情報の要約です。このようなデータガイド情報を保持して自動的に更新するJSON検索索引を作成できます。

このような場合のすべてにおいて、SODA索引仕様を作成し、それを使用して指定された索引を作成することによって、必要な索引を指定します。

索引付けをサポートする各SODA実装に、索引を作成する方法が用意されています。それらはすべて、SODA索引仕様を使用して、作成される索引を定義します。たとえば、SODA for RESTでは、HTTP POSTリクエストを使用して、URI引数action=indexを渡してPOST本体に索引仕様を提供します。

注意:

  • Bツリー索引を作成するには、Oracle Databaseリリース12c (12.2.0.1)以上が必要です。

    DATEまたはTIMESTAMP値に索引付けするBツリー索引を作成するには、Oracle Databaseリリース18c (18.1)以上が必要です。

  • 空間索引を作成するには、Oracle Databaseリリース12c (12.2.0.1)以上が必要です。

  • 検索索引を作成するには、Oracle Databaseリリース12c (12.2.0.1)以上が必要です。

例3-1 Bツリー索引の指定

この例では、数値フィールドaddress.zipに一意でないBツリー索引を指定します。

{ "name"   : "ZIPCODE_IDX",
  "fields" : [ { "path"     : "address.zip",
                 "datatype" : "number",
                 "order"    : "asc" } ] }

これは、例2-1および例2-2のパスaddress.zipのフィールドに索引付けします。

例2-3にはそのようなフィールドがないため、索引付け中にドキュメントはスキップされます。

その索引仕様に、パス address.zipのフィールドのscalarRequired = trueが含まれ、コレクションにそのようなフィールドがないドキュメントが含まれている場合、索引の作成時にエラーが発生します。さらに、このような索引が存在した場合に、索引付けされたフィールドのないドキュメントを書き込もうとすると、書込み操作のエラーが発生します。

scalarRequiredの値に関係なく、ターゲット・フィールドを持つが、指定されたデータ型に変換できない値を持つドキュメントを記述しようとすると、エラーが発生します。たとえば、例3-1で定義した索引の場合、ドキュメントにaddress.zipフィールドは含まれているが、フィールド値が数値に変換できない場合、エラーが発生します。たとえば、値がオブジェクトであるzipフィールドの場合が、これに該当します。

例3-2 空間索引の指定

この例では、LOCATION_LONG_LAT_IDXという名前のOracle Spatial and Graph索引を指定します。これは、ドキュメント内のフィールドlocationの値であるGeoJSONジオメトリ・オブジェクトを索引付けします。

{ "name"    : "LOCATION_LONG_LAT_IDX",
  "spatial" : "location" }

この索引仕様は、値がGeoJSONジオメトリ・オブジェクトであるlocationフィールドがあるすべてのドキュメントにのみ適用されます。次に、Pointタイプのジオメトリ・オブジェクトを持つ、このようなlocationフィールドがあるオブジェクトの例を示します。

{ "location" : { "type" : "Point", "coordinates" : [ 33.7243, 118.1579 ] } }

そのlocationの値は、GeoJSONジオメトリ・オブジェクトであるため、索引付けされます。

索引仕様にscalarRequired = truelax = trueも指定されていないため、locationフィールドのないドキュメントは、索引付け中に暗黙的にスキップされます(索引付けされません)。

また、location値がGeoJSONジオメトリ・オブジェクトではない、次のいずれかのようなオブジェクトがあるドキュメントが問合せ対象のコレクションに含まれる場合、索引付け中にエラーが発生します。

{ "location" : [ 33.7243, 118.1579 ] }
{ "location" : "1600 Pennsylvania Ave NW, Washington, DC 20500" }

また、そのような索引が存在し、そのような非ジオメトリ値を持つlocationフィールドがあるドキュメントを記述しようとすると、書込み操作に対してエラーが発生します。

索引仕様にscalarRequired = trueが含まれ、コレクションにlocationフィールドのないドキュメントが含まれている場合、エラーが、索引作成時に発生する場合があります。さらに、このような索引が存在する場合に、索引付けされたフィールド(location)のないドキュメントを書き込もうとすると、書込み操作のエラーが発生します。(値がジオメトリ・オブジェクトではないlocationフィールドの場合も、索引作成または書込み操作に対してエラーが発生する必要があります。)

索引仕様でlax = trueが指定されている場合、locationフィールドがないドキュメント、またはGeoJSONジオメトリ・オブジェクトではないlocationフィールド値({"location" : [33.7243, 118.1579]})を持つドキュメントに対してエラーは発生しません。索引はそのようなドキュメントを単に無視します。

注意:

値がGeoJSON geometryオブジェクトであるフィールドに対してSODA空間索引を作成しており、そのフィールドをターゲットとするQBEを使用するとき、索引とQBEの両方がそのフィールドに対して同じエラー処理動作を指定している場合には、QBEに対してのみの索引を選択できます。どちらにも、次のうち同じものを指定する必要があります。

  • scalarRequired = true

  • lax = true

  • scalarRequired = trueでもlax = trueでもありません

例3-3 JSON検索索引の指定

この例では、JSON検索索引を指定しています。索引は、次の両方の処理を実行します。

  • JSONドキュメントに非定型のフルワードおよびフル数値の問合せを実行できます。

  • JSONドキュメントに関する集計構造情報および型情報を自動的に蓄積し、更新します。

{ "name" : "SEARCH_AND_DATA_GUIDE_IDX" }

この索引仕様は同等です。これは、単にデフォルト値を明示的に設定します。

{ "name"      : "SEARCH_AND_DATA_GUIDE_IDX",
  "dataguide" : "on",
  "search_on" : "text_value" }

関連項目:

関連トピック