JSONを使用したDSE Searchクエリー

DSE Searchクエリーは、JSONベースのクエリー式をサポートしています。

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"}';
注: Solr Extended DisMaxクエリー・パーサ(eDisMax)をsolr_queryとともに使用するには、defaultSearchFieldをスキーマに含める必要があります。

分散クエリーをシャード障害耐性にする

分散クエリーは多くのシャードにアクセスするため、クエリーのシャード障害耐性を向上させることで、クエリー完了数を確実に増やすことができます。shards.failoverパラメーターとshards.tolerantパラメーターを使用して、JSONクエリー中に発生したクエリー・フェイルオーバーとシャード障害耐性を定義します。
有効な構成 説明
"shards.failover":true,
"shards.tolerant":false,
このデフォルトの構成を使用すると、クエリー・フェイルオーバーが有効になり、フォールト・トレランスが無効になります。エラーから復旧の見込みが妥当と判断される場合は、失敗したシャード要求を再試行してみてください。クエリーが完了する前に分散したノード(シャード)が失敗する場合は、シャード・クエリーをレプリカに対して再試行します。
"shards.failover":false,
"shards.tolerant":true,
クエリー・フェイルオーバーを無効にします。フォールト・トレランスを有効にします。クエリーが部分的にしか正常に完了されず、すべてのノードに対して正常に完了されなかった場合でも、クエリーを正常に完了します。
"shards.failover":false,
"shards.tolerant":false,
クエリー・フェイルオーバーを無効にします。フォールト・トレランスを無効にします。
フェイルオーバーと部分的な結果のトレランスは同じクエリー内に共存できません。クエリーは、単一のパラメーターのみに対するトレランスの有効化をサポートしています。

その他のフォールト・トレランス構成オプションには、以下のものがあります。netty_client_request_timeoutdse.yaml内)およびread_request_timeout_in_mscassandra.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)のオーバーライド

日付計算で追加および切り上げに使用されるデフォルトのTimeZone(UTC)を上書きするようにTZパラメーターを指定します。夏時間(DST)の開始や終了も含めて、指定されたタイムゾーンのローカル・ルールによって、任意の各日付がいつ開始されるかが決まります。タイムゾーン・ルールはDAYSの切り上げと追加に影響しますが、HOURS、MIN、MONTH、およびYEARの切り上げにも影響します。たとえば、異なるタイムゾーンを指定すると、異なる結果が得られます。
日付計算 結果
2016-03-10T12:34:56Z/YEAR デフォルトのTZ

2016-01-01T00:00:00Z

TZ=America/Los_Angeles

2016-01-01T08:00:00Z

2016-03-10T08:00:00Z+1DAY デフォルトのTZ

2016-03-11T08:00:00Z

TZ=America/Los_Angeles

2016-03-11T07:00:00Z

TZパラメーターの値には、java TimeZoneクラスでサポートされているゾーンIDを使用できます。

JSONクエリーによるフィールド、クエリー、範囲のファセット化

ファセットJSONオブジェクト内のファセットパラメーターを指定して、Solrクエリー内のフィールド、クエリー、および範囲のファセット化を実行します。分散されたピボットのファセット化がサポートされています。クエリー構文は以下の方法でファセットを指定するように簡潔なものになっています。
  • 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"}}';
警告: Solr範囲ファセットの先頭、末尾、および中間では、複数ノードのクラスターに関して不正で整合性のない結果が返される場合があります。SOLR-6187およびSOLR-6375を参照してください。
間隔ファセットの例
SELECT * FROM solr WHERE solr_query='{"q":"id:*","facet":{"interval":"id", "interval.set":"[*,500]"}';

JSONシングルパス分散クエリー

シングルパス分散クエリーは、CQL Solrクエリーでサポートされています。

標準の2パス・クエリーの代わりにシングルパス分散クエリーを使用するには、JSONクエリー式でdistrib.singlePassブーリアン・パラメーターを指定します。
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オプション

以下の構文を使用して、メトリクスとパフォーマンス・オブジェクトのモニターをサポートするようにクエリーに名前を付けます。クエリーに名前を付けると、タグ付けやJMX操作に役立つ場合があります。以下に例を示します。
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;
警告: 実稼動クラスターに対する稼動中の操作に、JSONクエリーのcommitオプションを使用しないでください。DataStaxでは、Solr HTTPインターフェイスを介してコミットを強制的に発行するように求められた場合にのみ、JSONクエリーのcommitオプションを使用することを推奨します。Commitオプションは、通常の自動ソフト・コミット処理に置き換わるものではありません。

タプルとUDTのDSE Searchクエリー

DSE Searchでは、タプルおよびユーザー定義型(UDT)を含む、高度なデータ型のインデックス作成とクエリーをサポートしています。
  • タプル・データ型は、位置指定された型付きのフィールドを要素とする固定要素数の集合を保持します。ユーザー定義型の代わりにタプルを使用できます。
  • ユーザー定義型(UDT)を使用すると、テーブル内で関連する情報を持つ複数のフィールドを扱うのが容易になります。UDTはタプルの特殊型です。すべての例とタプルへのドキュメント・リファレンスは、タプルにもUDTにも適用します。

    情報を別のテーブルに格納するのではなく、ユーザー定義型を使用して関連する情報のフィールドを表すことで、複数のテーブルを必要とするアプリケーションを、より少ないテーブルを使うようにして簡素化できます。

構成とスキーマ要件が適用されます。「UDTとタプルのクエリー例」を参照してください。

ページングを動的に有効にするためのクエリー

cql_solr_query_pagingオプションがdse.yamlファイルでオフになっている場合は、paging:driverパラメーターを使用してページネーションを動的に有効にします。
cqlsh> select id from wiki.solr where solr_query='{"q":"*", "sort":"id asc", "paging":"driver"}';