さまざまな分析用にカラムのインデックスを作成する

さまざまな方法で同じカラムにクエリーを実行したり、複数のカラムを組み合わせたりするために、さまざまなSolr分析チェーンを使用してCQLカラムのインデックスを作成します。

DSE Searchでは、Solr copyFieldディレクティブを使用してさまざまなタイプの分析用にCQLテーブル・カラムのインデックスを作成できます。
ヒント: 詳細については、『Solr Reference Guide』の「Copying fields」を参照してください。

検索インデックスの作成中に指定すると、DSEは新しいインデックス文字列フィールドを自動的に定義し、データ・コピーを設定します。新しいフィールドは、データベースに格納されず、クエリー結果でも返されません。

制約事項: copyField定義で同じ動的フィールドをコピー先/コピー元とすることと、最大文字数(maxChars)を設定することはサポートされていません。
以下の例では、コピー・フィールドを使用して、Twitter名、電子メールなどのさまざまなCQLカラムをmultiValuedフィールドにコピーします。これで、1つの語句を使用してmultiValuedフィールドをクエリーし、1回のクエリーですべてのカラムを検索できるようになります。
注: ネイティブのメモリーを使用して、DSEのセグメントごとのフィルター・キャッシュがオフヒープに移動されるため、オンヒープ・メモリーの消費量とガーベージ・コレクションのオーバーヘッドが低減します。オフヒープのフィルター・キャッシュはデフォルトで有効になっています。無効にするには、オフヒープのJVMシステム・プロパティ-Dsolr.offheap.enable

手順

  1. 環境に適したレプリケーション・ストラテジとレプリケーション係数を使用してキースペースを作成します。以下の例は、単一ノードのテスト・クラスター用です。
    CREATE KEYSPACE user_info
      WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };
  2. テーブルを作成します。
    CREATE TABLE user_info.users (
      id text PRIMARY KEY,
      name text,
      email text,
      skype text,
      irc text,
      twitter text
    ) ;
  3. いくつかのデータを挿入します。
    INSERT INTO user_info.users (id, name, email, skype, irc, twitter) VALUES
      ('user1', 'john smith', 'jsmith@abc.com', 'johnsmith', 'smitty', '@johnsmith');
    
    INSERT INTO user_info.users (id, name, email, skype, irc, twitter) VALUES
      ('user2', 'elizabeth doe', 'lizzy@swbell.net', 'roadwarriorliz', 'elizdoe',  '@edoe576');
    
    INSERT INTO user_info.users (id, name, email, skype, irc, twitter) VALUES
      ('user3', 'dan graham', 'etnaboy1@aol.com', 'danielgra', 'dgraham', '@dannyboy');
    
    INSERT INTO user_info.users (id, name, email, skype, irc, twitter) VALUES
      ('user4', 'john smith', 'jonsmit@fyc.com', 'johnsmith', 'jsmith345', '@johnrsmith');
    
    INSERT INTO user_info.users (id, name, email, skype, irc, twitter) VALUES
      ('user5', 'john smith', 'jds@adeck.net', 'jdsmith', 'jdansmith',  '@smithjd999');
    
    INSERT INTO user_info.users (id, name, email, skype, irc, twitter) VALUES
      ('user6', 'dan graham', 'hacker@legalb.com', 'dangrah', 'dgraham', '@graham222');
  4. テーブルに対して検索インデックスを作成します。
    CREATE SEARCH INDEX ON user_info.users;
  5. すべてのデータを含むインデックス内にのみ存在するフィールドを作成します。
    ALTER SEARCH INDEX SCHEMA ON user_info.users 
    ADD fields.field[ @name='all', 
                      @type='StrField', 
                      @multiValued='true'];
  6. copyFieldを使用して、すべてのCQLカラムのデータを、インデックスの新しいallフィールドにコピーします。
    ALTER SEARCH INDEX SCHEMA ON user_info.users 
       ADD copyField[@source='id', @dest='all'];
    ALTER SEARCH INDEX SCHEMA ON user_info.users 
       ADD copyField[@source='name', @dest='all'];
    ALTER SEARCH INDEX SCHEMA ON user_info.users 
      ADD copyField[@source='email', @dest='all'];
    ALTER SEARCH INDEX SCHEMA ON user_info.users 
      ADD copyField[@source='skype', @dest='all'];
    ALTER SEARCH INDEX SCHEMA ON user_info.users 
      ADD copyField[@source='irc', @dest='all'];
    ALTER SEARCH INDEX SCHEMA ON user_info.users 
      ADD copyField[@source='twitter', @dest='all'];
  7. nameカラムでファセット化ができるように、docValuestrueに設定します。
    ALTER SEARCH INDEX SCHEMA ON user_info.users
      SET fields.field[@name='name']@docValues='true';
  8. スキーマを再度読み込んで保留中の変更をアクティブ化します。
    RELOAD SEARCH INDEX ON user_info.users;
  9. インデックスをリビルドして、新しいスキーマを既存のデータに適用します。
    REBUILD SEARCH INDEX ON user_info.users;
  10. インデックスを使用してクエリーをフィルター処理し、すべてのカラムの中でsmittyを含むすべてのレコードを返します。
    SELECT * FROM user_info.users WHERE solr_query = 'all:smitty';
    出力は以下のようになります。
     id    | email          | irc    | name       | skype     | solr_query | twitter
    -------+----------------+--------+------------+-----------+------------+------------
     user1 | jsmith@abc.com | smitty | john smith | johnsmith |       null | @johnsmith
    
    (1 rows)
  11. 一意の名前の数を取得します(nullはスキップ)。
    SELECT name FROM user_info.users 
       WHERE solr_query= '{"q":"*","facet":{"field":"name","mincount":"1"}}';
    出力の最後にファセットの結果が表示されます。john smithの3つのインスタンス、dan grahamの2つのインスタンス、elizabeth doeの1つのインスタンス。
     facet_fields
    ------------------------------------------------------------
     {"name":{"john smith":3,"dan graham":2,"elizabeth doe":1}}
    
    (1 rows)