全文索引の作成
この項の理解を深めるために、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を使用して、このデータに対して全文検索を実行できるようになります。新しいデータが書き込まれるか、既存のデータが表から削除されるたびに、それに応じてクラスタ内の対応するテキスト索引が更新されます。
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
を使用して、目的の定義を満たす新しいテキスト索引を作成する必要があります。