DSE SearchのCQL Solrクエリー

DataStax Enterpriseは、DSE SearchのCQL Solrクエリーの実稼働グレード実装をサポートしています。Solr固有APIを使用せずに全文検索ができる、CQLを中核としたアプリケーションを開発できます。

DataStax Enterpriseは、DSE SearchのCQL Solrクエリーの実稼働グレード実装をサポートしています。Solr固有APIを使用せずに全文検索ができる、CQLを中核としたアプリケーションを開発できます。全文検索クエリーのみが今回のリリースでサポートされます。CQLを使用することで、DSE Searchは、トランザクション・コストを低く抑えながら、既存の情報を変更できる部分的なドキュメント更新をサポートしています。DSE SearchのCQL Solrクエリーを使用する前に、CQLクエリーを処理するようにsolrconfig.xmlを構成します

このページの説明内容

DSE SearchのCQL Solrクエリーに必要な構成

CQL solr_query構文に対応できるのは、検索が有効なノードの場合のみです。

自動的にリソースを生成している場合、solrconfig.xmlファイルはすでに、DSE SearchのCQL Solrクエリーを実行するための要求ハンドラーを含んでいます。自動的にリソースを生成せず、カスタムリソースを使用してCQL Solrクエリーを実行すると、CqlSearchHandlerハンドラーが自動的に挿入されます。
<requestHandler class="com.datastax.bdp.search.solr.handler.component.CqlSearchHandler" name="solr_query" />

CQL Solrクエリーの制限事項と推奨事項

  • CQL Solrクエリーはデフォルトでは、LIMIT 10に相当します。
  • CQL Solrクエリーの行の取得フェーズでは、LOCAL_ONEの整合性レベルを読み取りに使用します。これとは対照的に、HTTP Solrクエリーではローカル/内部読み取りを使用します。
  • ページネーションはデフォルトではオンになっていません。 CQL Solrクエリーでドライバーを使用する場合、ドライバーがページネーション(カーソルとも呼ばれる)を使用する場合にのみページネーションを使用するように指定できます。dse.yamlファイルでcql_solr_query_pagingオプションを設定すると、driverに設定されます。CQL Solrクエリーでカーソルをオフにするには、dse.yamlファイルでcql_solr_query_pagingオプションをoffに設定します。CQLおよびJSONクエリーでpaging:driverパラメーターを使用し、ページネーションを動的に有効化することができます。 .
  • Solrの制限事項はページネーションに適用されます
  • クエリーが返す結果セットが小さい場合、ページングを停止するとパフォーマンスが向上します。
注: 制限事項と既知のApache Solr問題は、DSE Searchクエリーに適用されます。たとえば、テキスト・フィールドにトークンが付けられている場合は、不正なSORT結果が返されます。

CQL Solrクエリー構文

search expressionを含むSELECT文を使用してCQL Solrクエリーを実行できます。

構文

SELECT select expression
FROM table
[WHERE solr_query = 'search expression'] [LIMIT n]
2種類のsearch expressionがあります。

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

Solrクエリー式は、Solrのqパラメーターによってサポートされている構文を使用します。例:
SELECT * FROM keyspace.table WHERE solr_query='name:cat name:dog -name:fish'
特定のカラムを指定すると、DSE Searchは、指定されたカラムだけを取得し、それらのカラムを結果行の一部として返します。DSE Searchは、select式として射影(SELECT a, b, c…)のみをサポートし、関数はサポートしていません。以下の例では指定カラムのみを取得します。
SELECT name FROM keyspace.table WHERE solr_query='name:cat name:dog -name:fish'
LIMIT句を使用して、返す行の数を指定します。 以下の例では1行のみを取得します。
SELECT * FROM keyspace.table WHERE solr_query='name:cat name:dog -name:fish' LIMIT 1
CQL Solrクエリーのcount()関数を使用すると、Solrクエリーを満たす行数が返されます。
SELECT count(*) FROM table WHERE solr_query = '...';

CQL Solrクエリーを使用して整合性レベルや順序を設定したり、solr_query以外のWHERE 句を指定したりすることはできません。CQL Solrクエリーの整合性レベルはデフォルトではONEで、変更してはなりません。変更すると、クエリーはエラーを返します。

count()をLIMITまたはファセットと併せて使用すると、エラーが発生します。

ドライバーのすべての応答クエリーにカスタム・ペイロードがあります。ここでは、検出されたドキュメントの総数が返されます。この数値はDSESearch.numFoundとして入力されます。

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

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

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

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

SolrクエリーによるCQLパーティション・キーの制約の使用

Solr CQLクエリーは、単一のパーティション・キーに対する制約をサポートしています。パーティション・キーの制約が適用されるのは、_partitionKeyに明示的にインデックスが付いているか、スキーマにCassandraパーティション・キーのすべてのコンポーネントが明示的に含まれている場合に限ります。スキーマでは、結合を使用していない場合にパーティション・キーをオーバーライドできます

例:
SELECT id, date, value FROM keyspace.table WHERE id = 'series1' AND solr_query='value:bar*'" 
CQLパーティション・キーの制約は、パーティション・キーが完全に指定されている場合にしか対応できません。たとえば、このテーブルでは以下のようになります。
CREATE TABLE vtbl (k1 text, k2 text, valuetext, PRIMARYKEY ((k1, k2)))
次のようなクエリーの使用は避けます。
SELECT * FROM vtbl WHERE k1 = '50' AND solr_query='value:*'
フィルター・クエリーを部分的に指定された複合パーティション・キーに対して使用します。
SELECT * FROM valuetable WHERE solr_query='{"q":"value:*", "fq":"k1:50"}'

Solrトークン関数の使用

Solr CQLクエリーでは、CQLトークン関数の使用は制限されています。トークン関数を使用すると、目標とする検索を有効にして、レイテンシーを短縮するためにクエリーされたノードを制限できます。
注: Solrトークン関数の使用は上級ユーザーのみを対象とし、特定のユース・ケースでのみサポートされています。
例:
SELECT id, value FROM keyspace.table WHERE token(id) >= -3074457345618258601 AND token(id) <= 3074457345618258603 AND solr_query='id:*'
限定されていない範囲を使用した例:
SELECT id, value FROM keyspace.table WHERE token(id) >= 3074457345618258604 AND solr_query='id:*'
制約はトークン関数をSolr CQLクエリーと併用する場合に適用されます。
  • token()はroute.rangeまたはroute.partitionと併用できない
  • token()範囲のラップはサポートされていない
  • 特定のtoken()範囲が単一のノードによって所有されている必要がある(範囲は複数のノードにまたがってはいけない)
  • DSEではSolrシングルパスクエリーが使用されるため、Solrスキーマで宣言されたフィールドのみがクエリー結果で返されます。インデックスを付ける必要はないが、トークンで制限されたクエリーを使用して返す必要があるカラムがある場合は、schema.xmlファイルに格納された非インデックス付きフィールドとして宣言できます。

クエリー内のセカンダリ・インデックス(2i)

solr_queryを使用して、Solrで作成されたセカンダリ・インデックス(2i)をクエリーします。使用方法:

SELECT * from users WHERE solr_query = '{"q":"irc:jdoe"}';
Solrで作成されたセカンダリ・インデックスは、cqlshクエリーでCassandra 2iインデックスとして使用できません。たとえば、次の構文は成立しません。 SELECT * FROM users WHERE irc = 'jdoe';.