2016-07-07 114 views
1

我正在嘗試爲Elasticsearch查詢獲得最佳性能。
我需要類似這樣的MySQL查詢的內容:對Elasticsearch查詢的MySQL查詢

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

值的field_a數目可以是1之間,讓我們說20 所有字段要求完全匹配。

現在,我使用的查詢:

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

該指數已經在大約30萬份文檔了這一點,這查詢返回的結果中0.04秒 - 0.06S(通過捲曲)。
有沒有更好的方法來獲得我需要的結果?

更新
該field_a是一個字符串未分析。
field_b是一個整數。

+0

'field_a'的值是數字嗎?如果是這樣,您可以使用'gt'和'lt'運算符進行大範圍檢查。 –

+0

你真的需要一個不斷的分數嗎?你是無論如何使用過濾塊,所以得分對你來說無所謂 – shiladitya

+0

@AvihooMamka'field_a'不是數字。 –

回答

2

如果你有值的列表中選擇所需field_a來比較,你可以使用下面的查詢:

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

剛剛測試過這個。這不會改進性能,但它更易於閱讀。我會用它。 –

1

指標必須field_a和field_b創建。不要在查詢中使用*,會降低性能。相反* - 寫你需要的字段。