Elasticsearch удаляет поле из объекта массива в динамически генерируемом индексе - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь удалить поля из объекта массива в Elasticsearch. Индекс был сгенерирован динамически.

Это отображение:

{
  "mapping": {
    "_doc": {
      "properties": {
        "age": {
          "type": "long"
        },
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "result": {
          "properties": {
            "resultid": {
              "type": "long"
            },
            "resultname": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            }
          },
        "timestamp": {
          "type": "date"
        }
      }
    }
  }
}
}

это документ:

{
    "result": [
        {
            "resultid": 69,
            "resultname": "SFO"
        },
        {
            "resultid": 151,
            "resultname": "NYC"
        }
    ],
    "age": 54,
    "name": "Jorge",
    "timestamp": "2020-04-02T16:07:47.292000"
}

Моя цель состоит в том, чтобы удалить все поля заново в результате во всех документ индекса. После обновления документ должен выглядеть следующим образом:

{
    "result": [
        {
            "resultname": "SFO"
        },
        {
            "resultname": "NYC"
        }
    ],
    "age": 54,
    "name": "Jorge",
    "timestamp": "2020-04-02T16:07:47.292000"
}

Я попытался использовать следующие статьи по stackoverflow, но безуспешно: Удалить элементы / объекты из массива в ElasticSearch, за которым следует соответствующий запрос удаление объектов из массива, удовлетворяющих условию в elasti c поиск с помощью javascript api Удаление вложенного массива вasticsearch Удаление объектов из вложенных полей в ElasticSearch

Надеюсь, кто-нибудь поможет мне найти решение.

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Я объединил ответ от Lu c E с некоторыми из моих собственных знаний, чтобы найти решение без переиндексации.

POST INDEXNAME/TYPE/_update_by_query?wait_for_completion=false&conflicts=proceed
{
"script": {
    "source": "for (int i=0;i<ctx._source.result.length;i++) { ctx._source.result[i].remove(\"resultid\")}"
    },
"query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "result.id"
          }
        }
      ]
    }
  }
}

Еще раз спасибо Lu c!

0 голосов
/ 03 апреля 2020

Вы должны переиндексировать свой индекс в новом с помощью _reindex API и вызвать скрипт для удаления ваших полей:

POST _reindex
{
  "source": {
    "index": "my-index"
  },
  "dest": {
    "index": "my-index-reindex"
  },
  "script": {
    "source": """
     for (int i=0;i<ctx._source.result.length;i++) {
        ctx._source.result[i].remove("resultid")
     }
     """

  }
}

После того, как вы можете удалить свой первый индекс:

DELETE my-index

И переиндексировать его:

POST _reindex
{
  "source": {
    "index": "my-index-reindex"
  },
  "dest": {
    "index": "my-index"
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...