如何使用 QueryBuilder 搜索 cassandra collection map

How to search a cassandra collection map using QueryBuilder

在我的 cassandra 中 table 我有一个 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 上设置 where 条件?

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

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

接下来,要从具有索引键的映射中 SELECT,您将需要 CONTAINS KEY 关键字。但目前,查询构建器 API 中没有此功能的定义。不过有open ticket支持一下: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 文档。众所周知,二级索引表现不佳。我无法想象集合的二级索引会有什么不同。