2

私はESを使用してレポート作成ソリューションをまとめようとしています。 ESでの私の経験は基本的なものなので、フィルタリング時に整数を使用しているのであれば違いがあるかどうかを知りたいと思います。フルテキストの代わりに整数を格納する方が良いですか?

私のフィルタの値が何であるかを知っており、全文検索が許可されていないことを知っています。

は、したがって、私のクエリで私は代わりに文字列検索の整数を使用するように速くだろう

{ 
    "filter" : { 
    "term" : { "gender" : 1 } 
} 

または

{ 
    "filter" : { 
    "term" : { "gender" : "male" } 
} 

を持つことができますどちらか?

また、整数を使用すると、ディスク領域の方が良いと思われます。

最後に、フルテキスト検索が不要な場所でMySQLを使用する方がよいでしょうか?それが違いを生む可能性がないフィルタの場合、事前に

多くのおかげで、
エンジェル

答えて

1

。しかし、集計中には、doc値の文字列フィールド(非分析のものなど)は、グローバルordinalsというヒープメモリマップにロードされることに注意してください。可能な値の数(ジェンダーはおそらく非常に小さい)に応じて、JVMに大きな圧力をかけることができます。

これをブール値フィールドとしてマッピングしてみてください。あなたがそれをした場合、またはそれを整数としてマップした場合、少しのスペースを節約できます。しかし、クエリの観点からは、それは何らかの違いをもたらすはずです。

これまでのところ、MySQLとESの違いは、やっかいな問題です。これは、何をしようとしているのか、どのくらいのデータを扱っているのか、トランザクション保証やMVCCを必要としているかどうかなどによって決まります。 MySQLとESの両方は、このようなフィルタで非常にうまくいくでしょう(あなたがMySQLでジェンダーにセカンダリインデックスを置いていると仮定します。これはLuceneによってマッピングされたBツリーベースのバージョンです)。あなたが提供した情報に基づいて、あるツールを別のツールよりも好む理由は本当にありません。あなたはより多くの文脈を提供する必要があるか、それとももっと良い(おそらくさらに優れている)かのどちらかでそれを打つ必要があります。

幸運のベスト。

+0

これはありがとうございます!私は第2段落の終わりにあなたが "それは何の違いもありません"ということを意味します。 基本的にはレポートモジュール全体「データレイク」からたくさんのログエントリを取得して処理し、フィルタリングの準備をしています。 考えられるのは、処理されたnginx/squid/etcのログをMySQLのそれぞれのテーブルに保存することでしたが、私たちは非正規化されたESの種類のコンテキストに移行しました。ここでは、 "user"タイプのドキュメントにはユーザ属性、 nginxログ、squidログなどのネストされたオブジェクトを1分間に取得します。 これは意味がありますか? – AngelP

+0

"私は第2段落の最後に、"それは何の違いもありません "ということを意味します - あなたは正しい、そうです – evanv

+1

これはMySQLではなくESに向いています。あなたがログを検索する必要がある場合は、ESでそれを行うほうがずっと簡単です。また、一定の時間が経過した後にログを期限切れにしたいと思っています。管理する。MySQLでは、テーブルからデータを削除しても、ディスク領域は再利用されません。したがって、最適化テーブルを定期的に実行してコンパクションをトリガーする必要があります。コンパイルを実行すると、書き込みのためにテーブルがロックされます。 MySQLがあなたに与える保証が必要な場合を除いて、私はおそらくES – evanv

関連する問題