2016-03-01 10 views
5

Ich benutze Cassandra 2.1.10. So Zuerst werde mir klar, dass ich Sekundärindex ist anti-Muster in cassandra.But zum Testen Zweck weiß ich folgende versuche:Bereich Abfrage auf sekundären Index in 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); 

Wenn ich laufe Abfrage folgende es gibt mir Fehler.

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>'" 

während dieser Blog sagt, dass die Filterung verwendet werden, erlauben kann Sekundärindex abzufragen. Cassandra ist auf Windows-Maschine installiert.

+1

Die zwei Antworten in diesem [thread] (http://stackoverflow.com/questions/35718851/how-to-perform-query-with-cassandras-timestamp-column-as-where-condition), die nicht deins sind Erklären Sie, dass Bereichsabfragen auf sekundären Indizes nicht möglich sind.Der Post, auf den Sie verweisen, erklärt auch, dass> = Einschränkungen in sekundären Indexabfragen nur für nicht indizierte Spalten und nur dann möglich sind, wenn Sie die Filterung zulassen. – Ralf

+0

@Ralf eine der Antwort sagt auch, erlauben Filterung wird Bereich Abfragen ermöglichen. Auch der Blog von Cassandra habe ich in der Frage erwähnt und dies so http://stackoverflow.com/questions/34540883/cassandra-range-search-on-secondary-index-with-allow-filtering suggeriere das gleiche –

Antwort

3

Bereichsabfragen auf Sekundärindexspalten in Cassandra nicht erlaubt bis einschließlich 2.2.x. Da jedoch der Beitrag A deep look at the CQL WHERE clause weist darauf hin, werden sie auf nicht-indizierten Spalten erlaubt, wenn Filterung allwed ist:

Direkte Anfragen auf Sekundärindizes unterstützen nur =, ENTHÄLT oder ENTHÄLT KEY Einschränkungen.

[..]

Sekundärindex Abfragen können Sie die zurückgegebenen Ergebnisse mit den =,>,> =, < = und < und ENTHÄLT auf nicht indizierte Spalten KEY Einschränkungen ENTHÄLT beschränken Filterung .

So, angesichts der Tabellenstruktur und Index

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

die folgende Abfrage schlägt fehl, da die Ungleichheit Test auf der indizierten Spalte durchgeführt wird:

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>'" 

Aber die folgenden Werke, weil die Ungleichheit Der Test wird an einer nicht indizierten Spalte durchgeführt:

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) 

Dies funktioniert immer noch, wenn Sie einen weiteren Index für die Spalte c hinzufügen, aber auch den Namen ALLOW FILTERING erfordert, was für mich bedeutet, dass der Index für Spalte c in diesem Szenario nicht verwendet wird.

0

Dadurch erhalten Sie Ihre gewünschten Ergebnisse. Verwenden Sie b als Clusterspalte.

TABLE test_topology1.tt CREATE ( ein Text, b Zeitstempel- PRIMARY KEY (a, b) )

select * from tt wobei b> = '2016.04.29 18.00: 00 'Filterung erlauben;

+0

Ich weiß es werden. Was ich suche, ist, warum die Bereichsabfrage nicht auf Sekundärindex mit Filterung funktioniert, wenn Blog so sagt –

2

Die Bereichsabfrage DOES Arbeit mit Sekundärindex erlaubt die Verwendung FILTERING

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

können Sie bitte Cassandra Version, Cql Version und OS bestätigen. Weil es nicht funktioniert unter Windows Cassandra 2.1.10 –

+0

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

+0

Ich muss für 3.0 oder höher überprüfen, weil dies in 2.1 nicht funktioniert. –

Verwandte Themen