<type>このドキュメントでは、CassandraのElasticSearchベースのセカンダリインデックスである「Esindex」の使用と構成について説明しています。
このプラグインには、既に構成されているElasticSearch(ES)クラスターが必要です。
プラグインは、http://cassandra.apache.org/からダウンロードされた通常のCassandra 4.0.xリリースにインストールされます。インデックスをサポートするためにCassandra構成ファイルに変更するものはありません。 Cassandraの動作は、インデックスを使用していないアプリケーションについては変わらないままです。
Cassandraテーブルで作成されたら、このインデックスを使用すると、CQLを使用してCassandraで「フルテキスト検索」Elasticsearchクエリを実行し、Cassandraデータから一致する行を返すことができます。このプラグインの使用は、Cassandraソースコードの変更を必要としません。

テストされたバージョンは、ElasticSearch 5.x、6.x、7.x、Cassandra 4.0.xです。ただし、アプリケーションが対応するマッピングとオプションを提供する場合、プラグインは異なるElasticSearchバージョン(1.7、2.x 5.x、6.x、7.x)でも動作する場合があります。 1.x 2.x、3.x、または4.1のようなApache Cassandraの他のバージョンは、プラグインで使用されるセカンダリインデックスインターフェイスが異なるため、サポートされていません。他のCassandraベンダーはテストされておらず、Scylladbはサポートされていません。
| バージョン | ElasticSearch 1.x | ElasticSearch 2.x | ElasticSearch 5.x | ElasticSearch 6.x | ElasticSearch 7.x |
|---|---|---|---|---|---|
| Cassandra 1.x | いいえ | いいえ | いいえ | いいえ | いいえ |
| Cassandra 2.x | いいえ | いいえ | いいえ | いいえ | いいえ |
| Cassandra 3.x | いいえ | いいえ | いいえ | いいえ | いいえ |
| Cassandra 4.x | 限定 | 限定 | 限定 | はい | はい |
このプロジェクトでは、MavenとJava 8でコンパイルを要求します。プロジェクトのルートでプラグインを構築するには、次のことです。
MVNクリーンパッケージ
これによりtarget/distribution/lib4cassandraに「すべての瓶」が構築されます
<dependency>
<groupId>com.genesyslab</groupId>
<artifactId>es-index</artifactId>
<version>9.2.000.00</version>
</dependency>
Githubパッケージを参照してください
Mavenリポジトリを参照してください
es-index-9.2.000.xx-jar-with-dependencies.jar cassandraのlibフォルダーと他のcassandra jar、たとえば、すべてのcassandra nodeの「/usr/share/cassandra/lib」など。 Cassandraノードを起動または再起動します。
テストが不足しているため、クラスタリングキーを備えたテーブルはサポートされていません。パーティションキーのみがサポートされ、複合パーティションキーは動作するはずですが、広範囲にテストされていません。
esindexは、すべてのセルが同時に期限切れになる行レベルTTLのみをサポートし、対応するESドキュメントを同時に削除できます。行に異なる時間に有効期限が切れるセルがある場合、最後のセルの有効期限が切れると対応するドキュメントが削除されます。異なるセルTTLを使用している場合、検索から返されたデータは、SSTABLESからデータが読み取られるにつれて依然として一貫していますが、ESクエリを使用して期限切れのデータを使用して行を見つけることができます。
同じテーブルにいくつかのインデックスを作成することは可能です。Esindexはそれを防ぎません。ただし、複数のeSindexが存在する場合、動作は一貫性がない場合がありますが、そのような構成はサポートされていません。 CQLSHコマンド「表現表」を使用して、テーブルに作成されたインデックスを表示し、必要に応じてドロップすることができます。
簡単にするために、最初にこのキースペースを作成します。
CREATE KEYSPACE genesys WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}
以下のテーブルを例として使用しましょう。
CREATE TABLE genesys.emails (
id UUID PRIMARY KEY,
subject text,
body text,
userid int,
query text
);
インデックス使用量のためにダミーテキスト列を専用する必要があります。この列はデータを受け取ってはいけません。この例では、 query列はダミー列です。
サンプルテーブルのインデックスを作成し、ElasticSearchにeShostを使用する方法は次のとおりです。
CREATE CUSTOM INDEX ON genesys.emails(query)
USING 'com.genesyslab.webme.commons.index.EsSecondaryIndex'
WITH OPTIONS = {'unicast-hosts': 'eshost:9200'};
たとえば、ElasticSearchサーバーがlocalhostで聴いている場合は、 EshostをLocalHostに置き換えます。
CQLによって返されるエラーは非常に限られています。何か問題が発生した場合、ElasticSearchホストが利用できないように、タイムアウトや別の種類の例外が得られます。何がうまくいかなかったかを理解するために、Cassandraログを確認する必要があります。
マッピングは提供していなかったので、ElasticSearchの動的マッピングに依存しています。データを挿入しましょう。
INSERT INTO genesys.emails (id, subject, body, userid)
VALUES (904b88b2-9c61-4539-952e-c179a3805b22, 'Hello world', 'Cassandra is great, but it''s even better with EsIndex and Elasticsearch', 42);
ログへのアクセスがある場合、そのインデックスがElasticSearchで作成されていることがわかります。
[o.e.c.m.MetaDataCreateIndexService] [node-1] [genesys_emails_index@] creating index, cause [api], templates [], shards [5]/[1], mappings []
[INFO ][o.e.c.m.MetaDataMappingService] [node-1] [genesys_emails_index@/waSGrPvkQvyQoUEiwqKN3w] create_mapping [emails]
これで、インデックスを介してElasticSearchを使用してCassandraを検索できます。ここにLucene構文検索があります。
select id, subject, body, userid, query from emails where query='body:cassan*';
id | subject | body | userid | query
--------------------------------------+-------------+-------------------------------------------------------------------------+--------+-------
904b88b2-9c61-4539-952e-c179a3805b22 | Hello world | Cassandra is great, but it's even better with EsIndex and Elasticsearch | 42 |
{
"_index": "genesys_emails_index@",
"_type": "emails",
"_id": "904b88b2-9c61-4539-952e-c179a3805b22",
"_score": 0.24257512,
"_source": {
"id": "904b88b2-9c61-4539-952e-c179a3805b22"
},
"took": 4,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.24257512
}
}
(1 rows)
(JSONがフォーマットされました)
すべての行には、CQLの一貫性を使用してSSTABLESからロードされたCassandraのデータが含まれます。 「クエリ」列のデータは、ElasticSearchによって返されるメタデータです。
生成されたマッピングを確認するためにElasticSearchをクエリする方法は次のとおりです。http GET http://eshost:9200/genesys_emails_index@/emails/_mapping?pretty
{
"genesys_emails_index@" : {
"mappings" : {
"emails" : {
"properties" : {
"IndexationDate" : {
"type" : " date "
},
"_cassandraTtl" : {
"type" : " long "
},
"body" : {
"type" : " text " ,
"fields" : {
"keyword" : {
"type" : " keyword " ,
"ignore_above" : 256
}
}
},
"id" : {
"type" : " text " ,
"fields" : {
"keyword" : {
"type" : " keyword " ,
"ignore_above" : 256
}
}
},
"subject" : {
"type" : " text " ,
"fields" : {
"keyword" : {
"type" : " keyword " ,
"ignore_above" : 256
}
}
},
"userid" : {
"type" : " text " ,
"fields" : {
"keyword" : {
"type" : " keyword " ,
"ignore_above" : 256
}
}
}
}
}
}
}
}Esindexプラグインは2つのフィールドを追加しました:
マッピングはうまく見えますが、Elasticsearchはuseridがすべてのテキストに整数と追加されたフィールド[キーワード]であることに気付かなかったことがわかります。
Elasticsearchのデータがどのように見えるかは次のとおりです。
GET http://localhost:9200/genesys_emails_index@/emails/_search?pretty&q=body:cassandra
{
"took" : 2 ,
"timed_out" : false ,
"_shards" : {
"total" : 5 ,
"successful" : 5 ,
"skipped" : 0 ,
"failed" : 0
},
"hits" : {
"total" : 1 ,
"max_score" : 0.2876821 ,
"hits" : [
{
"_index" : " genesys_emails_index@ " ,
"_type" : " emails " ,
"_id" : " 904b88b2-9c61-4539-952e-c179a3805b22 " ,
"_score" : 0.2876821 ,
"_source" : {
"id" : " 904b88b2-9c61-4539-952e-c179a3805b22 " ,
"body" : " Cassandra is great, but it's even better with EsIndex and Elasticsearch " ,
"subject" : " Hello world " ,
"userid" : " 42 " ,
"IndexationDate" : " 2019-01-15T16:53:00.107Z " ,
"_cassandraTtl" : 2147483647
}
}
]
}
}インデックスをドロップしてマッピングを修正しましょうdrop index genesys.emails_query_idx;これにより、ElasticSearchインデックスとデータも削除されます!
適切なマッピングで再作成します。
CREATE CUSTOM INDEX ON genesys.emails(query)
USING 'com.genesyslab.webme.commons.index.EsSecondaryIndex'
WITH OPTIONS = {
'unicast-hosts': 'localhost:9200',
'mapping-emails': '
{
"emails":{
"date_detection":false,
"numeric_detection":false,
"properties":{
"id":{
"type":"keyword"
},
"userid":{
"type":"long"
},
"subject":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"body":{
"type":"text"
},
"IndexationDate":{
"type":"date",
"format":"yyyy-MM-dd''T''HH:mm:ss.SSS''Z''"
},
"_cassandraTtl":{
"type":"long"
}
}
}
}
'};
これにより、新しいインデックスが作成され、マッピングが提供され、Cassandraにあるデータを再インデックスします。
結果のESマッピングは次のとおりです。
{
"genesys_emails_index@" : {
"mappings" : {
"emails" : {
"date_detection" : false ,
"numeric_detection" : false ,
"properties" : {
"IndexationDate" : {
"type" : " date " ,
"format" : " yyyy-MM-dd'T'HH:mm:ss.SSS'Z' "
},
"_cassandraTtl" : {
"type" : " long "
},
"body" : {
"type" : " text "
},
"id" : {
"type" : " keyword "
},
"subject" : {
"type" : " text " ,
"fields" : {
"keyword" : {
"type" : " keyword " ,
"ignore_above" : 256
}
}
},
"userid" : {
"type" : " long "
}
}
}
}
}
}マッピングが適切に定義されたので、 userIDを数字として検索できます。この例では、ElasticSearchクエリDSLを使用しています。
select id, subject, body, userid from genesys.emails
where query='{"query":{"range":{"userid":{"gte":10,"lte":50}}}}';
@ Row 1
---------+-------------------------------------------------------------------------
id | 904b88b2-9c61-4539-952e-c179a3805b22
subject | Hello world
body | Cassandra is great, but it's even better with EsIndex and Elasticsearch
userid | 42
生産を開始する直前にマッピングを取得することが非常に重要です。大きなテーブルのインデックスには多くの時間がかかり、CassandraとElasticsearchにかなりの負荷がかかります。 ESマッピングのエラーについてCassandraログを確認する必要があります。 Create Indexコマンドに提供されるJSONオプションでそれらを2倍にすることにより、単一の引用( ')を逃がしてください。
以下は、ElasticSearchインデックスの構成に関連するすべてのオプションです。キー名はハイフン ' - 'チャー、またはドットを使用できます。たとえば、両方の名前が機能します。
以下のすべてのオプションは、ElasticSearch自体ではなく、Genesysの実装に固有のものであることに注意してください。
Jestクラスが見つからない場合、ダミーモードが有効になり、他のケースが適用されません。
マルチダタセンターがサポートされ、データはカサンドラのゴシップレプリケーションのみを介して再現されます。異なるDCのESクラスターは同じではなく、一緒に結合することは決してないか、パフォーマンスが影響を受けます。データはテーブルレベルで複製されるため、Esindexは各DCで更新を取得し、ローカルESクラスターも更新されます。

Multi-DCをサポートするために、すべてのオプションをデータセンターとラック名でプレフィックスして、設定を場所に固有のものにすることができます。たとえば
ElasticSearchのCassandraインデックスを資格情報を提供するには、各ノードでは、開始前に環境変数のエスクレイジェントを正しく設定する必要があります。これは、すべてのCassandraホストで設定する必要があります。
以下の例では、ユーザーの「弾性」とパスワード「ExamplePassWord」のパスワードが次のように区別されます。(コロン)文字。環境変数としてシステムで直接行うか、Cassandraを起動するショートカットのいずれかを実行できます。
Escredentials = Elastic:ExamplePassWordインデックスが正常に初期化されると、情報レベルのCassandraログで「ElasticSearch資格情報」と記述されます。このメッセージが出力されると、環境変数をクリアすることができます。 Cassandraが再起動された場合、開始前に環境変数を再度設定する必要があります。資格情報はメモリのみに保持され、他のどこにも保存されません。ユーザーおよび/またはパスワードが変更された場合、すべてのCassandraノードを更新された環境変数値で再起動する必要があります。
インデックスオプション設定で
Unicast-hosts = https : //<host name>:9200
現在、既存のインデックスをHTTPからHTTPSに移行することは不可能であるため、Cassandraスキーマを作成する前に、1つまたは別の使用の使用法を決定する必要があります。 HTTPSの展開を容易にするために、インデックスはすべてのHTTPS証明書を自動的に信頼します。
定義されたCassandra TTLよりも長期間、Elasticsearchの側にデータを保持することができます。このモードは、ES-Analytic-Modeオプションを使用して回転します。オプションが有効になっている場合、ElasticIndexはすべての削除操作をスキップします。
ES側でデータが大きく成長しないようにするために、TTL-ShiftおよびForce-Deleteの設定を使用することをお勧めします。
インデックスを作成するときは、インデックスオプションを提供するだけでなく、「オプションを使用する」CQLコマンドを使用してElasticSearchインデックスオプションを提供します。
インデックスオプションはインデックス作成時に指定する必要があります。ここに例があります
CREATE CUSTOM INDEX on genesys.email(query) using 'com.genesyslab.webme.commons.index.EsSecondaryIndex' WITH options =
{
'read-consistency-level':'QUORUM',
'insert-only':'false',
'index-properties': '{
"index.analysis.analyzer.dashless.tokenizer":"dash-ex",
"index.analysis.tokenizer.dash-ex.pattern":"[^\\w\\-]",
"index.analysis.tokenizer.dash-ex.type":"pattern"
}',
'mapping-email': '{
"email": {
"dynamic": "false",
"properties": {
"subject" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}',
'discard-nulls':'false',
'async-search':'true',
'async-write':'false'
};
また、「genesys-es」を使用してオプションをプレフィックスすることにより、環境変数またはJavaシステムプロパティを使用してオプションを設定またはオーバーライドすることもできます。
「CREATEカスタムインデックス」コマンドで提供されるオプションが最初に使用されます。 "。"、 "./conf/"、 "../conf/"または "./bin/"で見つかったes-index.propertiesという名前のファイルを使用して、ローカルにオーバーライドできます。 (-dgenesysys-es-esi-fileまたは-dgenesys.es.esi.fileシステムプロパティで変更できます)
ファイルのコンテンツの例は次のとおりです。
insert-only = true docdard-nulls = false async-write = false
| 名前 | デフォルト | 説明 |
|---|---|---|
| 最大派遣 | 10000 | ES検索から読み取り、カサンドラの行を読み込む結果の数。 |
| 読み取りと対応レベル | 1つ | 検索に使用されるこの一貫性レベルは、Cassandra行をロードするために使用されます。 |
| 挿入のみ | 間違い | デフォルトでは、EsindexはUPSERT操作を使用します。挿入のみモードのみが上書きされます。 |
| async-write | 真実 | 正しい実行をチェックせずに、インデックスの更新を非同期に送信します。これにより、はるかに高速な書き込みが提供されますが、WRITEが失敗しないため、ESクラスターが利用できない場合、データは一貫していない場合があります。デフォルトはtrueです。 |
| セグメント | オフ | オフ、時間、日、月、年、カスタム自動インデックスセグメンテーションは、この設定によって制御されます。日に設定すると、毎日エイリアスの下に新しいインデックスが作成されます。空のインデックスは1時間ごとに自動的に削除されることに注意してください。注:多くのインデックスが作成され、パフォーマンスが低下する可能性があるため、時間設定は落胆します。この設定は、開発とテストの目的でお勧めします。 |
| セグメント名 | セグメント=カスタムの場合、この値は新しいインデックス作成に使用されます。 | |
| マッピング - <タイプ> | {} | 各セカンダリインデックスについて、テーブル名はタイプとして渡されます。たとえば、Mapping-Visit = {JSON定義}。 |
| ユニキャストホスト | http:// localhost:9200 | ホストのコンマ分離リストは、HOST1、HOST2、HOST3またはhttp:// host1、http:// host2、http:// host3またはhttp:// host1:9200、http:// host2:9200、http:// host3:9200です。プロトコルまたはポートにHTTPが欠落している場合、9200が想定されています。 HTTPSを使用することが可能です。 |
| 廃棄物 | 真実 | null値をESインデックスに渡さないでください。つまり、値を削除できないことを意味します。デフォルトはtrueです。 |
| インデックスプロパティ | {} | JSON文字列としてのプロパティは、新しいインデックスを作成するために渡され、たとえばトークネイザーの定義を含む場合があります。 |
| JSON-SERIALIZED-FIELDS | {} | 文字列列をJSON文字列としてインデックス化する必要があることを定義するcom睡の分離された文字列。 JSONではない文字列は、カサンドラのインサートを防ぎます。 |
| json-flat-Serialized-fields | {} | 文字列列をタイプセーフJSONドキュメントとしてインデックス化する必要があることを定義するcom睡の分離された文字列。 ElasticSearch JSONマッピングでは、時間の経過とともにタイプが変更される値をインデックス化することはできません。たとえば、{"key": "value"} {"key":{"subkey": "value"}} elasticsearchでは、マッピングの例外を取得できます。このようなjson-flatは、文字列キーと弦の配列を値として持つJSONオブジェクトに変換されます。 |
| ダミー | 間違い | セカンダリインデックスを完全に無効にします。 Jestクラスが見つからない場合、インデックスは自動的にダミーモードに配置されることに注意してください。 |
| Validate-queries | 間違い | Cassandraのタイムアウトの代わりに意味のある構文エラーを提供するために、検証の検索クエリをESに送信します。 |
| 同時ロック | 真実 | パーティションIDでインデックス実行をロックします。これにより、同じパーティションで複数の更新を同時に処理する場合、同時性の問題が防止されます。 |
| スキップログレプレイ | 真実 | Cassandraノードが起動すると、コミットログが再生されます。これらの更新は、すでにESに適用されているため、スタートアップ時間を改善するためにスキップされます。 |
| Skip-Non-Local-Updates | 真実 | この設定を有効にするパフォーマンスを向上させるには、トークン範囲のマスターレプリカのインデックス更新のみを実行します。 |
| ES-Analytic-Mode | 間違い | ESドキュメントの削除(TTLまたは削除)を無効にします。 |
| タイプパイプライン | なし | タイプからセットアップパイプラインのリスト。 |
| pipeline- <type> | なし | このタイプのパイプライン定義。 |
| index.translog.durability | async | インデックスを作成するとき、ASYNCコミットモードを使用して最高のパフォーマンスを確保するために、ES 1.7のデフォルト設定でした。 2.x以降、同期しているため、パフォーマンスが深刻になります。 |
| 利用可能なときに利用可能 | 真実 | 新しいインデックスを作成するときは、部分インデックスで検索を実行することができます(またはそうではありません)。 |
| トランケート - リビルド | 間違い | 再構築前にESインデックスを切り捨てます。 |
| パージ期間 | 60 | 60分ごとに、すべての空のインデックスがエイリアスから削除されます。 |
| インデックスタイプごと | 真実 | テーブル名でインデックス名を前払いします。 ES 5.xでは、同じタイプの同じインデックスで同じフィールド名の別のマッピングを持つことはもう不可能です。 ES 6.Xでは、タイプが削除されます。 |
| フォースデレート | 間違い | 毎分「クエリごとの削除」要求がESに送信され、有効期限が切れたドキュメントを削除します。これは、ES 5.xで削除されたTTL機能をエミュレートするためです。 Cassandra Compactionは実際にESからドキュメントを削除しますが、いつ発生するかについて保証はありません。 |
| ttl-shift | 0 | Cassandra TTLをシフトするための数秒の時間。 CassandraでTTLが1時間で、Shiftが3600の場合、ESのドキュメントがCassandraより1時間後に削除されることを意味します。 |
| インデックスマネージャー | com.genesyslab.webme.commons.index.defaultindexmanager | インデックスマネージャーのクラス名。セグメンテーションと有効期限の機能をマネージャーするために使用されます。 |
| セグメントサイズ | 86400000 | ミリ秒単位のセグメント時間枠。すべての「セグメントサイズ」ミリ秒新しいインデックスは、次のテンプレートによって作成されます:<Alias_name> _index@<yyymmdd't'hhmmss'z '> |
| 最大接続 - ルートあたり | 2 | ESノードごとのHTTP接続の数、デフォルトはApache HTTPプール値です。Cassandraインデックスのパフォーマンスを向上させる可能性がありますが、ESの負荷が増加します。 (WCC 9.0.000.15の新規) |
マッピング定義の日付検出をオフにする必要があります。
次のJSON:
{
"maps" : {
"key1" : " value " ,
"key2" : 42 ,
"keymap" : {
"sss1" : null ,
"sss2" : 42 ,
"sss0" : " ffff "
},
"plap" : " plop "
},
"string" : " string " ,
"int" : 42 ,
"plplpl" : [ 1 , 2 , 3 , 4 ]
}に変換されます:
{
"maps" : [ " key1=value " , " key2=42 " , " keymap={sss1=null, sss2=42, sss0=ffff} " , " plap=plop " ],
"string" : [ " string " ],
"int" : [ " 42 " ],
"plplpl" : [ " 1 " , " 2 " , " 3 " , " 4 " ]
}考えられる値:
<type>タイプマッピングの詳細については、elasticsearchドキュメントを参照してください:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping.html
すべてのCassandra列タイプがサポートされており、データはCassandraタイプに応じて文字列、配列、またはマップとして送信されます。適切なマッピングを使用すると、ElasticSearchはデータを関連するタイプに変換します。これにより、はるかに優れた検索とレポートが可能になります。
| カサンドラタイプ | ElasticSearch推奨マッピング | コメント |
|---|---|---|
| ascii | テキストまたはキーワード | テキストタイプの次のセクションを参照してください |
| bigint | 長さ | |
| ブロブ | 無効 | バイナリコンテンツをインデックス化することはできません |
| ブール | ブール | |
| カウンタ | 長さ | |
| 日付 | 日付 | |
| 小数 | ダブル | |
| ダブル | ダブル | |
| フロート | ダブル | |
| inet | キーワード | ES IPはテストされていません |
| int | int | |
| リスト<タイプ> | タイプと同じ | ESは、タイプが単一の値または配列のいずれかになることを期待しています |
| map < typek 、 typev > | 物体 | キーがさまざまな値を持つことができる場合は、爆発のマッピングに注意してください |
| <Type>を設定します | タイプと同じ | ESは、タイプが単一の値または配列のいずれかになることを期待しています |
| Smallint | int | |
| 文章 | テキストまたはキーワード | テキストタイプの次のセクションを参照してください |
| 時間 | キーワード | |
| タイムスタンプ | 「タイプ」:「日付」、「フォーマット」: "yyyy-mm-dd't'hh:mm:ss.ss'z '" | |
| Timeuuid | キーワード | |
| tinyint | int | |
| Tuple <Type1 Type2、...> | タイプ | |
| uuid | キーワード | |
| varchar | テキストまたはキーワード | テキストタイプの次のセクションを参照してください |
| varint | 長さ | |
| ユーザー定義型 | 物体 | 各UDTフィールドは、名前と値を使用してマッピングされます |
テキストタイプのマッピング
テキスト(ASCIIまたはVARCHAR)列がESに送信されると、索引付けされる生のテキストとして送信されます。ただし、テキストが適切なJSONである場合、ESインデックスのJSONドキュメントとして送信することができます。これにより、生のテキストの代わりにドキュメントにインデックスを作成/検索できます。
このようなJSONマッピングを使用すると、「columnname.key:value」を使用してデータを検索できます。
キーがさまざまな値を持つことができる場合は、爆発のマッピングに注意してください
Json-Serialized-fields (詳細についてはオプションを参照)
テキストの内容はJSONとして送信されます。マッピングでは、各ドキュメントフィールドを個別に定義できます。静的マッピングまたは動的マッピングのいずれかにより、フィールドがタイプとしてマッピングされると、互換性のないタイプを提供すると、Cassandraの書き込み障害が発生することに注意してください。
json-flat-Serialized-fields (詳細と変換の例についてはオプションを参照)
テキストの内容もJSONとして送信されますが、すべての値はフラット文字列の配列に強制されます。これにより、ネストされたJSONへの検索機能が制限されますが、JSONタイプの値を制御できない場合は安全です。
Cassandraインデックスのカスタム実装です。これにより、Cassandraの一貫性モデルに関連するいくつかの制限が導入されます。主な制限は、Cassandraのセカンダリインデックスの性質によるものです。各Cassandraノードには、Cassandra Ring内で責任を負うデータのみが含まれています。セカンダリインデックスは同じものです。各ノードはローカルデータのみをインデックスします。つまり、インデックスでクエリを実行すると、クエリがすべてのノードに送信され、結果がクエリコーディネーターによって集約され、クライアントに返されることを意味します。
Esindexでは、インデックス検索はElasticsearchに基づいているため、各ノードはクエリに応答できます。つまり、クエリは単一のノードにのみ送信する必要があるか、結果に重複が含まれていることを意味します。これは、トークンを以下のようにCQLクエリに強制することによって達成されます。
select * from emails where query='subject:12345' and token(id)=0;
トークンは、ノード全体にクエリを広めるためのランダムな長い値である必要があります。上記の例では、行のパーティションキー、「ID」の上に構築する必要があります。
上記の例では、ElasticSearchクエリは「件名:12345」です。これはルーセンのようなクエリです。詳細については、DSLクエリを実行することも可能です。ElasticSearchQuery-DSLページを参照してください。
単一のElasticSearchインデックスには、特定のキースペースのすべてのCassandraテーブルインデックスが含まれます。各インデックスには、専用のElasticSearchタイプが使用されます。クロステーブル集約を許可するために、タイプはクエリに施行されません。つまり、クエリが異なるタイプに一致する場合、予想よりも多くのIDを返すことを意味します。これらはCassandraの行に一致しないため、結果は増えませんが、返された結果の数を制限すると、より少なくなる可能性もあります。
一致した行数が高く、行が大きい場合、検索は読み取りタイムアウトで終了する場合があります。 ESメタデータでPKのみを返すように要求し、CQLクエリを使用してコードから並行して行をロードできます。
インデックスにPKSのみを返すように指示するには、以下のクエリヒント#options:load-rows = false#を使用する必要があります。
select * from emails where query='#options:load-rows=false#id:ab*';
返された行は偽物であり、Elasicsearchクエリの結果から構築されていることに注意することが重要です。それは、返された行がもう存在しないかもしれないことを意味します:
検索リクエストが結果を返し、最初の行には## column in the indexのjson文字列としてelasticsearchメタデータが含まれます。たとえば、参照してください:
cqlsh:ucs> select id,query from emails where query='id:00008RD9PrJMMmpr';
id | query
------------------+---------------------------------------------------------------------------------------------------------------------
00008RD9PrJMMmpr | {"took":5,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":1,"max_score":7.89821}}
Esindexセグメンテーションメカニズムは、時間ベースのインデックスのシーケンスにモノリシックエラスティクスサーチインデックスを分割します。そのための目的は次のとおりです。
ElasticSearch 5.x TTLはもはやサポートされていないためです。ただし、Cassandraの通常の圧縮および修復プロセスは、Tombstoneデータを自動的に削除すると、ElasticIndexはElasticSearchからデータを削除します。
esindexはCQLトレースをサポートします。ノードで有効にするか、以下のコマンドでCQLSHを使用できます。
追跡;
選択するトレースを使用すると、参加しているすべてのノードに対するクエリ全体からトレースが得られます。
cqlsh:ucs> select * from "Contact" where "ESQuery"='AttributeValues.LastName:ab*' and token("Id")=0 limit 1;
Id | AttributeValues | AttributeValuesDate | Attributes| CreatedDate | ESQuery | ExpirationDate | MergeIds | ModifiedDate| PrimaryAttributes| Segment| TenantId
1001uiP2niJPJGBa | {"LastName":["IdentifyTest-aBEcKPnckHVP"],"EmailAddress":["IdentifyTest-HHzmNornOr"]} |{} | {'EmailAddress_IdentifyTest-HHzmNornOr': {Id: 'EmailAddress_IdentifyTest-HHzmNornOr', Name: 'EmailAddress', StrValue: 'IentifyTest-HHzmNornOr', Description: null, MimeType: null, IsPrimary: False}, 'LastName_IdentifyTest-aBEcKPnckHVP': {Id: 'LastName_IdentifyTest-aBEcKPnckHVP', Name: 'LastName', StrValue: 'IdentifyTest-aBEcKPnckHVP', Description: null, MimeType: null IsPrimary: False}} | 2018-10-30 02:05:06.960000+0000 | {"_index":"ucsperf2_contact_index@","_type":"Contact","_id":"1001uiP2niJPJGBa","_score":1.0,"_source":{"Id":"1001uiP2niJPJGBa"},"took":485,"timed_out":false,"_shards":{"total":5,"successful":5,failed":0},"hits":{"total":18188,"max_score":1.0}} | null | null | 2018-10-30 02:05:06.960000+0000 | {'EmailAddress': 'IdentifyTest-HHzmNornOr', 'LastName': 'IdentifyTest-aBEcKPnckHVP'} | not-applicable |1
(1 rows)
次に、セッションからトレース情報を取得します。
追跡セッション:8ED07B60-180D-11E9-B832-33A777983333
activity | timestamp | source | source_elapsed | client
-----------------------------------------------------------------------------------------------------------------------------------------+----------------------------+---------------+----------------+--------------
Execute CQL3 query | 2019-01-14 16:03:32.118000 | xxx.xx.47.82 | 0 | xxx.xx.40.11
RANGE_SLICE message received from /xxx.xx.47.82 [MessagingService-Incoming-/xxx.xx.47.82] | 2019-01-14 16:02:30.200000 | xxx.xx.47.49 | 34 | xxx.xx.40.11
Executing read on ucsperf2.Contact using index Contact_ESQuery_idx [ReadStage-1] | 2019-01-14 16:02:30.201000 | xxx.xx.47.49 | 411 | xxx.xx.40.11
ESI 00ebf964-b958-4e74-ab89-e0093a8ec188 Searching 'AttributeValues.LastName:ab*' [ReadStage-1] | 2019-01-14 16:02:30.201000 | xxx.xx.47.49 | 693 | xxx.xx.40.11
ESI 00ebf964-b958-4e74-ab89-e0093a8ec188 Found 10000 matching ES docs in 514ms [ReadStage-1] | 2019-01-14 16:02:30.716000 | xxx.xx.47.49 | 515336 | xxx.xx.40.11
ESI 00ebf964-b958-4e74-ab89-e0093a8ec188 StreamingPartitionIterator initialized [ReadStage-1] | 2019-01-14 16:02:30.717000 | xxx.xx.47.49 | 516911 | xxx.xx.40.11
reading data from /xxx.xx.47.100 [ReadStage-1] | 2019-01-14 16:02:30.717000 | xxx.xx.47.49 | 517121 | xxx.xx.40.11
speculating read retry on /xxx.xx.47.82 [ReadStage-1] | 2019-01-14 16:02:30.718000 | xxx.xx.47.49 | 517435 | xxx.xx.40.11
Executing single-partition query on Contact [ReadStage-2] | 2019-01-14 16:02:30.718000 | xxx.xx.47.49 | 517436 | xxx.xx.40.11
Sending READ message to /xxx.xx.47.100 [MessagingService-Outgoing-/xxx.xx.47.100-Small] | 2019-01-14 16:02:30.718000 | xxx.xx.47.49 | 517445 | xxx.xx.40.11
Sending READ message to /xxx.xx.47.82 [MessagingService-Outgoing-/xxx.xx.47.82-Small] | 2019-01-14 16:02:30.718000 | xxx.xx.47.49 | 517558 | xxx.xx.40.11
Acquiring sstable references [ReadStage-2] | 2019-01-14 16:02:30.718000 | xxx.xx.47.49 | 517866 | xxx.xx.40.11
Bloom filter allows skipping sstable 83 [ReadStage-2] | 2019-01-14 16:02:30.718000 | xxx.xx.47.49 | 517965 | xxx.xx.40.11
Partition index with 0 entries found for sstable 400 [ReadStage-2] | 2019-01-14 16:02:30.719000 | xxx.xx.47.49 | 518300 | xxx.xx.40.11
REQUEST_RESPONSE message received from /xxx.xx.47.82 [MessagingService-Incoming-/xxx.xx.47.82] | 2019-01-14 16:02:30.720000 | xxx.xx.47.49 | 519720 | xxx.xx.40.11
Processing response from /xxx.xx.47.82 [RequestResponseStage-4] | 2019-01-14 16:02:30.720000 | xxx.xx.47.49 | 519865 | xxx.xx.40.11
Bloom filter allows skipping sstable 765 [ReadStage-2] | 2019-01-14 16:02:30.723000 | xxx.xx.47.49 | 522352 | xxx.xx.40.11
Bloom filter allows skipping sstable 790 [ReadStage-2] | 2019-01-14 16:02:30.723000 | xxx.xx.47.49 | 522451 | xxx.xx.40.11
Bloom filter allows skipping sstable 819 [ReadStage-2] | 2019-01-14 16:02:30.723000 | xxx.xx.47.49 | 522516 | xxx.xx.40.11
Bloom filter allows skipping sstable 848 [ReadStage-2] | 2019-01-14 16:02:30.723000 | xxx.xx.47.49 | 522662 | xxx.xx.40.11
Bloom filter allows skipping sstable 861 [ReadStage-2] | 2019-01-14 16:02:30.723000 | xxx.xx.47.49 | 522741 | xxx.xx.40.11
Skipped 0/7 non-slice-intersecting sstables, included 0 due to tombstones [ReadStage-2] | 2019-01-14 16:02:30.723000 | xxx.xx.47.49 | 522855 | xxx.xx.40.11
Merged data from memtables and 1 sstables [ReadStage-2] | 2019-01-14 16:02:30.723001 | xxx.xx.47.49 | 523075 | xxx.xx.40.11
Read 1 live and 0 tombstone cells [ReadStage-2] | 2019-01-14 16:02:30.723001 | xxx.xx.47.49 | 523164 | xxx.xx.40.11
Read 1 live and 0 tombstone cells [ReadStage-1] | 2019-01-14 16:02:30.725000 | xxx.xx.47.49 | 524717 | xxx.xx.40.11
ESI 00ebf964-b958-4e74-ab89-e0093a8ec188 StreamingPartitionIterator closed [ReadStage-1] | 2019-01-14 16:02:30.725000 | xxx.xx.47.49 | 524805 | xxx.xx.40.11
Enqueuing response to /xxx.xx.47.82 [ReadStage-1] | 2019-01-14 16:02:30.725000 | xxx.xx.47.49 | 524872 | xxx.xx.40.11
Sending REQUEST_RESPONSE message to /xxx.xx.47.82 [MessagingService-Outgoing-/xxx.xx.47.82-Small] | 2019-01-14 16:02:30.725000 | xxx.xx.47.49 | 524971 | xxx.xx.40.11
REQUEST_RESPONSE message received from /xxx.xx.47.100 [MessagingService-Incoming-/xxx.xx.47.100] | 2019-01-14 16:02:30.729000 | xxx.xx.47.49 | 528222 | xxx.xx.40.11
Processing response from /xxx.xx.47.100 [RequestResponseStage-1] | 2019-01-14 16:02:30.729000 | xxx.xx.47.49 | 528364 | xxx.xx.40.11
Initiating read-repair [RequestResponseStage-1] | 2019-01-14 16:02:30.729000 | xxx.xx.47.49 | 528481 | xxx.xx.40.11
Parsing select * from "Contact" where "ESQuery"='AttributeValues.LastName:ab*' and token("Id")=0 limit 1; [Native-Transport-Requests-1] | 2019-01-14 16:03:32.119000 | xxx.xx.47.82 | 174 | xxx.xx.40.11
Preparing statement [Native-Transport-Requests-1] | 2019-01-14 16:03:32.119000 | xxx.xx.47.82 | 254 | xxx.xx.40.11
Index mean cardinalities are Contact_ESQuery_idx:-2109988917941223823. Scanning with Contact_ESQuery_idx. [Native-Transport-Requests-1] | 2019-01-14 16:03:32.119000 | xxx.xx.47.82 | 418 | xxx.xx.40.11
Computing ranges to query [Native-Transport-Requests-1] | 2019-01-14 16:03:32.121000 | xxx.xx.47.82 | 2480 | xxx.xx.40.11
Submitting range requests on 1 ranges with a concurrency of 1 (-4.6099044E15 rows per range expected) [Native-Transport-Requests-1] | 2019-01-14 16:03:32.121000 | xxx.xx.47.82 | 2568 | xxx.xx.40.11
Enqueuing request to /xxx.xx.47.49 [Native-Transport-Requests-1] | 2019-01-14 16:03:32.121000 | xxx.xx.47.82 | 2652 | xxx.xx.40.11
Submitted 1 concurrent range requests [Native-Transport-Requests-1] | 2019-01-14 16:03:32.121000 | xxx.xx.47.82 | 2708 | xxx.xx.40.11
Sending RANGE_SLICE message to /xxx.xx.47.49 [MessagingService-Outgoing-/xxx.xx.47.49-Small] | 2019-01-14 16:03:32.121000 | xxx.xx.47.82 | 2874 | xxx.xx.40.11
READ message received from /xxx.xx.47.49 [MessagingService-Incoming-/xxx.xx.47.49] | 2019-01-14 16:03:32.640000 | xxx.xx.47.100 | 29 | xxx.xx.40.11
READ message received from /xxx.xx.47.49 [MessagingService-Incoming-/xxx.xx.47.49] | 2019-01-14 16:03:32.640000 | xxx.xx.47.82 | 521263 | xxx.xx.40.11
Executing single-partition query on Contact [ReadStage-2] | 2019-01-14 16:03:32.640000 | xxx.xx.47.82 | 521468 | xxx.xx.40.11
Acquiring sstable references [ReadStage-2] | 2019-01-14 16:03:32.640000 | xxx.xx.47.82 | 521566 | xxx.xx.40.11
Partition index with 0 entries found for sstable 1187 [ReadStage-2] | 2019-01-14 16:03:32.640000 | xxx.xx.47.82 | 521775 | xxx.xx.40.11
Executing single-partition query on Contact [ReadStage-1] | 2019-01-14 16:03:32.641000 | xxx.xx.47.100 | 266 | xxx.xx.40.11
Bloom filter allows skipping sstable 1188 [ReadStage-2] | 2019-01-14 16:03:32.641000 | xxx.xx.47.82 | 522130 | xxx.xx.40.11
Acquiring sstable references [ReadStage-1] | 2019-01-14 16:03:32.641000 | xxx.xx.47.100 | 361 | xxx.xx.40.11
Bloom filter allows skipping sstable 1189 [ReadStage-2] | 2019-01-14 16:03:32.641000 | xxx.xx.47.82 | 522205 | xxx.xx.40.11
Bloom filter allows skipping sstable 1190 [ReadStage-2] | 2019-01-14 16:03:32.641000 | xxx.xx.47.82 | 522259 | xxx.xx.40.11
Skipped 0/5 non-slice-intersecting sstables, included 0 due to tombstones [ReadStage-2] | 2019-01-14 16:03:32.641001 | xxx.xx.47.82 | 522303 | xxx.xx.40.11
Bloom filter allows skipping sstable 1186 [ReadStage-2] | 2019-01-14 16:03:32.641001 | xxx.xx.47.82 | 522415 | xxx.xx.40.11
Merged data from memtables and 1 sstables [ReadStage-2] | 2019-01-14 16:03:32.641001 | xxx.xx.47.82 | 522540 | xxx.xx.40.11
Read 1 live and 0 tombstone cells [ReadStage-2] | 2019-01-14 16:03:32.641001 | xxx.xx.47.82 | 522679 | xxx.xx.40.11
Enqueuing response to /xxx.xx.47.49 [ReadStage-2] | 2019-01-14 16:03:32.641001 | xxx.xx.47.82 | 522734 | xxx.xx.40.11
Sending REQUEST_RESPONSE message to /xxx.xx.47.49 [MessagingService-Outgoing-/xxx.xx.47.49-Small] | 2019-01-14 16:03:32.641001 | xxx.xx.47.82 | 522863 | xxx.xx.40.11
Partition index with 0 entries found for sstable 1208 [ReadStage-1] | 2019-01-14 16:03:32.644000 | xxx.xx.47.100 | 3756 | xxx.xx.40.11
REQUEST_RESPONSE message received from /xxx.xx.47.49 [MessagingService-Incoming-/xxx.xx.47.49] | 2019-01-14 16:03:32.647000 | xxx.xx.47.82 | 528443 | xxx.xx.40.11
Processing response from /xxx.xx.47.49 [RequestResponseStage-2] | 2019-01-14 16:03:32.647000 | xxx.xx.47.82 | 528516 | xxx.xx.40.11
Bloom filter allows skipping sstable 1209 [ReadStage-1] | 2019-01-14 16:03:32.649000 | xxx.xx.47.100 | 9090 | xxx.xx.40.11
Bloom filter allows skipping sstable 1210 [ReadStage-1] | 2019-01-14 16:03:32.649000 | xxx.xx.47.100 | 9162 | xxx.xx.40.11
Bloom filter allows skipping sstable 1211 [ReadStage-1] | 2019-01-14 16:03:32.649000 | xxx.xx.47.100 | 9187 | xxx.xx.40.11
Skipped 0/5 non-slice-intersecting sstables, included 0 due to tombstones [ReadStage-1] | 2019-01-14 16:03:32.650000 | xxx.xx.47.100 | 9237 | xxx.xx.40.11
Bloom filter allows skipping sstable 1207 [ReadStage-1] | 2019-01-14 16:03:32.650000 | xxx.xx.47.100 | 9335 | xxx.xx.40.11
Merged data from memtables and 1 sstables [ReadStage-1] | 2019-01-14 16:03:32.650000 | xxx.xx.47.100 | 9571 | xxx.xx.40.11
Read 1 live and 0 tombstone cells [ReadStage-1] | 2019-01-14 16:03:32.650000 | xxx.xx.47.100 | 9734 | xxx.xx.40.11
Enqueuing response to /xxx.xx.47.49 [ReadStage-1] | 2019-01-14 16:03:32.650000 | xxx.xx.47.100 | 9842 | xxx.xx.40.11
Sending REQUEST_RESPONSE message to /xxx.xx.47.49 [MessagingService-Outgoing-/xxx.xx.47.49-Small] | 2019-01-14 16:03:32.650000 | xxx.xx.47.100 | 10116 | xxx.xx.40.11
Request complete | 2019-01-14 16:03:32.646708 | xxx.xx.47.82 | 528708 | xxx.xx.40.11
ESIから始まるすべてのアクティビティは、esindexからのアクティビティです。
* ESI <id> Searching 'AttributeValues.LastName:ab*': The query have been received and decoded by the ESIndex, it is now sent to ElasticSearch
* ESI <id> Found 10000 matching ES docs in 514ms: The query to ElasticSearch has found 10000 results
* ESI <id> StreamingPartitionIterator initialized: Streaming partition iterator have been provided with all Ids found, and starts reading rows
* ESI <id> StreamingPartitionIterator closed: Client is done reading rows (limit was 1)
更新/挿入/削除のトレース
cqlsh:ucs> update "Contact" set "CreatedDate"='2017-04-01T11:21:59.001+0000' where "Id"='1001uiP2niJPJGBa';
追跡セッション:F76E4AC0-180E-19-B832-33A777983333
activity | timestamp | source | source_elapsed | client
----------------------------------------------------------------------------------------------------------------------------------------+----------------------------+---------------+----------------+--------------
Execute CQL3 query | 2019-01-14 16:13:37.132000 | xxx.xx.47.82 | 0 | xxx.xx.40.11
MUTATION message received from /xxx.xx.47.82 [MessagingService-Incoming-/xxx.xx.47.82] | 2019-01-14 16:12:35.210000 | xxx.xx.47.49 | 22 | xxx.xx.40.11
Appending to commitlog [MutationStage-1] | 2019-01-14 16:12:35.210000 | xxx.xx.47.49 | 354 | xxx.xx.40.11
Adding to Contact memtable [MutationStage-1] | 2019-01-14 16:12:35.210000 | xxx.xx.47.49 | 465 | xxx.xx.40.11
Enqueuing response to /xxx.xx.47.82 [MutationStage-1] | 2019-01-14 16:12:35.212000 | xxx.xx.47.49 | 2356 | xxx.xx.40.11
Sending REQUEST_RESPONSE message to /xxx.xx.47.82 [MessagingService-Outgoing-/xxx.xx.47.82-Small] | 2019-01-14 16:12:35.212000 | xxx.xx.47.49 | 2548 | xxx.xx.40.11
Parsing update "Contact" set "CreatedDate"='2017-04-01T11:21:59.001+0000' where "Id"='1001uiP2niJPJGBa'; [Native-Transport-Requests-1] | 2019-01-14 16:13:37.132000 | xxx.xx.47.82 | 146 | xxx.xx.40.11
Preparing statement [Native-Transport-Requests-1] | 2019-01-14 16:13:37.132000 | xxx.xx.47.82 | 213 | xxx.xx.40.11
Determining replicas for mutation [Native-Transport-Requests-1] | 2019-01-14 16:13:37.133000 | xxx.xx.47.82 | 1895 | xxx.xx.40.11
Appending to commitlog [MutationStage-2] | 2019-01-14 16:13:37.134000 | xxx.xx.47.82 | 2042 | xxx.xx.40.11
Adding to Contact memtable [MutationStage-2] | 2019-01-14 16:13:37.134000 | xxx.xx.47.82 | 2149 | xxx.xx.40.11
Sending MUTATION message to /xxx.xx.47.100 [MessagingService-Outgoing-/xxx.xx.47.100-Small] | 2019-01-14 16:13:37.134000 | xxx.xx.47.82 | 2186 | xxx.xx.40.11
Sending MUTATION message to /xxx.xx.47.49 [MessagingService-Outgoing-/xxx.xx.47.49-Small] | 2019-01-14 16:13:37.134000 | xxx.xx.47.82 | 2232 | xxx.xx.40.11
MUTATION message received from /xxx.xx.47.82 [MessagingService-Incoming-/xxx.xx.47.82] | 2019-01-14 16:13:37.136000 | xxx.xx.47.100 | 28 | xxx.xx.40.11
Appending to commitlog [MutationStage-1] | 2019-01-14 16:13:37.136000 | xxx.xx.47.100 | 390 | xxx.xx.40.11
Adding to Contact memtable [MutationStage-1] | 2019-01-14 16:13:37.136000 | xxx.xx.47.100 | 471 | xxx.xx.40.11
ESI decoding row 31303031756950326e694a504a474261 [MutationStage-1] | 2019-01-14 16:13:37.137000 | xxx.xx.47.100 | 579 | xxx.xx.40.11
REQUEST_RESPONSE message received from /xxx.xx.47.49 [MessagingService-Incoming-/xxx.xx.47.49] | 2019-01-14 16:13:37.137000 | xxx.xx.47.82 | 5160 | xxx.xx.40.11
ESI writing 31303031756950326e694a504a474261 to ES index [MutationStage-1] | 2019-01-14 16:13:37.137000 | xxx.xx.47.100 | 664 | xxx.xx.40.11
Processing response from /xxx.xx.47.49 [RequestResponseStage-4] | 2019-01-14 16:13:37.137000 | xxx.xx.47.82 | 5280 | xxx.xx.40.11
ESI index 31303031756950326e694a504a474261 done [MutationStage-1] | 2019-01-14 16:13:37.160000 | xxx.xx.47.100 | 23878 | xxx.xx.40.11
REQUEST_RESPONSE message received from /xxx.xx.47.100 [MessagingService-Incoming-/xxx.xx.47.100] | 2019-01-14 16:13:37.160000 | xxx.xx.47.82 | 28445 | xxx.xx.40.11
Processing response from /xxx.xx.47.100 [RequestResponseStage-2] | 2019-01-14 16:13:37.160000 | xxx.xx.47.82 | 28549 | xxx.xx.40.11
Enqueuing response to /xxx.xx.47.82 [MutationStage-1] | 2019-01-14 16:13:37.162000 | xxx.xx.47.100 | 25614 | xxx.xx.40.11
Sending REQUEST_RESPONSE message to /xxx.xx.47.82 [MessagingService-Outgoing-/xxx.xx.47.82-Small] | 2019-01-14 16:13:37.162000 | xxx.xx.47.100 | 25793 | xxx.xx.40.11
Request complete | 2019-01-14 16:13:37.814048 | xxx.xx.47.82 | 682048 | xxx.xx.40.11
ESIから始まるすべてのアクティビティは、esindexからのアクティビティです。
* ESI decoding row <rowId>: update request have been received by the ESIndex, row is being converted to JSON
* ESI writing <rowId> to ES index: update is being sent to ElasticSearch
* ESI index <rowId> done: ElasticSearch acknowledged the update
これは、検索時に何が起こるかの例です。

これは、同期書き込みの例です(esが失敗した場合、cassandra操作は失敗します):

これは非同期書き込みの例です。

これは非同期書き込みの例です。Cassandraの操作は、ESが失敗した場合に失敗しません。
