2016-03-01 27 views
5

Używam kassandra 2.1.10. więc najpierw będę się jasne, że wiem, że indeks wtórny są anty-wzorzec w cassandra.But do testowania cel starałem następujące:Zapytanie o zakres indeksu wtórnego w kassandra

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); 

Kiedy uruchomić następujące kwerendy daje mi błąd.

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

podczas tego Blog mówi, że umożliwiają filtrowanie może być użyty do uzyskania indeksu wtórnego. Cassandra jest instalowana na maszynie Windows.

+1

Dwie odpowiedzi w tym [wątku] (http://stackoverflow.com/questions/35718851/how-to-perform-quate-w-cassandras-timestamp-column-as-where-countition), które nie są twoje wyjaśnij, że zapytania o zakres nie są możliwe w przypadku indeksów dodatkowych.Wpis, do którego się odwołuje, wyjaśnia również, że> = ograniczenia w zapytaniach o dodatkowe indeksy są możliwe tylko w przypadku nieindeksowanych kolumn i tylko wtedy, gdy zezwolisz na filtrowanie. – Ralf

+0

@ Jedna z odpowiedzi mówi również, że zezwolenie na filtrowanie pozwoli na zapytania dotyczące zakresu. Również blog Kasandra, o którym wspominałem w pytaniu, a więc post http://stackoverflow.com/questions/34540883/cassandra-range-search-on-secondary-index- with-allow-filtering sugeruje to samo –

Odpowiedz

3

klasy zapytań na wtórnych kolumny indeksu nie są dozwolone w Cassandry włącznie 2.2.x. Jednak, jak stanowisko A deep look at the CQL WHERE clause wskazuje, są one akceptowane na kolumny nie indeksowane, czy filtrowanie allwed:

bezpośrednie pytania na indeksy średnich obsługują tylko =, zawiera lub zawiera kluczowe ograniczenia.

[..]

wtórne zapytań indeksy pozwalają ograniczyć zwracane wyniki używając =,>,> =, = i < <, zawiera i zawiera kluczowe ograniczenia na nieindeksowane kolumn stosując filtrowanie .

Więc, biorąc pod uwagę strukturę tabeli i indeksu

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

poniższa kwerenda nie powiedzie się, ponieważ testy nierówności odbywa się na kolumny indeksowanej:

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

Ale następujące prace, ponieważ nierówności test jest przeprowadzany na nieindeksowanej kolumnie:

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) 

To nadal działa, jeśli dodasz inny indeks do kolumny c, ale nadal wymaga to terminu ALLOW FILTERING, co oznacza, że ​​indeks w kolumnie c nie jest używany w tym scenariuszu.

0

Zapewni to pożądane wyniki. Użyj b jako kolumny do grupowania.

Tworzenie tabeli test_topology1.tt ( tekst, b datownika klucz podstawowy (A, B) )

wybrać z tt * gdzie b> = '29.04.2016 18:00: 00 'pozwala na filtrowanie;

+0

Znam to będzie. czego szukam, to dlaczego zapytanie o zakres nie działa na indeks wtórny z możliwością filtrowania, gdy blog mówi tak –

2

Zapytanie zakres CZY praca z indeksu wtórnym wykorzystaniem pozwalać na filtrowanie

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

czy możesz potwierdzić wersję Kasandra, wersję cql i system operacyjny. Ponieważ nie działa na windows cassandra 2.1.10 –

+0

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

+0

Będę musiał sprawdzić na 3.0 lub wyższy, ponieważ nie działa w 2.1. –