我想执行双范围查询,以获得靠近一点的纬度和经度点
现在,在Cassandra,我似乎可以尝试create column family users
with comparator=UTF8Type
AND key_validation_class=UTF8Type
and column_metadata=[{column_name: full_name, validation_class: UTF8Type},
{column_name: type, validation_class: UTF8Type, index_type: KEYS},
{column_name: lat, validation_class: LongType, index_type: KEYS},
{column_name: lon, validation_class: LongType, index_type: KEYS}];
SET users['a']['type']='test';
SET users['b']['type']='test';
SET users['c']['type']='test';
SET users['a']['lat']='12';
SET users['b']['lat']='9';
SET users['c']['lat']='12';
SET users['b']['lon']='1';
SET users['a']['lon']='4';
SET users['c']['lon']='2';
get users where type = 'test' and lon < '6' and lon > '3' and lat > '10' and lat < '13';
RowKey:a =&GT; (column = lat,value = 12,timestamp = 1336339056413000) =&GT; (column = lon,value = 4,timestamp = 1336339088170000) =&GT; (column = type,value = test,timestamp = 1336339033765000)
返回1行。
但是我在添加数千个点时非常担心性能,如果这3个列被编入索引。
1)我不得不使用索引的'type'列,因为没有它,查询失败
No indexed columns present in index clause with operator EQ
是否有可能绕过它?
2)通过lat或lon自然地对所有数据进行排序,然后只查询另一个数据,这可能很有趣,
所以只需在x和y之间执行SliceQuery,然后查询
get users where type = 'test' and lon < '6' and lon > '3';
要通过行名称而不是通过另一个字段(例如:String lat + lon和UTF8比较器)来订购CF,如何做到这一点?
感谢
答案 0 :(得分:1)
您的解决方案可能适用于较小的数据集。一旦它增长,您需要一些空间索引来执行快速查找。 Cassandra现在不支持空间索引。我建议你看看 GeoCell / GeoHash
您为每个Point坐标创建哈希,然后您可以对字符串执行范围查询。在这种情况下,Cassandra Range Queries将是一个不错的选择。
GeoHash 是一种分层空间数据结构,它将空间细分为网格形状的桶。
<强>链接:强>
答案 1 :(得分:0)