スカラー・データ型の索引付けの方法を「索引の作成」で説明し、索引を使用して読み取る方法を「索引の読取り」で説明します。しかし、非スカラー・データ型(配列、マップおよびレコード)はさらに詳細な説明が必要なため、ここで説明します。
索引の作成はCREATE INDEX
文を使用して実行します。この文の詳細は、「CREATE INDEX」を参照してください。
配列にスカラー・データが含まれている、またはスカラー・フィールド付きのレコードが含まれている場合には、配列フィールドに索引を作成できます。
別のマップまたは配列の下にネストされたマップまたは配列には索引付けできません。これができないのは、索引エントリの数が極端に多くなる可能性があるからです。
配列を索引付けすると、場合によっては各行に複数の索引エントリになり、かなり大きな索引になる可能性があります。
索引を作成するには、まず表を作成します。
CREATE TABLE myArrayTable ( uid INTEGER, testArray ARRAY(STRING), PRIMARY KEY(uid) )
表がストアに追加された後、索引を作成します。
CREATE INDEX arrayFieldIndex on myArrayTable (testArray)
配列の場合、別の索引付けが可能な型の1つである型の値を配列に含む場合のみ、フィールドに索引付けが可能です。たとえば、整数の配列には索引を作成できます。レコードの配列にある特定のレコードにも索引を作成できます。各配列エントリに索引エントリがあると、索引のサイズが急激に増加してしまうため、索引には1つの配列のみを加えます。
配列の索引を使用してデータを取得するには、まず名前を使用して索引を取得し、索引参照の実行に使用するIndexKey
のインスタンスを作成します。
Index arrayIndex = myTable.getIndex("arrayFieldIndex"); IndexKey indexKey = arrayIndex.createIndexKey();
次にArrayValue
インスタンスを作成し、値を割り当てます。索引参照を実行するとき、戻されるレコードはArrayValue
に設定される値と一致する項目が少なくとも1つはある配列を含むレコードのみです。たとえば、次のような配列を持つ個々のレコードを持っている場合、
Record 1: ["One," "Two", "Three"] Record 2: ["Two", "Three", "One"] Record 3: ["One", "Three", "One"] Record 4: ["Two", "Three", "Four"]
配列値「One」で配列参照を実行すると、1から3のレコードは戻されますが、4は戻されません。
ArrayValue
を設定するには、IndexKey.putArray()
を使用して作成します。メソッドに配列フィールドの名前を渡します。次に適切な型の配列を使用して、索引値をArrayValue
インスタンスに追加します。
ArrayValue av = indexKey.putArray("testArray"); av.add("One");
その後、一致する表の行を取得し、別の索引タイプと同じ方法で繰り返します。次に例を示します。
TableIterator<Row> iter = tableH.tableIterator(indexKey, null, null); System.out.println("Results for Array value 'One' : "); try { while (iter.hasNext()) { Row rowRet = iter.next(); int uid = rowRet.get("uid").asInteger().get(); System.out.println("uid: " + uid); ArrayValue avRet = rowRet.get("testArray").asArray(); for (FieldValue fv: avRet.toList()) { System.out.println(fv.asString().get()); } } } finally { if (iter != null) { iter.close(); } }