Получить результат от aggs в скрипте ElasticSearch / Painless - PullRequest
0 голосов
/ 23 ноября 2018

Я новичок в мире ElasticSearch.Я пытался написать простой запрос, и мне нужно получить результат aggs в моем скрипте, чтобы выполнить простое условие.Можно ли сделать это таким образом?Условие ниже приведено только для примера.

GET _search
{
  "aggs" : {
      "sum_field" : { "sum" : { "field" : "someField" } }
  },
  "script_fields": {
    "script_name": {
      "script": {
        "lang": "painless",
        "source": """
             // get there aggs result (sum_field)
              if(sum_field > 5){
                  return sum_field
              }
        """
      }
    }
  }
}

1 Ответ

0 голосов
/ 23 ноября 2018

Требуется выполнить агрегацию суммы по нескольким индексам с одинаковым именем поля

Теперь с несколькими индексами вы будетенеобходимо проверить, существует ли это конкретное поле в этих индексах или нет И если поле имеет тот же тип данных .

Индексы

I 'Мы создали три индекса, имеющих одно поле с именем num.

index_1
     - num: long

index_2
     - num: long

index_3
     - num: text
          : fielddata: true

Также обратите внимание, что если поле имеет тип text, то я установил его свойство fielddata:true.Но если вы не установите его, то приведенный ниже запрос выдаст вам результат агрегации, а также ошибку, сообщающую, что вы не можете извлечь значение типа text в качестве анализируемой строки, и вы можете использовать doc только для полей, которыеnon_analyzed.

Пример запроса:

POST /_search
{  
   "size":0,
   "query":{  
      "bool":{  
         "filter":[  
            {  
               "exists":{  
                  "field":"num"
               }
            }
         ]
      }
   },
   "aggs":{  
      "myaggs":{  
         "sum":{  
            "script":{  
               "source":"if(doc['num'].value instanceof long) return doc['num'].value;"
            }
         }
      }
   }
}

Запрос, если вы не можете установить fielddata:true

В этом случае вам необходимо явно указать индексы, для которых вы хотитеагрегат.

POST /_search
{  
   "size":0,
   "query":{  
      "bool":{  
         "filter":[  
            {  
               "exists":{  
                  "field":"num"
               }
            },
            {  
               "terms":{  
                  "_index":[  
                     "index_1",
                     "index_2"
                  ]
               }
            }
         ]
      }
   },
   "aggs":{  
      "myaggs":{  
         "sum":{  
            "script":{  
               "source":"if(doc['num'].value instanceof long) return doc['num'].value;"
            }
         }
      }
   }
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...