使用CQL 3.0在集合上创建自定义索引

grk*_*vlt 2 java cassandra cql3 datastax-java-driver

我一直在查看CQL 3.0 数据建模文档,该文档描述了带有标签的列系列歌曲,如下所示:

CREATE TABLE songs (
    id uuid PRIMARY KEY,
    title text,
    tags set<text>
);
Run Code Online (Sandbox Code Playgroud)

我想获得所有具有特定标签的歌曲的列表,因此我需要添加适当的索引.

我可以title很容易地在列上创建索引,但是如果我尝试索引tags作为集合的列,如下所示:

CREATE INDEX ON songs ( tags );
Run Code Online (Sandbox Code Playgroud)

我从DataStax Java驱动程序1.0.4收到以下错误:

Exception in thread "main" com.datastax.driver.core.exceptions.InvalidQueryException: Indexes on collections are no yet supported
at com.datastax.driver.core.exceptions.InvalidQueryException.copy(InvalidQueryException.java:35)
at com.datastax.driver.core.ResultSetFuture.extractCauseFromExecutionException(ResultSetFuture.java:269)
Run Code Online (Sandbox Code Playgroud)

根据JIRA问题CASSANDRA-4511,看起来这可以在更高版本的Cassandra(2.1)中修复.我目前正在使用Apache Cassandra 1.2.11,但不想升级.根据发行CASSANDRA-5615虽然在卡桑德拉1.2.6存在支持自定义索引的集合.

问题是,唯一可用的文档说明:

Cassandra支持创建自定义索引,该索引供内部使用且超出本文档的范围.

但是,它确实暗示的语法如下:

CREATE CUSTOM INDEX ON songs ( tags ) USING 'class_name';
Run Code Online (Sandbox Code Playgroud)

什么是class_name我们在本CQL语句中指定?

有没有更好的方法来索引标签,以便我可以在歌曲表中查询具有特定标签的歌曲列表?

And*_*age 5

在我看来,你尝试这样做的方式不是在Cassandra中建模的最好方法.您可以根据查询而不是数据构建模型.如果您需要根据标签查找歌曲,则为此创建另一个表并复制数据.就像是 ...

CREATE TABLE tagged_songs (
  tag varchar,
  song_id uuid,
  song_title varchar,
  ... anything else you might need with your songs here ...
  PRIMARY KEY ((tag), song_id)
);
Run Code Online (Sandbox Code Playgroud)

Cassandra的前提是存储便宜.复制数据以满足您的查询.写入速度很快,写入相同的数据3,4,10次通常很好.

您还希望将您的歌曲标题和您需要的任何其他信息存储到此表中.您不想抓取大量ID并在阅读时尝试加入.这不是关系数据库.

当有人标记歌曲时,您可能希望将标记插入到集合中,并将其添加到tagged_songs表中.查询标签X的所有歌曲基本上是O(1).

  • "这不是关系数据库"的+1 (3认同)