Получить информацию о последнем элементе массива безболезненно вasticsearch - PullRequest
0 голосов
/ 02 мая 2019

При обновлении документа (с использованием API обновления) мне нужно извлечь поле последнего введенного элемента массива, а затем использовать его при добавлении нового элемента в тот же массив.

Например:

{
  "_id": "guid",
  "timestamp": "time",
  "conversation": [
    {
      "previousTopic": "A",
      "currentTopic": "B",
      "score": 80
    },
    {
      "previousTopic": "B",
      "currentTopic": "C",
      "score": 85
    }
  ]
}

Теперь, вставляя новый элемент в этот массив с помощью API обновления, сначала извлеките поле «currentTopic» последнего элемента (в данном случае это C), а затем вставьте его как «previousTopic» следующего элемента.

Я знаю, как использовать API базового обновления, который бы вставлял новый элемент в массив документа:

POST test/_doc/{doc_id}/_update
{
    "script" : {
        "source": "ctx._source.communication.add(params.newcom)",
        "lang": "painless",
        "params" : {
          "newcomm" : {
          "previousTopic": {extracted value will go here}
          "currentTopic" : "D"
          "score" : 89 }
        }
    }
}

1 Ответ

0 голосов
/ 12 мая 2019

Я смог сделать это безупречно, используя безболезненные сценарии.

POST test/_doc/nbsadmnsabdmas/_update
{
    "script" : {
        "lang": "painless",
        "source" : 
        """
        // find the length of array 
        def count = ctx._source.conversation.length;

        // get to the last element and extract
        def temp = ctx._source.conversation[count-1].currentTopic;

        // add a new element to the array
        ctx._source.communication.add(['previousTopic':temp,'currentTopic':'D',
         'score':90]);

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