フルテキストインデックスのマッピングは、HBase テーブルと検索インデックスを関連付けます。各マッピングでは、同期対象となる HBase カラム、行キーのエンコーディング方法、および各カラムのデータの型を定義します。本ページでは、HBase Shell を使用したマッピングの作成、更新、確認方法について説明します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
クイックスタート ガイドをご参照ください。
最新版の HBase Shell をダウンロードし、設定済みであることです。
マッピングの作成
マッピング構成を JSON ファイルに保存し、HBase Shell に渡します。次の例では、testTable から 2 つのカラムを democollection 検索インデックスにマップしています。
{
"sourceNamespace": "default",
"sourceTable": "testTable",
"targetIndexName": "democollection",
"indexType": "SOLR",
"rowkeyFormatterType": "STRING",
"fields": [
{
"source": "f:name",
"targetField": "name_s",
"type": "STRING"
},
{
"source": "f:age",
"targetField": "age_i",
"type": "INT"
}
]
}この例では、testTable のデータが democollection に同期されます。f:name カラム(カラムファミリーと修飾子を : で区切った形式)はインデックス内の name_s にマップされ、f:age は age_i にマップされます。
マッピングパラメーター
| パラメーター | 説明 |
|---|---|
sourceNamespace | HBase テーブルの名前空間です。テーブルに名前空間が設定されていない場合は、空白のままにするか、default を指定します。 |
sourceTable | 名前空間を除いた HBase テーブル名です。 |
targetIndexName | 検索インデックスの名前です。 |
indexType | 固定値:SOLR。 |
rowkeyFormatterType | 行キーをインデックス文書の ID フィールド(常に文字列)としてエンコードする方法です。有効な値: STRING、HEX。詳細については、「rowkeyFormatterType の選択」をご参照ください。 |
fields | カラムマッピングの JSON 配列です。複数のエントリはカンマで区切ります。詳細については、「フィールドマッピングの構成」をご参照ください。 |
rowkeyFormatterType の選択
rowkeyFormatterType は、HBase の行キーを検索インデックスの ID フィールド(常に文字列)に変換する方法を決定します。
| 値 | 使用タイミング | エンコーディング | デコード |
|---|---|---|---|
STRING | 行キーが Bytes.toBytes(String) を使用して書き込まれている場合 — たとえば、row1、order0001、または文字列 "12345" | Bytes.toString(byte[]) | Bytes.toBytes(String) |
HEX | 行キーが数値型、非文字列フィールドを含む複合キー、または Bytes.toBytes(String) | org.apache.commons.codec.binary.Hex の Hex.encodeAsString(byte[]) | Hex.decodeHex(String.toCharArray()) |
選択方法: 最も重要な判断基準は、行キーのバイト列が当初どのように書き込まれたかです。Bytes.toBytes(String) を使用している場合は、STRING を選択してください。その他のすべての場合 — たとえば、Bytes.toBytes(int) や Bytes.toBytes(long) を使用して書き込まれた数値型の行キーなど — は、HEX を選択してください。
データが Bytes.toBytes(String) 関数を使用せずに HBase テーブルに書き込まれている場合、そのデータ型は STRING とはみなされません。行キーを HBase にインポートする際には、このパラメーターを HEX に設定してください。そうしないと、インデックス内のドキュメント ID をバイト列に戻した際に、元の行キーと異なる結果になる可能性があります。
フィールドマッピングの構成
fields 配列の各エントリは、1 つの HBase カラムを 1 つの検索インデックスフィールドにマップします。
| パラメーター | 説明 |
|---|---|
source | マップ対象の HBase カラムで、family:qualifier 形式で指定します。たとえば、f:name です。 |
targetField | 検索インデックス内の送信先フィールド名です。型を示すサフィックス付きの動的カラムは、事前定義されたスキーマを必要とせず、自動的に識別されます。 |
type | HBase に格納されているカラムのデータの型です。Bytes.toBytes() を使用した書き込み方法と一致させる必要があります。有効な値(大文字小文字を区別):INT、LONG、STRING、BOOLEAN、FLOAT、DOUBLE、SHORT、BIGDECIMAL。 |
動的カラム
検索サービスでは、フィールド型を自動的に識別するためにサフィックス命名規則を利用する動的カラムがサポートされています。managed_schema 構成セットで各フィールドを事前定義する必要はありません。
一般的なサフィックスと対応する型は以下のとおりです。
| サフィックス | 型 |
|---|---|
_s | STRING |
_i | INT |
たとえば、name_s は自動的に STRING 型のフィールドとして認識され、age_i は INT 型のフィールドとして認識されます。サポートされるサフィックスの完全な一覧については、「構成セットの更新」をご参照ください。
HBase のデータの型の動作
HBase では、すべてのデータが生のバイト列として格納されます。type パラメーターは、同期時に検索サービスがこれらのバイト列をどのように解釈するかを指定します。
int age = 25;
byte[] ageValue = Bytes.toBytes(age);
put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("age"), ageValue);
String name = "25";
byte[] nameValue = Bytes.toBytes(name);
put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("name"), nameValue);この例では、f:age は INT 型、f:name は STRING 型です — 両方とも偶然に値 25 を保持しているにもかかわらずです。type を誤って設定すると、検索サービスが誤ったデコードメソッド(たとえば、文字列カラムに対して Bytes.toInt())を呼び出し、データの同期が破損または失敗する原因になります。
ソースカラムの型とインデックスフィールドの型は一致させる必要はありません。たとえば、f:age は HBase 内で STRING 型として格納されていても、targetField がインデックス内の age_i(INT)を指すように設定できます。検索サービスが値を自動的に変換します。ただし、文字列の値を INT フィールドに変換できない場合(たとえば、INT フィールドに数値以外の値が含まれている場合)は、同期中にエラーが発生します。
スキーマの管理
マッピング作成後に、HBase Shell コマンドを使用してマッピングの表示および変更を行います。
現在のマッピングの表示
JSON 形式で完全なマッピングスキーマを取得するには、describe_external_index を実行します。
hbase(main):005:0> describe_external_index 'testTable'マッピングの変更
alter_external_index を使用して、マッピングスキーマ全体を置き換えます。schema.json ファイルを HBase Shell の起動ディレクトリに配置するか、相対パスまたは絶対パスを指定します。
hbase(main):006:0> alter_external_index 'HBase table name', 'schema.json'各 alter_external_index の呼び出しは、スキーマ全体を置き換えます。複数のカラムを一度に追加、更新、削除するには、単一の JSON ファイルにすべてのカラムを含めてください。
テーブルからすべてのフィールドマッピングを削除するには、fields を空の配列に設定します。
{
"sourceNamespace": "default",
"sourceTable": "testTable",
"targetIndexName": "democollection",
"indexType": "SOLR",
"rowkeyFormatterType": "STRING",
"fields": []
}マッピングへのカラムの追加
add_external_index_field を使用して、スキーマ全体を置き換えずに個別のカラムを追加します。
hbase shell> add_external_index_field 'testTable', {FAMILY => 'f', QUALIFIER => 'money', TARGETFIELD => 'money_f', TYPE => 'FLOAT'}add_external_index_field は、すでに alter_external_index を使用してスキーマが変更されたテーブルでのみ機能します。多数のカラムを一括で変更する場合は、代わりに alter_external_index を使用してください — このコマンドは、単一の操作でスキーマ全体を置き換えます。
マッピングからのカラムの削除
remove_external_index を使用して、特定のカラムマッピングを削除します。
hbase shell> remove_external_index 'testTable', 'f:name', 'f:age'次のステップ
構成セットの更新 — 動的でないカラム向けに
managed_schemaを構成し、サポートされるすべての動的フィールドサフィックスを確認します。