検索インデックス結合の構成
検索インデックス・スキーマを変更し、テーブル全体で検索インデックスの結合を有効または無効にします。
DataStax Enterpriseは、パーティション・キー・フィールド(_partitionKey
)のsolr_query
結合をサポートしています。デフォルトでは、solr_query
結合関数が有効になっており、DSEではこの追加のフィールド内のパーティション・カラムのインデックスが作成されます。この_partitionKey
フィールドにより、検索インデックスのサイズが増大します。結合を無効にすると、検索インデックスが使用するディスク領域の容量を削減できます。
スキーマ内の結合設定
DESCRIBE ACTIVE SEARCH INDEX SCHEMA
は、検索インデックスのスキーマ設定を表示します。結合が有効になっている場合、_partitionKey
の定義は表示されません。
スキーマに
_partitionKey
というフィールドが含まれている場合、結合のサポートは以下のようになります。 - 有効:
docValues
属性とindexed
属性をtrueに設定します。例を次に示します。<field name="_partitionKey" docValues="true" indexed="true" stored="false" type="StrField"/>
。 - 無効:
docValues
属性とindexed
属性をfalseに設定します。例を次に示します。<field docValues="false" indexed="false" multiValued="false" name="_partitionKey" omitNorms="true" stored="false" type="StrField"/>
注: スキーマに
_partitionKey
のフィールド定義が含まれていない場合、結合は有効になります。前提条件
このセクションでは、ウィキペディア・デモを使用した語句の検索を使用します。
結合の無効化
_partitionKey
フィールドのindexed
属性とdocValues
属性をfalseに設定します。
スキーマ内の_partitionKey
フィールドのindexed
属性とdocValues
属性をfalseに設定することで、検索インデックスの結合を無効にします。
手順
-
スキーマに
_partitionKey
フィールドとfieldTypeのStrField
の定義が含まれていることを確認します。DESCRIBE ACTIVE SEARCH INDEX SCHEMA ON wiki.solr;
検索インデックス例では、_partitionKey
の定義がなく、結合が有効になっています。<?xml version="1.0" encoding="UTF-8" standalone="no"?> <schema name="autoSolrSchema" version="1.5"> <types> <fieldType class="org.apache.solr.schema.TextField" name="TextField"> <analyzer> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType> <fieldType class="org.apache.solr.schema.TrieDateField" name="TrieDateField"/> <fieldType class="org.apache.solr.schema.StrField" name="StrField"/> </types> <fields> <field indexed="true" multiValued="false" name="body" stored="true" type="TextField"/> <field docValues="true" indexed="true" multiValued="false" name="real_date" stored="true" type="TrieDateField"/> <field indexed="true" multiValued="false" name="title" stored="true" type="TextField"/> <field indexed="true" multiValued="false" name="id" stored="true" type="StrField"/> <field indexed="true" multiValued="false" name="date" stored="true" type="TextField"/> </fields> <uniqueKey>id</uniqueKey> </schema>
-
必要に応じて、文字列型の定義を追加します。
ALTER SEARCH INDEX SCHEMA ON wiki.solr ADD types.fieldType[@class='org.apache.solr.schema.StrField', @name='StrField'];
定義は保留中のスキーマに追加され、すぐには適用されません。 -
パーティション・キー・フィールドを定義します。
- 検索インデックスに既にパーティション・キー・フィールドがある場合は、
indexed
とdocValues
をfalseに変更します。ALTER SEARCH INDEX SCHEMA ON wiki.solr SET field[@name='_partitionKey']@docValues='false'; ALTER SEARCH INDEX SCHEMA ON wiki.solr SET field[@name='_partitionKey']@indexed='false';
- スキーマに
_partitionKey
定義がない場合は、定義を追加してデフォルト設定をオーバーライドします。ALTER SEARCH INDEX SCHEMA ON wiki.solr ADD fields.field[@name='_partitionKey', @type='StrField', @docValues='false', @indexed='false'];
注: 型定義StrFieldも必要です。
- 検索インデックスに既にパーティション・キー・フィールドがある場合は、
- スキーマ定義が正しく変更されていることを確認します。
DESCRIBE PENDING SEARCH INDEX SCHEMA ON wiki.solr;
たとえば、3つのフィールドと1つのパーティション・キーを含む単純なテーブルがあるとします。<?xml version="1.0" encoding="UTF-8" standalone="no"?> <schema name="autoSolrSchema" version="1.5"> <types> <fieldType class="org.apache.solr.schema.TextField" name="TextField"> <analyzer> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType> <fieldType class="org.apache.solr.schema.TrieDateField" name="TrieDateField"/> <fieldType class="org.apache.solr.schema.StrField" name="StrField"/> </types> <fields> <field indexed="true" multiValued="false" name="body" stored="true" type="TextField"/> <field docValues="true" indexed="true" multiValued="false" name="real_date" stored="true" type="TrieDateField"/> <field indexed="true" multiValued="false" name="title" stored="true" type="TextField"/> <field indexed="true" multiValued="false" name="id" stored="true" type="StrField"/> <field indexed="true" multiValued="false" name="date" stored="true" type="TextField"/> <field docValues="false" indexed="false" name="_partitionKey" type="StrField"/> </fields> <uniqueKey>id</uniqueKey> </schema>
- スキーマを再度読み込んでアクティブ化します。
RELOAD SEARCH INDEX ON wiki.solr;
-
必要に応じて、検索インデックスをリビルドします。
REBUILD SEARCH INDEX ON wiki.solr;
注: CQLからリビルドすると、インデックスがすべてのSearchノードの既存のデータから再作成されます。この処理はかなりのリソースを使用し、結合が無効になっている場合には必要ありません。スキーマを変更した後にリビルド・コマンドを実行しない場合、フィールド内の新しいデータは複製されず、インデックスも作成されません。ノードごとにインデックスを再作成するにはdsetool rebuild_indexesを使用します。
結合の有効化
前に無効にした検索インデックスで結合を有効にします。
_partitionKey
、docValues
、およびindexed
の各属性をtrue
に設定し、スキーマを再度読み込み、インデックスをリビルドします。 注: 大きいデータセットの検索インデックスをリビルドすると、
cqlsh
のデフォルトのタイムアウトを超過する場合があります。cqlshを起動する前に、タイムアウトをオーバーライドできます。「インデックス管理のためのタイムアウトの調整」を参照してください。手順
- DSE Searchを実行しているノードでcqlshを起動します。
-
docValues
属性とindexed
属性をtrue
に設定します。ALTER SEARCH INDEX SCHEMA ON wiki.solr SET field[@name='_partitionKey']@docValues='true'; ALTER SEARCH INDEX SCHEMA ON wiki.solr SET field[@name='_partitionKey']@indexed='true';
- スキーマ定義が正しく変更されていることを確認します。
DESCRIBE PENDING SEARCH INDEX SCHEMA ON wiki.solr;
たとえば、3つのフィールドと1つのパーティション・キーを含む単純なテーブルがあるとします。<?xml version="1.0" encoding="UTF-8" standalone="no"?> <schema name="autoSolrSchema" version="1.5"> <types> <fieldType class="org.apache.solr.schema.TextField" name="TextField"> <analyzer> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType> <fieldType class="org.apache.solr.schema.TrieDateField" name="TrieDateField"/> <fieldType class="org.apache.solr.schema.StrField" name="StrField"/> </types> <fields> <field indexed="true" multiValued="false" name="body" stored="true" type="TextField"/> <field docValues="true" indexed="true" multiValued="false" name="real_date" stored="true" type="TrieDateField"/> <field indexed="true" multiValued="false" name="title" stored="true" type="TextField"/> <field indexed="true" multiValued="false" name="id" stored="true" type="StrField"/> <field indexed="true" multiValued="false" name="date" stored="true" type="TextField"/> <field docValues="false" indexed="false" name="_partitionKey" type="StrField"/> </fields> <uniqueKey>id</uniqueKey> </schema>
- スキーマを再度読み込んでアクティブ化します。
RELOAD SEARCH INDEX ON wiki.solr;
-
検索インデックスをリビルドします。
REBUILD SEARCH INDEX ON wiki.solr;