全文索引の作成

この項の理解を深めるために、Oracle NoSQL Databaseの表および索引の概念を確認します。SQLリファレンス・ガイド索引を参照してください。この章では、Oracle NoSQL Databaseの特定の表のフィールドに対して作成できる索引の主要なタイプについて説明します。

この項では、特定の表に対して作成できる2つ目のタイプの索引を紹介します。この2つ目の索引カテゴリは、SQLリファレンス・ガイドで説明されているセカンダリ索引とは別に、全文索引または単に関連する表のテキスト索引と呼ばれます。

あらゆる索引の場合と同様に、ここで定義されているテキスト索引によって、なんらかの共通の値または特性を共有するフィールドを持つOracle NoSQL Database表の行を検索できます。この2つのタイプの索引の違いは、Oracle NoSQL Databaseセカンダリ索引の作成、メンテナンスおよび問合せは、すべて、Oracle NoSQL Databaseストア内でOracle NoSQL Database表APIを使用して実行されることです。一方、テキスト索引の作成は、表APIを介してのみ開始されます。ストアでは作成されたテキスト索引に関する情報が保持されますが、このような索引の作成、メンテナンスおよび問合せは、実際には、ストアが登録されているElasticsearchクラスタで(Elasticsearch APIを使用して)実行されます。

最初のタイプの索引が作成されると、関連する表の索引付きフィールドのデータがストア自体に書き込まれることを理解することが重要です。一方、テキスト索引が作成されると、そのデータは、ストアが登録されているElasticsearchクラスタにストリーミングされます。これにより、データが格納(索引付け)されるため、Elasticsearch APIを使用して、このデータに対して全文検索を実行できるようになります。新しいデータが書き込まれるか、既存のデータが表から削除されるたびに、それに応じてクラスタ内の対応するテキスト索引が更新されます。

Elasticsearchの全文検索のためにOracle NoSQL表の1つ以上のフィールドに索引を付けるには、ストアの管理CLIを使用して、次の形式でコマンドを実行します。
execute 'CREATE FULLTEXT INDEX 
  [IF NOT EXISTS] 
  <index> ON <table> 
  (<field> {<mapping-spec>},<field> {<mapping-spec>}, ...) 
  [ES_SHARDS=<n>] 
  [ES_REPLICAS=<n>] 
  [OVERRIDE] 
  [COMMENT "<comment>"]';
各引数、フラグおよびディレクティブは次のように記述されています。角カッコ[...]でカプセル化された項目はオプションであり、中カッコ{...}でカプセル化された項目は、フィールドの値がJSONドキュメントである場合にのみ必須で、それ以外の場合はオプションです。
  • index - 作成するテキスト索引の名前。
  • table - 索引付けするフィールドを含む表の名前。
  • field - 開きカッコによってカプセル化された、索引付けする各フィールドのカンマ区切りリスト。
  • 索引付けする各フィールドは、Elasticsearchで対応するフィールドを処理する方法を指定するマッピング仕様にオプションで関連付けることができます。たとえば、Elasticsearchでフィールドの値をテキスト、数値、日付型などとして処理するかどうか、テキスト値に索引を付ける際にどのアナライザを使用するかなどです。次の各項で説明しているように、特定のフィールドのマッピング仕様は、有効なJSON形式で表す必要があります。
  • 前述のコマンドが実行され、指定した名前のテキスト索引がすでに存在する場合は、オプションのディレクティブIF NOT EXISTSを指定しないか、オプションのディレクティブOVERRIDEを指定しないと、コマンドは失敗し、エラー・メッセージが表示されます。名前付き索引がすでに存在する場合、IF NOT EXISTSを指定すると、no-opが発生します。既存の索引にOVERRIDEを指定すると、Elasticsearchから既存の索引が削除され、同じ名前の新しい索引が作成されます。
  • 対応するinteger値とともに、オプションのES_SHARDS引数が指定されると、Elasticsearchで新しい索引に使用されるプライマリ・シャードの数の設定が、指定された値に変更されます。この設定のデフォルト値は5であり、この設定は、索引の作成後に変更できません。
  • 対応するinteger値とともに、オプションのES_REPLICAS引数が指定されると、各プライマリ・シャードに設定されている索引付き値のコピー数の設定が、指定された値に変更されます。この設定のデフォルト値は1であり、この設定はライブ索引でいつでも変更できます。

ES_SHARDSおよびES_REPLICASのプロパティの値の使用方法の詳細は、Elasticsearchのドキュメントに記載されているnumber_of_shardsおよびnumber_of_replicasという名前のElasticsearch設定を参照してください。Elasticsearchの索引設定を参照してください。

CREATE FULLTEXT INDEXが正常に実行されると、コマンドに指定されたテキスト索引名が(その名前に関連付けられたメタデータとともに) Oracle NoSQLストアに格納され、メンテナンスされます。さらに、対応するテキスト検索可能索引(実際に問い合される索引)が、ストアが登録されているElasticsearchクラスタにも作成されます。Oracle NoSQLの索引に関連付けられる名前はCREATE FULLTEXT INDEXコマンドで指定された単純な索引名であることに対し、Elasticsearchの対応する索引の名前は、点で区切られた、次の形式になります。

ondb.<store>.<table>.<index>

Elasticsearch索引名の各座標は、Oracle NoSQL内で対応する座標が大/小文字混合または大文字として指定されていても、常に小文字です。名前の最初の座標(接頭辞)は常にondbです。これにより、Oracle NoSQLのCREATE FULLTEXT INDEXコマンドによって作成されたElasticsearchの索引が、Elasticsearch APIを介して外部で作成された他の索引と区別されます。Elasticsearch索引名のstore座標は、索引の作成をElasticsearchに要求したOracle NoSQL Databaseストアの名前です。tableおよびindexの座標は、CREATE FULLTEXT INDEXの対応する引数に指定されている値です。つまり、索引付けする値が取得されるOracle NoSQL表の名前、およびストアで保持するOracle NoSQLテキスト索引の名前です。Elasticsearchでそのような索引名の座標を使用すると、索引に格納されているデータの取得元を常に判断できます。

前述のCREATE FULLTEXT INDEXコマンドを実行した後、次のように、管理CLIからshow indexesコマンドを実行して、Oracle NoSQLでテキスト索引が正常に作成されたことを確認できます。
kv-> show indexes –table mytestTable

Indexes on table mytestTable mytestIndex (...), type: TEXT

また、Elasticsearchに対応する全文検索可能索引が作成されていることを確認できます。これを行うには、次のように、Elasticsearchクラスタ内のいずれかのノードへのネットワーク接続を持つホストのコマンドラインから、curlコマンドを実行します。

curl –X GET 'http://esHost:9200/_cat/indices'

yellow open ondb.kvstore._checkpoint ...
yellow open ondb.kvstore.mytesttable.mytestindex ...

ondb.kvstore._checkpoint索引を参照するエントリがあります。この索引は、最初のOracle NoSQLテキスト索引を作成するときに自動的に作成されます。これは、Elasticsearchクラスタから手動で削除しないかぎり、常にindicesコマンドの出力に表示されます。このいわゆる_checkpoint索引には、Oracle NoSQLの再起動時にリカバリ操作をサポートするために、Oracle NoSQLによって書き込まれた内部情報が含まれています。通常、この索引は削除または変更しません。

注意:

このドキュメント全体を通して、curlユーティリティ・プログラムを使用して、ElasticsearchクラスタへのHTTPリクエストの結果の発行方法および表示方法を示します。curlプログラムは、ほとんどのオペレーティング・システム(linux、Mac OS X、Microsoft Windowsなど)でサポートされています。簡単にインストールでき、コマンドラインから実行できるため、ここで使用します。Elasticsearchに問合せを送信するために検討できるその他のオプションは、次のとおりです。
  • elasticsearch-headツール。Elasticsearchクラスタを参照したり、問い合せたり、対話するためのWebフロントエンドです。elasticsearch-headを参照してください。
  • Elasticsearch Java API。プログラム・コントロール内からElasticsearchを問い合せるために使用できます。Elasticsearch Java APIを参照してください。

Oracle NoSQL管理CLIからshow indexesを実行することに加えて、show tableコマンドも実行できます。このコマンドは、表構造に加えて、その表に対して作成されたすべての索引(セカンダリとテキストの両方)もリストします。次に例を示します。

kv-> show table –table mytestTable
 
{
  "json_version" : 1,
  "type" : "table",
  "name" : "mytestTable",
  "shardKey" : [ "id" ],
  "primaryKey" : [ "id" ],
  "fields" : [
  {
    "name" : "id",

    "type" : "INTEGER",

    "nullable" : false,

    "default" : null
  
},
  {

    "name" : "category",

    "type" : "STRING",

    "nullable" : true,
   
 "default" : null

  },
  {

    "name" : "txt",
  
  "type" : "STRING",

    "nullable" : true,

    "default" : null

  } ],

  "indexes" : [
    {
      
"name" : "mytestIndex",
      "table" : "mytestTable",
      "type" " "text",
      "fields" : [ "category", "txt" ],
      "annotations" : {
        "category" : "{\"type\" : \"string"\",
                       \"analyzer\" : \"standard\"}",
        "txt" : "{\"type\" : \"string\",
                  \"analyzer\" : \"english\"}"
      }
    } ]
} 

注意:

Elasticsearchで作成されたテキスト索引は、CREATE FULLTEXT INDEXメカニズムを使用して展開できません。索引に列を追加するなどして索引定義を変更する場合、まずDROP INDEXコマンドを使用して既存の索引を削除してから、CREATE FULLTEXT INDEXを使用して、目的の定義を満たす新しいテキスト索引を作成する必要があります。