Есть ли способ перебрать документ массива elasti c, как другой язык программирования, с помощью скрипта - PullRequest
3 голосов
/ 10 июля 2020

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

{
"supply": {
  "properties": {
    "rotation_list": {
      "type": "nested",
      "properties": {
        "project_end_date": {
          "type": "nested",
          "properties": {
            "end_date": {
              "type": "date",
              "format": "yyyy-MM-ddTHH:mm:ss"
            }
          }
        },
        "total_days": {
          "type": "integer"
        }
      }
    }
  }
}}

Данные

{"rotation_list": [
{
  "project_end_date": [
    {
      "end_date": "2020-08-07"
    },
    {
      "end_date": "2020-06-07"
    }
  ],
  "total_days": 23
},
{
  "project_end_date": [
    {
      "end_date": "2020-08-07"
    }
  ],
  "total_days": 26
}]}

запрос

{"query": {
"bool": {
  "filter": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "rotation_list.project_end_date",
            "query": {
              "script": {
                "script": {
                  "lang": "groovy",
                  "inline": "import  org.elasticsearch.common.logging.*;logger=ESLoggerFactory.getLogger('myscript');def ratable =false;logger.info(doc['rotation_list.project_end_date.end_date'].values)"
                }
              }
            }
          }
        }
      ]
    }
  }
}}}

Результат журнала

[INFO ][myscript] [1596758400000] [INFO ][myscript] [1591488000000] [INFO ][myscript] [1596758400000]

Я не уверен, почему это происходит. Есть ли способ выполнить итерацию, например [1596758400000, 1591488000000] и [1596758400000]. Данные также сохраняются. Я упомянул в сопоставлении также вложенный тип. Не уверен, почему это так возвращается. Есть ли способ выполнить итерацию, как в исходном документе, который я проиндексировал.

1 Ответ

0 голосов
/ 10 июля 2020

Невозможно получить доступ к вложенному соседу do c в запросе сценария из-за природы вложенного , в результате чего каждый (под) документ обрабатывается как отдельный документ - будь то на верхний уровень или в массиве объектов, таких как ваш rotation_list.project_end_date.

Единственная допустимая ситуация с доступом ко всему контексту вложенного поля находится в пределах script_fields, но вы, к сожалению, не можете запрашивать по ним - создавайте их только на лету и извлекайте:

Используя ваше отображение сверху

GET supply_nested/_search
{
  "script_fields": {
    "combined_end_dates": {
      "script": {
        "lang": "painless",
        "source": "params['_source']['rotation_list'][0]['project_end_date']"
      }
    }
  }
}

Итерация в запросе сценария возможна, только если вложено только rotation_list, но не project_end_date. Здесь используется 7.x:

PUT supply_non_nested
{
  "mappings": {
    "properties": {
      "rotation_list": {
        "type": "nested",
        "properties": {
          "project_end_date": {
            "type": "object",
            "properties": {
              "end_date": {
                "type": "date",
                "format": "yyyy-MM-dd"
              }
            }
          },
          "total_days": {
            "type": "integer"
          }
        }
      }
    }
  }
}

Syn c a do c:

POST supply_non_nested/_doc
{
  "rotation_list": [
    {
      "project_end_date": [
        {
          "end_date": "2020-08-07"
        },
        {
          "end_date": "2020-06-07"
        }
      ],
      "total_days": 23
    },
    {
      "project_end_date": [
        {
          "end_date": "2020-08-07"
        }
      ],
      "total_days": 26
    }
  ]
}

Запрос с использованием painless вместо groovy, потому что это более безопасно и менее подробный в этом случае:

GET supply_non_nested/_search
{
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "must": [
            {
              "nested": {
                "path": "rotation_list",
                "query": {
                  "script": {
                    "script": {
                      "lang": "painless",
                      "inline": "Debug.explain(doc['rotation_list.project_end_date.end_date'])"
                    }
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}

, что дает

...
"reason": {
          ...
          "to_string": "[2020-06-07T00:00:00.000Z, 2020-08-07T00:00:00.000Z]",
          "java_class": "org.elasticsearch.index.fielddata.ScriptDocValues$Dates",
        }
...

Из вашего фрагмента не совсем ясно, чего вы пытались достичь в запросе. Не могли бы вы уточнить?

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