スポンサーリンク

このドキュメントの内容は、以下の通りです。

Cassandra 1.1.0 の Cassandra のセカンダリインデックス (Secondary index) を試してみました。

セカンダリインデックスとは


Cassandra の セカンダリインデックスは、column (カラム) の値に対して、インデックスを作成します。
column の値で検索することができます。
つまり、WHERE 句を使って、検索できる、ということです。

[default@k1] get c1 where  class = 'x';

セカンダリインデックスの作成


keyspace k1 を作成し、 column family c1 を作成します。
column_metadata でセカンダリインデックスの指定をします。column (カラム名) class に対して、 index を作成します。
create keyspace k1;
use k1;
create column family c1 with comparator=UTF8Type and default_validation_class=UTF8Type and key_validation_class=UTF8Type and column_metadata = [ { column_name: class, validation_class: UTF8Type, index_type: KEYS} ];

すでに column family がある場合には、 update で設定を変更します。

update column family c1 with column_metadata = [ { column_name: class, validation_class: UTF8Type, index_type: KEYS} ];


column_metadata を column_metadate と typo して、以下のエラーが出てしまった。
java.lang.IllegalArgumentException: No enum const class org.apache.cassandra.cli.CliClient$ColumnFamilyArgument.COLUMN_METADATE

正しくは、これ。
カラム class に対して、 index を張る。
update column family c1 with column_metadata = [ { column_name: class, validation_class: UTF8Type, index_type: KEYS} ];

データを入れる


テスト用のデータを入れます。

set c1['1']['id'] = 'a';
set c1['2']['id'] = 'b';
set c1['3']['id'] = 'c';
set c1['1']['year'] = '2012';
set c1['2']['year'] = '2013';
set c1['3']['year'] = '2014';
set c1['1']['class'] = 'z';
set c1['2']['class'] = 'z';
set c1['3']['class'] = 'x';

実際に、cassandra-cli を利用して、データを入れるとこんな感じ。

% cassandra-cli -h localhost -k k1

[default@k1] set c1['1']['id'] = 'a';
Value inserted.
Elapsed time: 397 msec(s).
[default@k1] set c1['2']['id'] = 'b';
Value inserted.
Elapsed time: 10 msec(s).
[default@k1] set c1['3']['id'] = 'c';
Value inserted.
Elapsed time: 5 msec(s).
[default@k1] set c1['1']['year'] = '2012';
Value inserted.
Elapsed time: 13 msec(s).
[default@k1] set c1['2']['year'] = '2013';
Value inserted.
Elapsed time: 11 msec(s).
[default@k1] set c1['3']['year'] = '2014';
Value inserted.
Elapsed time: 6 msec(s).
[default@k1] set c1['1']['class'] = 'z';
Value inserted.
Elapsed time: 10 msec(s).
[default@k1] set c1['2']['class'] = 'z';
Value inserted.
Elapsed time: 6 msec(s).
[default@k1] set c1['3']['class'] = 'x';
Value inserted.
Elapsed time: 6 msec(s).


セカンダリインデックスを利用して、値を得る


get に WHERE 句を指定して、値を取り出してみます。


[default@k1] get c1 where  class = 'x';
-------------------
RowKey: 3
=> (column=class, value=x, timestamp=1342284829642000)
=> (column=id, value=c, timestamp=1342284723520000)
=> (column=year, value=2014, timestamp=1342284756153000)

1 Row Returned.
Elapsed time: 97 msec(s).
[default@k1] get c1 where  class = 'z';
-------------------
RowKey: 2
=> (column=class, value=z, timestamp=1342284824564000)
=> (column=id, value=b, timestamp=1342284718687000)
=> (column=year, value=2013, timestamp=1342284751760000)
-------------------
RowKey: 1
=> (column=class, value=z, timestamp=1342284819708000)
=> (column=id, value=a, timestamp=1342284712849000)
=> (column=year, value=2012, timestamp=1342284744128000)

2 Rows Returned.
Elapsed time: 38 msec(s).


セカンダリインデックスが作成されていない場合


セカンダリインデックスを用意してない場合には、
以下のエラーが出ます。

[default@k1] get c1 where  id = 'foo';
No indexed columns present in index clause with operator EQ

細かい検索条件


これまでの例では、WHERE 句に class しか指定しませんでした。
column class, year に index を作成してみます。

update column family c1 with column_metadata = 
[ { column_name: class, validation_class: UTF8Type, index_type: KEYS},
{ column_name: year, validation_class: UTF8Type, index_type: KEYS} ];

class だけで検索すると2件だけ、出てきます。

[default@k1] get c1 where  class='z';
-------------------
RowKey: 2
=> (column=class, value=z, timestamp=1342284824564000)
=> (column=id, value=b, timestamp=1342284718687000)
=> (column=year, value=2013, timestamp=1342284751760000)
-------------------
RowKey: 1
=> (column=class, value=z, timestamp=1342284819708000)
=> (column=id, value=a, timestamp=1342284712849000)
=> (column=year, value=2012, timestamp=1342284744128000)

2 Rows Returned.
Elapsed time: 39 msec(s).

year でさらに絞込みをしてみます。

[default@k1] get c1 where  class='z' and year > 2013;

0 Row Returned.
Elapsed time: 26 msec(s).
[default@k1] get c1 where  class='z' and year > 2012;
-------------------
RowKey: 2
=> (column=class, value=z, timestamp=1342284824564000)
=> (column=id, value=b, timestamp=1342284718687000)
=> (column=year, value=2013, timestamp=1342284751760000)

1 Row Returned.
Elapsed time: 22 msec(s).


以上のように、セカンダリインデックスを利用すると、値で検索することができます。



スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

はてなの人気のブックマーク

スポンサーリンク
 

過去ログ

2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー