cassandra中二级索引的范围查询

时间:2016-03-01 10:08:17

标签: cassandra cassandra-2.0 cql3

我正在使用cassandra 2.1.10。 所以首先我要清楚我知道二级索引在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机器上。

3 个答案:

答案 0 :(得分:3)

Cassandra中不允许对二级索引列进行范围查询,包括2.2.x.但是,正如帖子 A deep look at the CQL WHERE clause 指出的那样,如果过滤是全新的,则允许在非索引列上使用它们:

  

对二级索引的直接查询仅支持=,CONTAINS或   包含关键限制。

     

[..]

     

辅助索引查询允许您限制返回的结果   使用=,&gt;,&gt; =,&lt; =和&lt;,CONTAINS和CONTAINS KEY限制   在使用过滤的非索引列上。

所以,给定表结构和索引

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上的索引。

答案 1 :(得分:2)

范围查询 DOES 使用允许过滤

处理二级索引
<?php 
     $category_id = get_cat_ID($strReports || $strInsights);
     $custom_query = new WP_Query( 'cat=' .$category_id. '&featured=no&posts_per_page=6&order=desc' );
     while($custom_query->have_posts()) : $custom_query->the_post();
?> 

HTML Content Here

<?php endwhile; ?>
<?php wp_reset_query(); // reset the query ?>

答案 2 :(得分:0)

这将为您提供所需的结果。使用b作为聚类列。

CREATE TABLE test_topology1.tt(     一个文字,     b时间戳,     主键(a,b) )

从tt中选择*其中b&gt; =&#39; 2016-04-29 18:00:00&#39;允许过滤;