マップ・カラムのインデックス作成

CQLマップ・カラムのインデックスを動的に作成したり、キーのSolrフィールド型を手動で設定したりします。

DataStax Enterprise(DSE)Searchでは、Solr動的フィールドを使用してCQLマップ・カラムのインデックスを作成します。動的フィールドは、名前に対するワイルドカード一致を使用してフィールド定義を適用します。検索インデックス・スキーマでは、DSEによって動的フィールドの名前がアスタリスクを追加したCQLカラム名に設定されます。DSEはキーを使用してマップ・データを解析し、Solrはプレフィックスとしてカラム名が付いているキーにのみインデックスを作成します。プレフィックスとしてカラム名が付けられていないキーは無視されます。

たとえば、デフォルト設定でcycling birthday_listテーブルに対して検索インデックスを作成する場合、blist_マップ・カラム定義は次のようになります。
<dynamicField indexed="true" multiValued="false" name="blist_*" type="StrField"/>
DSEでCQL行からインデックスを作成する場合、カラム名ではなくキー名が使用されます。したがって、例でプレフィックスとしてblist_を含んでいるすべてのキーでインデックスが作成され、残りは無視されます。以下のデータが挿入される場合、blist_ageblist_nationにのみインデックスが作成されます。
INSERT INTO cycling.birthday_list (cyclist_name, blist_) 
VALUES ('Allan DAVIS', 
         { 'blist_age':'35', 
           'bday':'27/07/1980', 
           'blist_nation':'AUSTRALIA'});

CQLマップのキーと値のペアはすべて同じデータ型になります。上記の例のマップですべての値をテキスト(blist map<text,text>)に設定します。DSE Searchはキー名をSolr動的フィールド名にマッピングすることでデータを読み込むため、各キーのフィールド型をカスタマイズすることができます。

始める前に

このセクションでは、すべてのレコード、blist_age、bday(生年月日)、blist_nationに同一の3つのマップ・キーがあるデータについて、インデックスをカスタマイズするプロセスについて説明します。ここでは、blist_ageとblist_nationにのみインデックスが作成されています。

以下のキースペースとテーブルを設定して、次の例を使用します。
  • cyclingキースペースを作成します
  • birthday_listテーブルとデータを追加します

手順

  1. blist_マップ・カラムを実行するインデックスを作成します。
    CREATE SEARCH INDEX ON cycling.birthday_list 
    WITH COLUMNS blist_ {excluded:true};
  2. アクティブなスキーマを表示します。
    DESC ACTIVE SEARCH INDEX SCHEMA ON cycling.birthday_list ;
    DSEでCQL textをSolr StrField型に設定します。
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <schema name="autoSolrSchema" version="1.5">
      <types>
        <fieldType class="org.apache.solr.schema.StrField" name="StrField"/>
      </types>
      <fields>
        <field indexed="true" multiValued="false" name="cyclist_name" type="StrField"/>
      </fields>
      <uniqueKey>cyclist_name</uniqueKey>
    </schema>

    blist_ageを整数に設定するには、型の定義も必要になります。

  3. blist_age型を定義し、フィールド定義を構成します。
    ALTER SEARCH INDEX SCHEMA ON cycling.birthday_list 
    ADD types.fieldType[@class='org.apache.solr.schema.TrieIntField', @name='TrieIntField'];
    
    ALTER SEARCH INDEX SCHEMA ON cycling.birthday_list 
    ADD fields.field[@indexed='true', @multiValued='false', @name='blist_age', @type='TrieIntField'];
    
  4. blist_nationフィールドを文字列型として定義します。ここには、@type='StrField'の対応する型定義が含まれています。
    ALTER SEARCH INDEX SCHEMA ON cycling.birthday_list 
    ADD fields.field[@name='blist_nation', @indexed='true', @multiValued='false', @type='StrField'];
  5. 保留中のスキーマへの変更を表示し、構文が正しいことを確認します。
    DESC PENDING SEARCH INDEX SCHEMA ON cycling.birthday_list ; 
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <schema name="autoSolrSchema" version="1.5">
      <types>
        <fieldType class="org.apache.solr.schema.StrField" name="StrField"/>
        <fieldType class="org.apache.solr.schema.TrieIntField" name="TrieIntField"/>
      </types>
      <fields>
        <field indexed="true" multiValued="false" name="cyclist_name" type="StrField"/>
        <field indexed="true" multiValued="false" name="blist_age" type="TrieIntField"/>
        <field indexed="true" multiValued="false" name="blist_nation" type="StrField"/>
      </fields>
      <uniqueKey>cyclist_name</uniqueKey>
    </schema>
  6. インデックスの構成とスキーマを再読み込みし、変更をライブにプッシュします。
    RELOAD SEARCH INDEX ON cycling.birthday_list;
  7. フィールドが追加された場合は必ずインデックスをリビルドします。
    REBUILD SEARCH INDEX ON cycling.birthday_list;
  8. マップ・フィールドを使用してクエリーをフィルター処理します。
    • 23歳までに制限します。
      SELECT * FROM cycling.birthday_list WHERE solr_query = 'blist_age:23';
        cyclist_name     | blist_                                                               | solr_query
      ------------------+----------------------------------------------------------------------+------------
         Claudio HEINEN | {'bday': '27/07/1992', 'blist_age': '23', 'blist_nation': 'GERMANY'} |       null
       Laurence BOURQUE |        {'bday': '27/07/1992', 'blist_age': '23', 'nation': 'CANADA'} |       null
      
      (2 rows)
    • 国をGERMANYに制限します。型が文字列なので大文字と小文字が区別されます。
      SELECT * FROM cycling.birthday_list WHERE solr_query = 'blist_nation:GERMANY';
      cyclist_name   | blist_                                                               | solr_query
      ----------------+----------------------------------------------------------------------+------------
       Claudio HEINEN | {'bday': '27/07/1992', 'blist_age': '23', 'blist_nation': 'GERMANY'} |       null
      
      (1 rows)