Как разделить два поля и получить среднее - PullRequest
1 голос
/ 21 марта 2019

Я использую Elastic 6.5

Мне нужно разделить два поля вместе и затем получить среднее значение.

Пример mysql, который я пытаюсь воссоздать:

SELECT avg(field1/field2)
FROM table
WHERE field1 > 0 && field2 > 0

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Я решил свою задачу с помощью запроса ниже:

{
  "size": 0,
  "query": { 
    "match_all":{}
  },
  "aggs": {
    "average": {
      "avg": {
        "script": {
          "source": "(doc['field1'].empty || doc['field2'].empty || doc['field2'].value < 1  ? null : doc['field1'].value / doc['field2'].value)"
        }
      }
    }
  }
}
0 голосов
/ 22 марта 2019

Вы можете достичь того, что ищете, используя Поля скрипта .

Я создал образец сопоставления, документы, запрос и ответ для этого варианта использования, которые указаны ниже:

Сопоставление

PUT myindex
{  
   "mappings":{  
      "mydocs":{  
         "properties":{  
            "field1":{  
               "type":"long"
            },
            "field2":{  
               "type":"long"
            }
         }
      }
   }
}

Образцы документов:

POST myindex/mydocs/1
{
  "field1": 0,
  "field2": 0
}
POST myindex/mydocs/2
{
  "field1": 20,
  "field2": 20
}
POST myindex/mydocs/3
{
  "field1": 40,
  "field2": 20
}
POST myindex/mydocs/4
{
  "field1": 40,
  "field2": 0
}

Запрос Query

POST <your_index_name>/_search
{  
   "_source":"*",
   "query":{  
      "match_all":{  

      }
   },
   "script_fields":{  
      "average":{  
         "script":"long a1 = 0l;long a2 = 0l;if(params._source.field1==null){a1 = 01;} else {a1 = params._source.field1}if(params._source.field2==null || params._source.field2<0){ a2=0l} else {a2 = params._source.field2}return a2 > 0? (a1/a2) : 0;"
      }
   }
}

Обратите внимание, что вы можете соответствующим образом изменить вышеуказанную логику, чтобы она соответствовала вашему сценарию усреднения, только если fields > 0

Ответ

{
  "took": 12,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 1,
    "hits": [
      {
        "_index": "myindex",
        "_type": "mydocs",
        "_id": "2",
        "_score": 1,
        "_source": {
          "field1": 20,
          "field2": 20
        },
        "fields": {
          "average": [
            1
          ]
        }
      },
      {
        "_index": "myindex",
        "_type": "mydocs",
        "_id": "4",
        "_score": 1,
        "_source": {
          "field1": 40,
          "field2": 0
        },
        "fields": {
          "average": [
            0
          ]
        }
      },
      {
        "_index": "myindex",
        "_type": "mydocs",
        "_id": "1",
        "_score": 1,
        "_source": {
          "field1": 0,
          "field2": 0
        },
        "fields": {
          "average": [
            0
          ]
        }
      },
      {
        "_index": "myindex",
        "_type": "mydocs",
        "_id": "3",
        "_score": 1,
        "_source": {
          "field1": 40,
          "field2": 20
        },
        "fields": {
          "average": [
            2
          ]
        }
      }
    ]
  }
}

В ответе выше вы ищете поле average.

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

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