web-dev-qa-db-ja.com

Cassandra SQL:LIKE条件と同じクエリがありますか?

LIKE条件により、SQLステートメントのwhere句でワイルドカードを使用できます。これにより、パターンマッチングを実行できます。 LIKE条件は、有効なSQLステートメント(選択、挿入、更新、または削除)で使用できます。このような

SELECT * FROM users
WHERE user_name like 'babu%';

上記と同じ操作と同様に、CLIでCassandraに対してクエリを使用できます。

24
BobDroid

簡単な答え:[〜#〜] like [〜#〜]に相当するものはありません

https://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlSelect.html

V0.8のコマンドリファレンスは次のとおりです。

http://www.datastax.com/docs/0.8/references/cql#cql-reference

ユーザー名への参照を保持する行の別のセットを維持する場合:

行:ユーザー名:bab-> col:babu1、col:babar行:ユーザー名:babu-> col:babur

事実上、RDBMSの世界で通常検索するすべての結果を事前に入力することにより、不正行為を行っています。ストレージは数年前と比較して安価です...これが今、これが受け入れられたアプローチである理由です。事前に入力された情報のリストを取得するためのCPUとメモリの負荷は軽減されます。

13
sdolgy

Cassandra 3.4(3.5を推奨))であるため、LIKEクエリはSSTable Attached Secondary Index(SASI)を使用して実現できます。

例えば:

CREATE TABLE cycling.cyclist_name ( 
  id UUID PRIMARY KEY, 
  lastname text, 
  firstname text
);

次のようにSASIを作成します。

CREATE CUSTOM INDEX  fn_prefix ON cyclist_name (firstname)
USING 'org.Apache.cassandra.index.sasi.SASIIndex';

次に、プレフィックスLIKEクエリが機能します。

SELECT * FROM cyclist_name WHERE firstname LIKE 'M%';
SELECT * FROM cyclist_name WHERE firstname LIKE 'Mic%';

これらの例と、サフィックスクエリなどのその他の構成オプションは、 documentation にあります。

SASIがどのように機能するかについての詳細な説明は こちら にあります。

26
nstrelow

私は知っています:それは古い質問ですが、このトピックの解決策があります:

cassandraではlike演算子を使用できませんが、範囲演算子を使用できます。範囲演算子を使用すると、この「like 'whatever%'」を解決できます

例:複数の製品があります。各製品には独自のパーティションキー(プライマリキーの最初の部分)があります。

CREATE TABLE user(productId int, username text, PRIMARY KEY(productId, username));

今、私はいくつかのユーザーがいます:

INSERT INTO user(productId, username) VALUES (1, 'anna');
INSERT INTO user(productId, username) VALUES (1, 'alpha');
INSERT INTO user(productId, username) VALUES (1, 'andreas');
INSERT INTO user(productId, username) VALUES (1, 'alex');
INSERT INTO user(productId, username) VALUES (1, 'bernd');
INSERT INTO user(productId, username) VALUES (1, 'bob');

今、私は最初にaを持つすべてのユーザーを見つけたいです。 SQLの世界では、CassandraでLIKE 'a%'を使用します。これを使用します。

SELECT * FROM user WHERE productId = 1 AND username >= 'a' AND username < 'b';

結果:

productid | username
-----------+----------
     1 |     alex
     1 |    alpha
     1 |  andreas
     1 |     anna
14
Citrullin

実行するソリューションを探しているときにこの投稿に出会いましたWHERE column_name LIKE '%keyword%' Cassandraで。答えは有望でしたが、私の問題を完全に解決していませんでした。

CREATE CUSTOM INDEX idx_name ON keyspace.columnfamily (column_name) 
USING 'org.Apache.cassandra.index.sasi.SASIIndex' 
WITH OPTIONS = {
'mode': 'CONTAINS', 
'analyzer_class': 'org.Apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 
'case_sensitive': 'false'};

作るために %keyword%(two%s)は機能します。インデックスにはmode:CONTAINSを伴うオプションが必要ですanalyzer_classを作成してcase_sensitive有効。

8
Kamyar