Cassandraでの全文検索。
私はCassandraにかなり慣れていないので、もっと正しく理解したいと思っています。 Cassandraで全文検索を実行しようとしていますが、調査の結果、mayこれに対する「単純な」アプローチではないことがわかりました。グーグルは何も言っていない。
ですから、代わりに、ここでの最善のアプローチを理解しようとしています。この種のことで、カサンドラについてこれまでに学んだこと、つまりこれら2つの原則に基づいて、自分自身の仮定を立てることになりました。 a)データではなくクエリに基づいてテーブルを設計し、b)more-dataは、適切に使用されている限り、良いことです。
そうは言っても、私は共有したいいくつかの解決策を考え出しました。また、誰かがより良いアイデアを持っている場合は、不合理/素朴なことをする前にそれを記入してください。
最初の解決策:2つの主キーと次のようなインデックスを使用して列ファミリー(CF)を作成します。
CREATE TABLE "FullTextSearch" (
"PartialText" text,
"TargetIdentifier" uuid,
"CompleteText" text,
"Type" int,
PRIMARY KEY ("PartialText","TargetIdentifier")
);
CREATE INDEX IX_FullTextSearch_Type "keyspace"."FullTextSearch" ("Type");
上記の表では、次のように「HelloWorld」というテキストの行を挿入する必要があります。
BATCH APPLY;
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("H",000000000-0000-0000-0000-000000000,"Hello World",1);
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("He",000000000-0000-0000-0000-000000000,"Hello World",1);
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("Hel",000000000-0000-0000-0000-000000000,"Hello World",1);
.....
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("Hello Wor",000000000-0000-0000-0000-000000000,"Hello World",1);
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("Hello Worl",000000000-0000-0000-0000-000000000,"Hello World",1);
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("Hello World",000000000-0000-0000-0000-000000000,"Hello World",1);
.....
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("Wor",000000000-0000-0000-0000-000000000,"Hello World",1);
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("Worl",000000000-0000-0000-0000-000000000,"Hello World",1);
INSERT INTO "FullTextSearch" ("PartialText","TargetIdentifier","CompleteText","Type") VALUES ("World",000000000-0000-0000-0000-000000000,"Hello World",1);
END BATCH;
基本的に、上記は次のワイルドカード/部分テキスト "%o W%"、 "Hello%"、 "Worl%"を満たします。しかし、「こんにちは」の「%ell%」などの部分的な単語は満足できません。これは私が感じることができます大丈夫今のところ.....(OCDソータはここで始まります)
「TargetIdentifier」で保存/名前の変更が発生するたびに削除/再挿入する必要があるため、このアプローチは私にとってはやっかいなものです。
2番目の解決策は、今回だけワイドカラムを使用して非常に似ています。テーブルは次のようになります。
CREATE TABLE "FullTextSearch" (
"TargetIdentifier" uuid,
"Type" int,
"CompleteText" text,
PRIMARY KEY("TargetIdentifier")
);
そして今、検索中に次のようなものがあります。
SELECT * FROM "FullTextSearch" WHERE "He" = 1;
そのため、列が存在する場合は、それぞれの行が返されます。
3番目の解決策:上記と同様ですが、今回はワイド列を使用する代わりに、部分テキストにマップなどのセット列を使用して、次のようなクエリを実行します。
SELECT * FROM "FullTextSearch" WHERE "PartialTexts"['He'] = 1;
とにかく、私はすべてアイデアがなく、遅れており、素晴らしい反応を期待することしかできません!ここで何をすべきか教えてください...私も正しい道を進んでいますか?
AFAIK Datastax Enterprise Searchは、Solandraの(商用)後継です。
Cassandra 2.0は、いわゆる「カスタムセカンダリインデックス」をサポートしています。カスタムセカンダリインデックスはJavaコードです。独自の実装では抽象クラスorg.Apache.cassandra.db.index.SecondaryIndex
を実装する必要があります( http://www.datastax.com/documentation/cql/を参照) 3.1/cql/cql_reference/create_index_r.html )
ElasticsearchまたはSolrの実装が存在するかどうかはわかりません。
ステミング、複数/エキゾチックな言語のサポート、さらには地理空間のものなど、奇妙な全文検索ロジックをすべてコーディングすることはお勧めしません。
しかし、SecondaryIndex
は、お気に入りの検索エンジンの統合を開始するのに良いポイントです。
データセットが比較的小さい場合は、luceneのインメモリインスタンスを使用し、設定された間隔でインデックスを更新するだけで、準備が整います。
チェックアウト [〜#〜] solandra [〜#〜] (旧Lucandra)
しかし、Solandraはもう積極的に開発されていないと思います。著者は、Datastaxに移動し、そこで作業を続けました。
だからあなたはまた見ることができます Datastax Enterprise Search
いくつかの制限もあります。 DistributedSearch を見てください。
cassandraについての非常に基本的なことは、レコードのフィルタリングにwhere句を使用する場合、その列が主キーであるか、インデックスを割り当てる必要がある場合です。したがって、私が見ることができるのは、 「TargetIdentifier」フィールドに主キーを指定し、「Type」にインデックスを付け、where句で「CompleteText」を使用しているため、これが機能しない可能性があります。
「CompleteTex」にセカンダリインデックスを割り当て、目的の出力が得られているかどうかを確認します。
他にいくつかのオプションがあります: Stratio Luceneプラグイン 。これは、ネイティブセカンダリインデックスを実装するためにLuceneを使用します。
また、 SSTable Attached Secondary Index(SASI) をフリーテキスト検索に使用できます。
これらの戦略は両方ともローカルに分散されたインデックスを使用するため、検索はクラスター全体にブロードキャストされるため、クエリのパフォーマンスはあまり高くないことに注意してください。 SASIの場合、クエリの一部としてパーティションキーを使用できる場合は、これを回避できます。
elassandra を使用します。これはelasticsearch
のプラグインとしてcassandra
に付属しています。例は ここ から見つけることができます