2016-03-01 15 views
5

Tôi đang sử dụng cassandra 2.1.10. Vì vậy, đầu tiên tôi sẽ xóa mà tôi biết chỉ số thứ đang chống pattern trong cassandra.But cho mục đích thử nghiệm tôi đã cố gắng sau:Truy vấn phạm vi trên chỉ số phụ trong 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); 

Khi tôi chạy sau truy vấn nó mang lại cho tôi lỗi.

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

trong khi điều này Blog cho biết rằng cho phép lọc có thể được sử dụng để truy vấn chỉ mục phụ. Cassandra được cài đặt trên máy tính Windows.

+1

Hai câu trả lời trong [thread] này (http://stackoverflow.com/questions/35718851/how-to-perform-query-with-cassandras-timestamp-column-as-where-condition) không phải của bạn giải thích rằng các truy vấn phạm vi không thể thực hiện trên các chỉ mục phụ.Bài đăng bạn đang tham chiếu cũng giải thích rằng> = hạn chế trong truy vấn chỉ mục phụ chỉ có thể cho các cột không được lập chỉ mục và chỉ khi bạn cho phép lọc. – Ralf

+0

@Ralf một trong những câu trả lời cũng cho phép lọc sẽ cho phép truy vấn phạm vi. Ngoài ra blog của cassandra tôi đã đề cập trong câu hỏi và điều này để đăng bài http://stackoverflow.com/questions/34540883/cassandra-range-search-on-secondary-index-with-allow-filtering đề xuất cùng một –

Trả lời

3

Phạm vi truy vấn trên các cột chỉ số thứ không được phép vào Cassandra lên đến và bao gồm 2.2.x. Tuy nhiên, như các bài A deep look at the CQL WHERE clause chỉ ra, họ được phép trên các cột không được lập chỉ mục, nếu lọc được allwed:

truy vấn trực tiếp về chỉ số thứ cấp chỉ hỗ trợ =, CHỨA hoặc CHỨA hạn chế KEY.

[..]

truy vấn chỉ số Secondary cho phép bạn hạn chế các kết quả trả sử dụng =,>,> =, = < và <, CHỨA và CHỨA hạn chế KEY trên các cột không được lập chỉ mục sử dụng lọc .

Vì vậy, với cấu trúc bảng và chỉ số

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

truy vấn sau thất bại vì các thử nghiệm bất bình đẳng được thực hiện trên các cột được lập chỉ mục:

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

Nhưng các công việc sau vì sự bất bình đẳng kiểm tra được thực hiện trên cột không được lập chỉ mục:

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) 

Điều này vẫn hoạt động nếu bạn thêm một chỉ mục khác trên cột c, nhưng cũng vẫn yêu cầu cụm từ ALLOW FILTERING, điều đó có nghĩa là chỉ mục trên cột c không được sử dụng trong trường hợp này.

0

Điều này sẽ giúp bạn đạt được kết quả mong muốn. Sử dụng b làm cột phân cụm.

CREATE TABLE test_topology1.tt ( một văn bản, b timestamp, PRIMARY KEY (a, b) )

select * from tt nơi b> = '2016/04/29 18:00: 00 'cho phép lọc;

+0

Tôi biết điều đó sẽ. những gì tôi đang tìm là lý do tại sao các truy vấn phạm vi không làm việc trên chỉ số phụ với cho phép lọc khi blog nói như vậy –

2

Truy vấn nhiều DOES làm việc với chỉ số thứ sử dụng PHÉP LỌC

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

bạn có thể vui lòng xác nhận phiên bản cassandra, phiên bản cql và hệ điều hành. Bởi vì nó không hoạt động trên các cửa sổ cassandra 2.1.10 –

+0

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

+0

Tôi sẽ phải kiểm tra 3.0 hoặc cao hơn vì nó không hoạt động trong 2.1. –

Các vấn đề liên quan