インデックスの作成

既存のテーブルに対して新しい検索インデックスを作成します。

既存のテーブルの検索インデックスを作成するには、CREATE SEARCH INDEXを使用します。
注: CQLコマンドで作成されたインデックスは、データ・センター内のすべてのSearchノードに自動的に分散されます。
制約事項:
Solrフィールド名ポリシーがインデックス・フィールド名に適用されます。
  • すべてのフィールドに名前(name)がある必要があります。
  • フィールド名は英数字とアンダースコアのみで構成されている必要があります。
  • フィールド名の先頭に数字は使用できません。
  • 先頭と末尾の両方にアンダースコアが付いた名前(たとえば、_version_)は予約されています。
注: これらの条件を準拠していないフィールド名は、すべてのコンポーネントでサポートされません。後方互換性は保証されません。

Searchノードでcqlshを起動する

Searchノードに接続してCQL検索管理コマンドを使用します。

Searchノードに接続してCQL検索管理コマンドを使用します。

手順

  1. 大きいデータセットでは、cqlshタイムアウトの値を大きくします。
    export CQLSH_SEARCH_MANAGEMENT_TIMEOUT_SECONDS=900;
  2. Searchノードでcqlshセッションを起動します。
    cqlsh hostname
    リモート・ホストでCQLセッションが起動します。
    Connected to cluster1 at 10.10.10.108:9042.
    [cqlsh 5.0.1 | Cassandra 3.11.0.1805 | DSE 5.1.3 | CQL spec 3.4.4 | Native protocol v4]
    Use HELP for help.
    cqlsh>

デフォルト値を使用した検索インデックスの作成

デフォルト設定を使用して検索インデックスを作成します。

DataStax EnterpriseのCREATE SEARCH INDEXを使用して、すべてのSearchノードに自動的に配布される既存のテーブルの検索インデックスを生成します。

デフォルト値を使用して、検索インデックス(スキーマ構成)が生成されます。スキーマと構成は、内部でsolr_admin.resourcesテーブルに格納され、XML形式で表示されます。

既存のテーブルに対して新しい検索インデックスを作成します。
CREATE SEARCH INDEX ON keyspace_name.table_name;

デフォルト設定を使用して、すべてのカラムのインデックスが作成されます。

デフォルトのクエリー・フィールドの設定

クエリーでフィールドが指定されない場合に使用するフィールドを設定します。

クエリーでフィールドが指定されない場合に検索に使用する汎用フィールドを設定します。

手順

  1. 新しいインデックス専用フィールドを作成します。
    ALTER SEARCH INDEX SCHEMA ON wiki.solr 
    ADD fields.field[ @name='catch_all', 
                      @type='TextField', 
                      @multiValued='true'];
    注: この新しいフィールドには2つのフィールドの値が含まれるため、multiValuedをtrueに設定します。
    保留中のスキーマ変更を表示します。
    DESCRIBE PENDING SEARCH INDEX SCHEMA ON wiki.solr ;
    新しいフィールドは太字で示されています。
    <?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 indexed="true" multiValued="true" name="catch_all" type="TextField"/>
      </fields>
      <uniqueKey>id</uniqueKey>
    </schema>
  2. すべてのCQLカラムからデータを収集するようにコピー・フィールド・ディレクティブを設定します。
    ALTER SEARCH INDEX SCHEMA ON wiki.solr 
    ADD copyField[@source='title', @dest='catch_all'];
    ALTER SEARCH INDEX SCHEMA ON wiki.solr 
    ADD copyField[@source='body', @dest='catch_all'];
    保留中のスキーマ変更を表示します。
    DESCRIBE PENDING SEARCH INDEX SCHEMA ON wiki.solr ;
    新しいコピー・フィールド・ディレクティブは以下に太字で示されています。
    <?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 indexed="true" multiValued="true" name="catch_all" type="TextField"/>
      </fields>
      <uniqueKey>id</uniqueKey>
      <copyField dest="catch_all" source="body"/>
      <copyField dest="catch_all" source="title"/>
    </schema>
  3. 検索インデックス構成でデフォルト・フィールドを定義します。
    ALTER SEARCH INDEX CONFIG ON wiki.solr 
    SET defaultQueryField = 'catch_all' ;
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <config>
      <luceneMatchVersion>LUCENE_6_0_1</luceneMatchVersion>
      <dseTypeMappingVersion>2</dseTypeMappingVersion>
      <directoryFactory class="solr.StandardDirectoryFactory" name="DirectoryFactory"/>
      <indexConfig>
        <ramBufferSizeMB>512</ramBufferSizeMB>
        <rt>false</rt>
      </indexConfig>
      <jmx/>
      <updateHandler>
        <autoSoftCommit>
          <maxTime>10000</maxTime>
        </autoSoftCommit>
      </updateHandler>
      <query>
        <filterCache class="solr.SolrFilterCache" highWaterMarkMB="2048" lowWaterMarkMB="1024"/>
        <enableLazyFieldLoading>true</enableLazyFieldLoading>
        <useColdSearcher>true</useColdSearcher>
        <maxWarmingSearchers>16</maxWarmingSearchers>
      </query>
      <requestDispatcher>
        <requestParsers enableRemoteStreaming="true" multipartUploadLimitInKB="2048000"/>
        <httpCaching never304="true"/>
      </requestDispatcher>
      <requestHandler class="solr.SearchHandler" default="true" name="search">
        <lst name="defaults">
          <str name="df">catch_all</str>
        </lst>
      </requestHandler>
      <requestHandler class="com.datastax.bdp.search.solr.handler.component.CqlSearchHandler" name="solr_query">
        <lst name="defaults">
          <str name="df">catch_all</str>
        </lst>
      </requestHandler>
      <requestHandler class="solr.UpdateRequestHandler" name="/update"/>
      <requestHandler class="solr.UpdateRequestHandler" name="/update/csv" startup="lazy"/>
      <requestHandler class="solr.UpdateRequestHandler" name="/update/json" startup="lazy"/>
      <requestHandler class="solr.FieldAnalysisRequestHandler" name="/analysis/field" startup="lazy"/>
      <requestHandler class="solr.DocumentAnalysisRequestHandler" name="/analysis/document" startup="lazy"/>
      <requestHandler class="solr.admin.AdminHandlers" name="/admin/"/>
      <requestHandler class="solr.PingRequestHandler" name="/admin/ping">
        <lst name="invariants">
          <str name="qt">search</str>
          <str name="q">solrpingquery</str>
        </lst>
        <lst name="defaults">
          <str name="echoParams">all</str>
        </lst>
      </requestHandler>
      <requestHandler class="solr.DumpRequestHandler" name="/debug/dump">
        <lst name="defaults">
          <str name="echoParams">explicit</str>
          <str name="echoHandler">true</str>
        </lst>
      </requestHandler>
    </config>
  4. スキーマと構成を再度読み込んで、保留中の検索インデックス・スキーマと構成をアクティブにします。
    RELOAD SEARCH INDEX ON wiki.solr ;
  5. インデックスをリビルドして、既存のデータの検索インデックスを更新します。
    REBUILD SEARCH INDEX ON wiki.solr ;

結合を無効にしたインデックスの生成

領域を節約する必要がない場合、インデックスの結合を無効にします。

デフォルトでは、複数のパーティション・キー・フィールドが1つのフィールド_partitionKeyに統合され、インデックス間の結合をサポートするために文字列フィールドとして格納されます。結合が必要ない場合は、結合を無効にしてインデックスを作成します。

注: インデックスの作成後に結合を無効にするには、「検索インデックス結合の構成」を参照してください。

手順

  1. 結合を無効にして検索インデックスを作成します。
    検索インデックスの作成時にPROFILES spaceSavingNoJoinオプションで結合を無効にします。例を次に示します。
    CREATE SEARCH INDEX ON demo.health_data 
    WITH PROFILES spaceSavingNoJoin;
  2. 結合が無効になっていることを確認します。
    DESCRIBE ACTIVE SEARCH INDEX SCHEMA ON demo.health_data ;
    ...
    <field docValues="false" indexed="false" multiValued="false" name="_partitionKey" omitNorms="true" stored="false" type="StrField"/>
    ...