Elasticsearchフィールドへの全文索引フィールドのマッピング

Oracle NoSQL表に格納されるデータに対してセカンダリ索引を作成するために使用されるコマンドとは異なり、CREATE FULLTEXT INDEXコマンドでは、Elasticsearchでの索引付けされるフィールドの処理方法に対する、より細かい制御を指定できます。Elasticsearchによってデフォルト以外の方法で処理されるようにする各フィールドについて、CREATE FULLTEXT INDEXコマンドを実行するとき、それらの各フィールドを指定したマッピング仕様を含めることによって、そのフィールドの値がElasticsearchで処理される方法を指定できます。

マッピング仕様が指定されていないフィールドに索引付け可能なOracle NoSQLデータ型が含まれている場合(JSONデータを除く)、Oracle NoSQLはそのデータ型を使用して、フィールドの値をElasticsearch型システムにマップするために使用する適切な型を決定します。これは、非JSONデータを含むフィールドでは、フィールドのコンテンツに索引付けするときに、Elasticsearchが使用するデータ型を強制または上書き(あるいはその両方)するためにマッピング仕様を使用できることを意味します。

たとえば、特定の表のフィールドに、Oracle NoSQL Databaseのstring型として格納されている値が含まれている場合、Elasticsearchに指定されているデフォルト・マッピングで、Elasticsearchのstring型として、そのフィールドの値に索引付けする必要があることが宣言されます。ただし、Elasticsearchでそのフィールドの値をElasticsearchのinteger型として処理する場合は、明示的な型宣言を含むフィールドのマッピング仕様を指定します。つまり、次のようにします。

{"type":"integer"}

ただし、互換性のないデータ型をマップする場合は注意が必要です。前述の例では、索引付けされているstring値のいずれかに数字以外の文字が含まれている場合、Elasticsearchでエラーが発生します。Elasticsearchのマッピングを参照してください。

索引付けされるフィールドにJSONドキュメントである値が含まれている場合、常にCREATE FULLTEXT INDEXコマンドでマッピング仕様を指定する必要があります。そうでない場合はエラーが発生します。後述するように、そのようなフィールドは、索引付けされるドキュメント自体ではなく、ドキュメントのフィールドのサブセットであるため、マッピング仕様が必要です。JSONドキュメントがOracle NoSQL Database表に格納された場合、Oracle NoSQLで、型がJSONの値が格納されたことのみ認識されます。ドキュメント内のいずれかのフィールド(属性)を対象とした型は認識されません。したがって、ユーザーは、索引付けされるドキュメントの各フィールドについて、フィールドの値に索引付けするときにElasticsearchで使用する型を指定する、対応するマッピング仕様を指定する必要があります。

特定のフィールドのコンテンツのデータ型を指定することに加えて、マッピング仕様を使用して、Elasticsearchでの索引付けされるデータの処理方法をさらに調整することもできます。これを行うには、追加のパラメータ・セットをマッピング仕様に含めます。たとえば、string型のコンテンツを持つフィールドに索引付けする場合は、Elasticsearchによってデフォルトのアナライザとは異なるアナライザが適用されるようにするとします。この場合は、次の形式のマッピング仕様を指定します。

{"type":"string", "analyzer":"<analyzer-name>"}

Elasticsearchで作成された特定の索引に対してOracle NoSQL Databaseによって生成されたマッピングを参照するには、Elasticsearchクラスタのいずれかのノード(例: esHost)にネットワーク接続されたホストのコマンドラインから、次のようなコマンドを実行します。

curl –X GET 'http://esHost:9200/ondb.<store>.<table>.<index>/_mapping?pretty'

マッピング仕様を使用してElasticsearchに指定できる追加のマッピング・パラメータの種類の詳細は、Elasticsearchのマッピング・パラメータを参照してください。

具体的な例として、kvstoreという名前のストアにjokeTblという名前の表があり、この表は、ジョークがどのカテゴリに該当するかを表す値を持つcategoryという名前のフィールドと、関連するカテゴリに該当するジョークで構成されるstringを含むtxtという名前のフィールドで構成されているとします。categoryフィールドに格納される値に索引付けする場合、カテゴリを構成する各単語に索引付けしますが、各ジョークに索引付けする際には、単語全体ではなく語幹(または語根)を格納するとします。たとえば、ジョークにsolipsisticという単語が含まれている場合、実際には単語全体ではなく、単語の語幹solipsistを索引付け(格納)します。

Elasticsearchの標準のアナライザではテキストが単語全体に分割され、英語のアナライザでは単語が原形にステミングされるため、categoryフィールドには標準のアナライザを、txtフィールドには英語のアナライザを使用します(ジョークは英語で記述されているものとします)。具体的には、テキスト索引を作成するには、管理CLIから次のようなコマンドを実行します。

kv-> execute 'CREATE FULLTEXT INDEX jokeIndx ON jokeTbl (
       category{"type":"string","analyzer":"standard"}, 
       txt{"type":"string","analyzer":"english"})';

テキスト索引が作成されたら、Elasticsearchクラスタ内のいずれかのノードへのネットワーク接続を持つホストのコマンドラインから、curlコマンドを実行して、索引を問い合せることができます。次に例を示します。

curl –X GET 'http://<esHost>:9200/ondb.kvstore.jokeTbl.jokeIndx/_search?pretty'

前述の例のjokeIndxに対してOracle NoSQL Databaseによって生成されたマッピングを確認するには、次のようなcurlコマンドを実行します。

curl –X GET 'http://<esHost>:9200/ondb.kvstore.jokeTbl.jokeIndx/_mapping?pretty'

注意:

テキスト索引付きフィールドには、Oracle NoSQLのセカンダリ索引の場合と同じ制限で、同じ方法で指定された非スカラー型(マップや配列など)を含めることができます。