Динамический запрос elasticsearch — добавьте еще одно поле в каждый возвращаемый документ

То, что мне нужно, очень просто, но я не могу найти, как это сделать в Elasticsearch, возможно, из-за сложности того, что требуется сделать.

Входные данные (два примера документов JSON)

{ "car" : 150, "bike" : 300 }

{ "car" : 100, "bike" : 200}

Что я хочу взамен, так это то, что когда я запускаю поисковый запрос, он возвращает мне документы с дополнительным полем inventory, которое определяется как сумма количества автомобилей и велосипедов. И в отсортированном порядке.

Пример вывода:

hits: [
   { "car" : 150, "bike" : 300, "inventory": 450},
   { "car" : 100, "bike" : 200, "inventory": 300}
]

Можно ли сделать что-то подобное в elasticsearch? (Я предполагаю, что использую динамические сценарии)


comment
Вы можете создать третье поле при вставке данных или также использовать скрипт.   -  person Alain Collins    schedule 07.10.2014
comment
blog.qbox.io/elasticsearch-aggregations   -  person Suhel Meman    schedule 07.10.2014


Ответы (1)


Я сделал это, используя поля скрипта. Ссылаться:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-script-fields.html

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

query: {
...
},
script_fields: {
  inventory: {
     script: "doc['car'].value + doc['bike'].value"
  }
}

Это приведет к созданию отдельного столбца полей с каждым попаданием в виде:

fields: {
    inventory: [450]
}

Но, поскольку я также хотел, чтобы это было отсортировано, я использовал сортировку:

query: {
...
},
sort: {
    _script: {
        script: "doc['car'].value + doc['bike'].value",
        type: "number",
        order: "desc"
    }
}

который возвращал мне поле сортировки при каждом попадании, например:

sort: [450]
person Sambhav Sharma    schedule 07.10.2014