如何使用QueryBuilder搜索cassandra集合映射

时间:2015-05-04 08:58:48

标签: cassandra query-builder cql3 datastax-java-driver

在我的cassandra表中,我有一个Map的集合,我也已经为地图键编制了索引。

CREATE TABLE IF NOT EXISTS test.collection_test(
  name text,
  year text,
  attributeMap map<text,text>,
  PRIMARY KEY ((name, year))
);




CREATE INDEX ON collection_test (attributeMap);

QueryBuilder语法如下:

select().all().from("test", "collection_test")
                .where(eq("name", name)).and(eq("year", year));

我应该如何将条件置于attributeMap

1 个答案:

答案 0 :(得分:2)

首先,您需要在地图中的键上创建索引。默认情况下,在地图上创建的索引会索引地图的值,而不是键。索引键的索引有特殊语法:

CREATE INDEX attributeKeyIndex ON collection_test (KEYS(attributeMap));

接下来,对于带有索引键的地图中的SELECT,您需要CONTAINS KEY关键字。但目前,查询构建器API中没有此功能的定义。但是,有一张支持它的门票:JAVA-677

目前,要使用Java驱动程序完成此任务,您需要构建自己的查询或使用预准备语句:

    PreparedStatement statement = _session.prepare("SELECT * " +
            "FROM test.collection_test " +
            "WHERE attributeMap CONTAINS KEY ?");
    BoundStatement boundStatement = statement.bind(yourKeyValue);
    ResultSet results = _session.execute(boundStatement);

最后,您应该阅读When To Use An Index上的DataStax文档。已知二级索引表现不佳。我无法想象集合上的二级索引会有所不同。