2016-07-07 3 views
1

Я пытаюсь получить наилучшую производительность для запроса Elasticsearch.
мне нужно что-то похожее на этот запрос MySQL:Запрос MySQL на запрос Elasticsearch

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.04s - 0.06s (через Curl).
Есть ли лучший способ получить результаты, которые мне нужны?

Обновление
Поле__ - это строка, которая не анализируется.
Поле 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. Не используйте * в запросе - это снижает производительность. Вместо этого * - напишите нужные поля.

Смежные вопросы