検索インデックス結合の構成

検索インデックス・スキーマを変更し、テーブル全体で検索インデックスの結合を有効または無効にします。

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に設定することで、検索インデックスの結合を無効にします。

手順

  1. スキーマに_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>
  2. 必要に応じて、文字列型の定義を追加します。
    ALTER SEARCH INDEX SCHEMA ON wiki.solr 
    ADD types.fieldType[@class='org.apache.solr.schema.StrField', @name='StrField'];
    定義は保留中のスキーマに追加され、すぐには適用されません。
  3. パーティション・キー・フィールドを定義します。
    • 検索インデックスに既にパーティション・キー・フィールドがある場合は、indexeddocValuesを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も必要です。
  4. スキーマ定義が正しく変更されていることを確認します。
    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>
  5. スキーマを再度読み込んでアクティブ化します。
    RELOAD SEARCH INDEX ON wiki.solr;
  6. 必要に応じて、検索インデックスをリビルドします。
    REBUILD SEARCH INDEX ON wiki.solr;
    注: CQLからリビルドすると、インデックスがすべてのSearchノードの既存のデータから再作成されます。この処理はかなりのリソースを使用し、結合が無効になっている場合には必要ありません。スキーマを変更した後にリビルド・コマンドを実行しない場合、フィールド内の新しいデータは複製されず、インデックスも作成されません。ノードごとにインデックスを再作成するにはdsetool rebuild_indexesを使用します。

結合の有効化

前に無効にした検索インデックスで結合を有効にします。

前に結合を無効にした検索インデックスで結合を有効にするには、_partitionKeydocValues、およびindexedの各属性をtrueに設定し、スキーマを再度読み込み、インデックスをリビルドします。
注: 大きいデータセットの検索インデックスをリビルドすると、cqlshのデフォルトのタイムアウトを超過する場合があります。cqlshを起動する前に、タイムアウトをオーバーライドできます。「インデックス管理のためのタイムアウトの調整」を参照してください。

手順

  1. 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';
  2. スキーマ定義が正しく変更されていることを確認します。
    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>
  3. スキーマを再度読み込んでアクティブ化します。
    RELOAD SEARCH INDEX ON wiki.solr;
  4. 検索インデックスをリビルドします。
    REBUILD SEARCH INDEX ON wiki.solr;