JSONを使用したDSE Searchクエリー
DSE Searchクエリーは、JSONベースのクエリー式をサポートしています。
このページの説明内容
JSONクエリー構文
JSONクエリー式の構文はJSON文字列です。JSONベースのクエリー式は、以下のパラメーターに加えてローカル・パラメーターをサポートしています。{
"q":query_expression (string),
"fq":filter_query_expression(s) (string_or_array_of_strings),
"facet":facet_query_expression (object)
"sort":sort_expression (string),
"start":start_index(number),
"tz":zoneID), // java TimeZoneクラスの有効なゾーンID
"paging":"driver" (string),
"distrib.singlePass":true|false (boolean),
"shards.failover":true|false (boolean), // デフォルト:true
"shards.tolerant":true|false (boolean), // デフォルト:false
"commit":true|false (boolean),
"route.partition":partition_routing_expression (array_of_strings),
"route.range":range_routing_expression (array_of_strings),
"query.name":query_name (string),
}
例:SELECT id FROM nhanes_ks.nhanes WHERE solr_query=' {"q":"ethnicity:Asian"}';
SELECT id FROM nhanes_ks.nhanes WHERE solr_query='{"q":"ethnicity:Mexi*", "sort":"id asc"}' LIMIT 3;
SELECT * FROM mykeyspace.mysolr WHERE solr_query='{"q" :"{!edismax}quotes:yearning or kills"}';
分散クエリーをシャード障害耐性にする
有効な構成 | 説明 |
---|---|
|
このデフォルトの構成を使用すると、クエリー・フェイルオーバーが有効になり、フォールト・トレランスが無効になります。エラーから復旧の見込みが妥当と判断される場合は、失敗したシャード要求を再試行してみてください。クエリーが完了する前に分散したノード(シャード)が失敗する場合は、シャード・クエリーをレプリカに対して再試行します。 |
|
クエリー・フェイルオーバーを無効にします。フォールト・トレランスを有効にします。クエリーが部分的にしか正常に完了されず、すべてのノードに対して正常に完了されなかった場合でも、クエリーを正常に完了します。 |
|
クエリー・フェイルオーバーを無効にします。フォールト・トレランスを無効にします。 |
その他のフォールト・トレランス構成オプションには、以下のものがあります。netty_client_request_timeout(dse.yaml内)およびread_request_timeout_in_ms(cassandra.yaml内)。
Lucene Solr特殊文字であるリテラル文字を使用したJSONクエリー
Luceneは、クエリー構文の一部である特殊文字のエスケープをサポートしています。特殊文字には、 +, -, &&, ||, !, (, ), ", ~,
*, ?,
および :
があります。JSONをsolr_query
と併用するには、Lucene特殊文字であるリテラル文字の追加構文が必要です。
単純な検索文字列 | mytestuser1? |
Solrクエリー | name:mytestuser1\? |
CQL Solrクエリー | solr_query='{"q":"name:mytestuser1\\?"}' |
複雑な検索文字列 | (1+1):2 |
Solrクエリー | e:\(1\+1\)\:2 |
CQL Solrクエリー | solr_query='{"q":"e:\\(1\\+1\\)\\:2"}' |
検索クエリーにおけるデフォルトのTimeZone(UTC)のオーバーライド
日付計算 | 結果 |
---|---|
2016-03-10T12:34:56Z/YEAR |
デフォルトのTZ
|
TZ=America/Los_Angeles
|
|
2016-03-10T08:00:00Z+1DAY |
デフォルトのTZ
|
TZ=America/Los_Angeles
|
JSONクエリーによるフィールド、クエリー、範囲のファセット化
- HTTP APIで必要とされるファセット・プレフィックスを使用せずに、各ファセット・パラメーターを指定する
- 複数のファセット・フィールドとクエリーをJSON配列内で表現する
- ファセット化された検索例
-
SELECT * FROM solr WHERE solr_query='{"q":"id:*","facet":{"field":"type"}}';
- クエリー・ファセット例
-
SELECT * FROM solr WHERE solr_query='{"q":"id:*","facet":{"query":"type:0"}}';
- 複数のクエリー例
-
SELECT * FROM solr WHERE solr_query='{"q":"id:*","facet":{"query":["type:0","type:1"]}}';
- 分散されたピボット・ファセット化の例
-
SELECT id FROM table WHERE solr_query='{"q":"id:*","facet":{"pivot":"type,value","limit":"-1"}}'
- 範囲ファセットの例
-
SELECT * FROM solr WHERE solr_query='{"q":"id:*","facet":{"range":"type", "f.type.range.start":-10, "f.type.range.end":10, "range.gap":1}}}';
返される結果は、各カラムがファセットの出力(フィールド、クエリー、または範囲)に対応した単一行としてフォーマットされます。ファセット結果は複雑でネスト化される場合があるため、値はJSONブロブとして表されます。例:facet_fields | facet_queries ------------------------+------------------------- {"type":{"0":2,"1":1}} | {"type:0":2,"type:1":1}
- 日付による範囲ファセットの例
-
SELECT * FROM solr WHERE solr_query='{"q":"business_date:*","facet":{"range":"business_date", "f.business_date.range.start":"2015-01-01T00:00:00Z", "f.business_date.range.end":"2015-08-01T00:00:00Z", "f.business_date.range.gap":"+1MONTH"}}';
JSONシングルパス分散クエリー
シングルパス分散クエリーは、CQL Solrクエリーでサポートされています。
SELECT * FROM ks.cf WHERE solr_query = '{"q" :"*:*", "distrib.singlePass" :true}'
シングルパス分散クエリーを使用すると、ディスクおよびネットワークのオーバーヘッドが増える可能性があるため、運用コストがかかります。シングルパス・クエリーでは、各ノードはクエリーを満たす行をすべて読み取り、コーディネーター・ノードに返します。シングルパス分散クエリーは高度な機能であるため、クエリーされた行の取得中に、1つのネットワーク往復の転送を保存します。通常の分散クエリーは2つのネットワーク往復を実行します。クエリーを満たすSolrからIDを取得するのが1つで、もう1つが最初のステップから得たIDに基づいて、Cassandraからのクエリーを満たす行のみを取得するものです。シングルパス分散クエリーは、見つかったほとんどのドキュメントが検索結果に表示される場合に最も効果的です。これらのドキュメントがコーディネーター・ノードに返されない場合は効果はありません。たとえば、コーディネーター・ノードから1つのノードに分けるだけの分散クエリーは、シングルパス・クエリーとしては効果的でありません。
CQLのシングルパス分散クエリーは、追加のdistrib.singlePassブーリアン・パラメーターがJSONクエリーに含まれている場合にサポートされています。
シングルパス・クエリーでは、Solrスキーマで定義されているドキュメント・フィールドのみがクエリー結果として返されるという制約があります。この制約は、動的フィールド・マッピングに従っていないマップ・エントリーにも適用されます。
JSONクエリーのnameオプション
SELECT id FROM nhanes_ks.nhanes WHERE solr_query=' {"query.name":"Asian subjects", "q":"ethnicity:Asia*"}' LIMIT 50;
JSONクエリーのcommitオプション
ドキュメントを一括で読み込んだ後にカスタム・クエリーを実行し、通常のauto soft commitが無効になっているか、その頻度が極端に少ない場合に最新データをクエリーに表示するには、JSONクエリーのcommitオプションを使用して、保留中のすべての更新がソフトコミットされているのを確認してからクエリーを実行します。デフォルトでは、commitオプションはfalseに設定されています。
SELECT id FROM nhanes_ks.nhanes WHERE solr_query='{"q":"ethnicity:Asia*", "commit":true}' LIMIT 50;
タプルとUDTのDSE Searchクエリー
- タプル・データ型は、位置指定された型付きのフィールドを要素とする固定要素数の集合を保持します。ユーザー定義型の代わりにタプルを使用できます。
- ユーザー定義型(UDT)を使用すると、テーブル内で関連する情報を持つ複数のフィールドを扱うのが容易になります。UDTはタプルの特殊型です。すべての例とタプルへのドキュメント・リファレンスは、タプルにもUDTにも適用します。
情報を別のテーブルに格納するのではなく、ユーザー定義型を使用して関連する情報のフィールドを表すことで、複数のテーブルを必要とするアプリケーションを、より少ないテーブルを使うようにして簡素化できます。
ページングを動的に有効にするためのクエリー
cqlsh> select id from wiki.solr where solr_query='{"q":"*", "sort":"id asc", "paging":"driver"}';