Сценарий Elasticsearch со значением из другого документа

Представьте, что у меня есть два типа документов:

  • Клиенты - содержит информацию, такую ​​как регион, язык и т. Д.)
  • Покупки - содержат информацию об отдельных покупках).

Между покупателями / покупателями существуют отношения между родителями и детьми.

Мне нужно создать отчет, который будет содержать все покупки, которые соответствуют определенным критериям фильтра, но каждая строка должна также содержать некоторые данные поиска из документа клиента (например: локаль клиента). Я знаю, что один из способов сделать это состоит в том, чтобы сгладить данные и поместить эти поля непосредственно в документ о закупках. Я хотел бы знать, есть ли способ, которым ElasticSearch мог бы заполнить эти поля автоматически для меня (возможно, некоторая магия поиска по сценариям?) Вместо этого.

1 ответ

Решение

Нет доступа к полям из parent/child используя любой вид сценария, потому что это совершенно другой документ. Было бы очень дорого получить доступ к родителю из контекста ребенка и наоборот.

Внутренние хиты будут делать то, что вам нужно:

PUT test
{
  "mappings": {
    "Customer": {},
    "Purchase": {
      "_parent": {
        "type": "Customer"
      }
    }
  }
}

PUT test/Customer/1
{
  "firstName": "John",
  "lastName": "Doe"
}

PUT test/Purchase/2?parent=1
{
  "price": 100
}

GET test/Purchase/_search
{
  "query":{
    "bool":{
      "must":[
        {
          "range":{
            "price":{
              "gte":10
            }
          }
        },
        {
          "has_parent":{
            "type":"Customer",
            "inner_hits":{},
            "query":{
              "match_all":{}
            }
          }
        }
      ]
    }
  }
}
Другие вопросы по тегам