2016-03-01 16 views
5

私はcassandra 2.1.10を使用しています。 だから最初に私は私がセカンダリインデックスを知っていることが明らかになり、私は次しようとしていたテストの目的のためにcassandra.Butにおけるアンチパターンです:cassandraのセカンダリインデックスの範囲クエリ

CREATE TABLE test_topology1.tt (
    a text PRIMARY KEY, 
    b timestamp 
) WITH bloom_filter_fp_chance = 0.01 
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}' 
    AND comment = '' 
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'} 
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'} 
    AND dclocal_read_repair_chance = 0.1 
    AND default_time_to_live = 0 
    AND gc_grace_seconds = 864000 
    AND max_index_interval = 2048 
    AND memtable_flush_period_in_ms = 0 
    AND min_index_interval = 128 
    AND read_repair_chance = 0.0 
    AND speculative_retry = '99.0PERCENTILE'; 
CREATE INDEX idx_tt ON test_topology1.tt (b); 

私は次のクエリを実行すると、それは私にエラーを与えます。

cqlsh:test_topology1> Select * from tt where b>='2016-04-29 18:00:00' ALLOW FILTERING; 
InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on the restricted columns support the provided operators: 'b >= <value>'" 

このBlogはフィルタリングがセカンダリインデックスを照会するために使用することができ許すと言いながら。 CassandraはWindowsマシンにインストールされています。

+1

あなたのものではないこの[スレッド](http://stackoverflow.com/questions/357188​​51/how-to-perform-query-with-cassandras-timestamp-column-as-where-condition)の2つの回答セカンダリインデックスで範囲クエリを実行できないことを説明します。また、参照している投稿では、セカンダリインデックスのクエリの> =制限はインデックスなしのカラムに対してのみ可能で、フィルタリングを許可する場合にのみ可能です。 – Ralf

+0

@Ralf答えの1つは、フィルタリングを許可すると範囲クエリが可能になるということです。また、私が質問したcassandraのブログとこれはそうです投稿http://stackoverflow.com/questions/34540883/cassandra-range-search-on-secondary-index-with-allow-filtering同じことを提案 –

答えて

3

範囲クエリは2.2.x.含めへとまでカサンドラで許可されていない認めていませんしかし、フィルタリングがallwedされている場合、ポストA deep look at the CQL WHERE clause点とアウト、それらは、非インデックス付きの列で許可されています。セカンダリインデックスの

直接クエリは=のみサポート、CONTAINSまたは はKEY制約が含まれています。

[..]セカンダリインデックスのクエリを使用すると、=、>、> =、< =と<を使用して、返された結果 を制限することができ

、フィルタリングを使用して非インデックス列にKEY制約 が含まれており、CONTAINS 。テーブル構造とインデックス与えそう

CREATE TABLE test_secondary_index (
    a text PRIMARY KEY, 
    b timestamp, 
    c timestamp 
); 
CREATE INDEX idx_inequality_test ON test_secondary_index (b); 

不等式テストはインデックス・カラム上で行われるため、次のクエリは失敗します。

SELECT * FROM test_secondary_index WHERE b >= '2016-04-29 18:00:00' ALLOW FILTERING ; 
InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on the restricted columns support the provided operators: 'b >= <value>'" 

しかし、不平等ので、次の作品テストは非索引列で行われます。

SELECT * FROM test_secondary_index WHERE b = '2016-04-29 18:00:00' AND c >= '2016-04-29 18:00:00' ALLOW FILTERING ; 

a | b | c 
---+---+--- 

(0 rows) 

これは、c列に別のインデックスを追加しても、それでもなおALLOW FILTERINGという用語が必要な場合に機能します。これは、このシナリオでは列cのインデックスが使用されていないことを意味します。

0

これはあなたの望む結果を得るでしょう。 bをクラスタリング列として使用します。

表test_topology1.tt CREATE( テキストを、 Bタイムスタンプ、 PRIMARY KEY(B) )

18:00 2016年4月29日ここで、b> = 'TT SELECT * FROM: 00 'はフィルタリングを許可します。

+0

私はそれを知っています意志。私が探しているのは、なぜ範囲のクエリが、ブログがそうだと言うと、許可フィルタリングのセカンダリインデックスで動作していないのですか? –

2

範囲クエリを使用してセカンダリインデックスと作品は二次索引列をフィルタリング

cqlsh:spark_demo> create table tt (
       ...  a text PRIMARY KEY, 
       ...  b timestamp 
       ...); 
cqlsh:spark_demo> CREATE INDEX ON tt(b); 
cqlsh:spark_demo> SELECT * FROM tt WHERE b >= '2016-03-01 12:00:00+0000'; 
InvalidRequest: code=2200 [Invalid query] message="No supported secondary index found for the non primary key columns restrictions" 
cqlsh:spark_demo> SELECT * FROM tt WHERE b >= '2016-03-01 12:00:00+0000' ALLOW FILTERING; 

a | b 
---+--- 

(0 rows) 
cqlsh:spark_demo> 
+0

あなたはcassandraのバージョン、cqlのバージョンとOSを確認してください。 Windowsで動作しないので、Casandra 2.1.10 –

+0

Cassandra 3.3、OS = Mac OS X 10.11.1 El Capitan – doanduyhai

+0

これは2.1で動作しないため、3.0以上をチェックする必要があります。 –