2016-07-07 12 views
1

私はElasticsearchクエリで最高のパフォーマンスを得ようとしています。
私は、このMySQLのクエリのようなものが必要です。field_aの値の数は1とのは、20 すべてのフィールドが完全一致を必要と言わせ間とすることができるMySQLクエリからElasticsearchクエリ

SELECT * FROM table WHERE field_a IN ('value1', 'value2') AND field_b = value 

を。

今私は、クエリを使用しています:

{ 
    "query" : { 
     "constant_score" : { 
     "filter" : { 
      "bool" : { 
       "should" : [ 
       { "term" : {"field_a" : "value1"}}, 
       { "term" : {"field_a" : "value2"}} 
       ], 
       "must" : { 
       "term" : {"field_b" : "value"} 
       } 
      } 
     } 
     } 
    } 
} 

をインデックスは、この時点では約30万件のドキュメントを持っており、このクエリは0.04sで結果を返します - (cURLを経由して)0.06s。
必要な結果を得るためのより良い方法はありますか?

更新
field_aは解析されない文字列です。
field_bは整数です。あなたはfield_aのと比較する値のリストを持っている場合は

+0

'field_a 'の値は数値ですか?そうであれば、広範囲のチェックのために 'gt'と' lt'演算子を使うことができます。 –

+0

本当に一定スコアブロックが必要ですか?とにかくフィルタブロックを使用しているので、採点はあなたにとって重要ではありません。 – shiladitya

+0

@AvihooMamka 'field_a'は数値ではありません。 –

答えて

2

すると、次のクエリを使用することができます。

{ 
    "query" : { 
     "constant_score" : { 
     "filter" : { 
      "bool" : { 
       "should" : [ 
       { "terms" : {"field_a" : ["value1", "value2", "etc..."]}} 
       ], 
       "must" : { 
       "term" : {"field_b" : "value"} 
       } 
      } 
     } 
     } 
    } 
} 
+1

ちょうどこれをテストしました。パフォーマンスは改善されませんが、読みやすくなります。私はそれを使用するつもりです。 –

1

インデックスはfield_aとfield_bのために作成する必要があります。クエリで*を使用しないでください。パフォーマンスが低下します。代わりに* - 必要なフィールドを記述します。