2016-07-07 6 views
1

Elasticsearch 쿼리에 대해 최상의 성능을 얻으려고합니다.MySQL 쿼리에서 Elasticsearch 쿼리

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

field_a 값의 수는 1 사이와의이 (20) 모든 항목이 정확히 일치를 필요로 가정 해 봅시다 수
나는이 MySQL의 쿼리와 유사한 무언가를해야합니다.

지금 내가 사용하고 쿼리

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

지수는 3 개 천만 문서 약이 시점에서 가지고 있으며,이 쿼리 0.04s에 결과를 반환 - (컬을 통해) 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 만들어야합니다. 쿼리에서 *를 사용하지 마십시오. 성능이 저하됩니다. 대신 * - 필요한 필드를 작성하십시오.