さまざまな分析用にカラムのインデックスを作成する
さまざまな方法で同じカラムにクエリーを実行したり、複数のカラムを組み合わせたりするために、さまざまな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。
手順
-
環境に適したレプリケーション・ストラテジとレプリケーション係数を使用してキースペースを作成します。以下の例は、単一ノードのテスト・クラスター用です。
CREATE KEYSPACE user_info WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };
-
テーブルを作成します。
CREATE TABLE user_info.users ( id text PRIMARY KEY, name text, email text, skype text, irc text, twitter text ) ;
-
いくつかのデータを挿入します。
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');
-
テーブルに対して検索インデックスを作成します。
CREATE SEARCH INDEX ON user_info.users;
-
すべてのデータを含むインデックス内にのみ存在するフィールドを作成します。
ALTER SEARCH INDEX SCHEMA ON user_info.users ADD fields.field[ @name='all', @type='StrField', @multiValued='true'];
-
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'];
-
nameカラムでファセット化ができるように、
docValues
をtrue
に設定します。ALTER SEARCH INDEX SCHEMA ON user_info.users SET fields.field[@name='name']@docValues='true';
-
スキーマを再度読み込んで保留中の変更をアクティブ化します。
RELOAD SEARCH INDEX ON user_info.users;
-
インデックスをリビルドして、新しいスキーマを既存のデータに適用します。
REBUILD SEARCH INDEX ON user_info.users;
-
インデックスを使用してクエリーをフィルター処理し、すべてのカラムの中で
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)
-
一意の名前の数を取得します(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)