Эластичная группа запросов по - PullRequest
0 голосов
/ 25 апреля 2018

Я начал изучать ElasticSearch, и мне было интересно, может ли кто-нибудь помочь мне ускорить процесс, предоставив несколько примеров того, как мне построить пару запросов.

Вот мой пример схемы ...

PUT /sales/_mapping
{   
   "sale": {
      "properties": {
         "productCode: {"type":"string"},
         "productTitle": {"type": "string"},
         "quantity" : {"type": "integer"},
         "unitPrice" : {"type": double}
       }
   }
}

POST /sales/1
{"productCode": "A", "productTitle": "Widget", "quantity" : 5, "unitPrice":
5.50}
POST /sales/2
{"productCode": "B", "productTitle": "Gizmo", "quantity" : 10, "unitPrice": 1.10}
POST /sales/3
{"productCode": "C", "productTitle": "Spanner", "quantity" : 5, "unitPrice": 
9.00}
POST /sales/4
{"productCode": "A", "productTitle": "Widget", "quantity" : 15, "unitPrice": 
5.40}
POST /sales/5
{"productCode": "B", "productTitle": "Gizmo", "quantity" : 20, "unitPrice": 
1.00}
POST /sales/6
{"productCode": "B", "productTitle": "Gizmo", "quantity" : 30, "unitPrice": 
0.90}
POST /sales/7
{"productCode": "B", "productTitle": "Gizmo", "quantity" : 40, "unitPrice": 
0.80}
POST /sales/8
{"productCode": "C", "productTitle": "Spanner", "quantity" : 100, 
"unitPrice": 7.50}
POST /sales/9
{"productCode": "C", "productTitle": "Spanner", "quantity" : 200, 
"unitPrice": 5.50}

Какой запрос мне потребуется для получения следующих результатов?

а). Показать шоу количество документов, сгруппированных по коду товара

Product code  Title    Count
A             Widget   2
B             Gizmo    4
C             Spanner  3

б). Показать общее количество проданных единиц по коду продукта, т.е.

Product code  Title    Total units sold
A             Widget   20
B             Gizmo    100
C             Spanner  305

ТИА

1 Ответ

0 голосов
/ 25 апреля 2018

Вы можете сделать это, используя агрегаты , в частности Термины агрегирования .И это можно сделать всего за один запуск, включив их в свою структуру запроса;чтобы дать ES команду на создание аналитических данных, основанных на агрегациях, вам необходимо включить объект aggregations (или aggs) и указать в нем тип агрегации, который вы хотели бы, чтобы ES запускал для ваших данных.

{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "group_by_product": {
      "terms": {
        "field": "productCode"
      },
      "aggs": {
        "units_sold": {
          "sum": {
            "field": "quantity"
          }
        }
      }
    }
  }
}

Запустив этот запрос, помимо результатов поиска по вашему запросу (в данном случае мы выполняем сопоставление всех), в объект ответа будет включен дополнительный объект, содержащий соответствующие результирующие агрегаты.Например,

{
  ...
  "hits": {
    "total": 6,
    "max_score": 1,
    "hits": [ ... ]
  },
  "aggregations": {
    "group_by_product": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "b",
          "doc_count": 3,
          "units_sold": {
            "value": 60
          }
        },
        {
          "key": "a",
          "doc_count": 2,
          "units_sold": {
            "value": 20
          }
        },
        {
          "key": "c",
          "doc_count": 1,
          "units_sold": {
            "value": 5
          }
        }
      ]
    }
  }
} 

Для краткости я опустил некоторые детали из объекта ответа и выделил важную часть, которая находится внутри объекта aggregations.Вы можете видеть, как агрегированные данные состоят из разных сегментов, каждый из которых представляет отдельные типы продуктов (идентифицированные с помощью клавиши key), которые были найдены в ваших документах, doc_count содержит число вхождений на тип продукта и unit_sold object содержит общую сумму сумму единиц, проданных по каждому из типов продуктов.

Важно помнить, что для выполнения агрегации по string или текстовые поля, вам необходимо включить параметр fielddata в вашем отображении полей, так как этот параметр по умолчанию отключен во всех текстовых полях.Для того, чтобы обновить отображение, например.поля кода продукта, вам просто нужно отправить запрос PUT на соответствующий тип отображения в индексе, например,

PUT http://localhost:9200/sales/sale/_mapping
{
  "properties": {
    "productCode": {
      "type": "string",
      "fielddata": true
    }
  }
}

(больше info о настройке fielddata)

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