4

クライアント側の処理が多すぎる場合、ElasticSearch の map-reduce に相当するものは何ですか? クライアントがデータを受け取ったときに出力するデータを減らすことができるように、「ストリーミング」のようなものはありますか?

クライアント側で結合または複雑なフィルタリングを行う必要があると仮定します。これは、map-reduce スキームがないとメモリに収まらない可能性があるタイプです。応答を長時間待つことは気にしませんが、マシン (クライアントおよび/またはサーバー) をクラッシュさせたくありません。

これについてどうすればよいですか?

例、マッピング:

{"book":{"properties":{
                       "title":{"type":"string", "index":"analyzed"},
                       "author":{"type":"string", "index":"analyzed"},
}

{"character":{"properties":{
                       "book_id":{"type":"string", "index":"not_analyzed"},
                       "name":{"type":"string", "index":"analyzed"},
                       "age":{"type":"integer"},
                       "catch-phrase":{"type":"string", "index":"analyzed"},
}

N より長くないキャッチフレーズを持つ少なくとも M 文字を含むすべての本を見つけたいとします (N はクライアント側で提供されるパラメーターです)。

そうなるだろうget_books_with_short_phrases(M,N)

もちろん、「句の長さ」などのフィールドを「文字」タイプに追加することもできますが、「キャッチフレーズ」の処理は常に変化する可能性があると仮定しましょう。

<book>-<character,len(phrase)>「キャラクター」と「本」をクライアントにストリーミングし、各クライアントを調べてキー値を出力し、さらにそれを削減したいと思います<book>-<num_of_chars_with_short_phrase>

すべてのドキュメントをクライアント メモリにロードすると、大惨事になる可能性があります。クライアントが各本を処理し、それを ak,v に縮小する場合は、より良いかもしれません。

私はそれについて間違っていますか?

ソリューションは何らかの方法でサーバー上でスクリプトを実行しているので、map-reduce を実行しますか?

4

2 に答える 2

4

ES でストリーミングを行うことはできません。

「結合」が存在しない別の考え方に入るのが最善であることはご存知だと思います。代わりに、非正規化して、ES への 1 つのクエリでユースケースをカバーしようとします。もちろん、これは常に機能するとは限りません。

ただし、上記の場合は、クエリ時のパラメーターを許可する複雑な計算 (SQL ストアド プロシージャに似ています) を可能にする script-filter をご覧になることをお勧めします。

これにより、サーバー上で一度にクエリを実行するためのツールが得られると確信していますが、深く調べただけではありません。

http://www.elastic.co/guide/reference/query-dsl/script-filter/ http://www.elastic.co/guide/reference/modules/scripting/

于 2013-05-11T21:12:37.177 に答える
0

はい、おそらくデータを非正規化して、すべてを 1 つのドキュメントに収める必要があります。

次に、スクリプト化されたメトリクスを調べます。これにより、クエリ内の groovy スクリプトまたはネイティブ Java スクリプトのいずれかを使用して、Elasticsearch ノード自体で分散処理のような map/reduce を実行し、結果の縮小された値のみを返すことができます。サンプル Java 実装については、たとえばこの例を参照してください。

于 2015-10-07T12:30:55.877 に答える