Elastic Search Array Actions

Я хотел бы иметь массив строк в индексе эластичного поиска. Предположим, что массив - это список моих недавних выборов в ресторане. Каждый раз, когда я иду в новый ресторан, я добавляю это в свой список. Я также хотел бы иметь возможность найти всех пользователей, у которых есть определенный ресторан в их списке.

  1. Как я могу создать индекс для обработки этого вида сопоставления?
  2. Как я могу обновить список ресторанов?
  3. Как я могу запросить список ресторанов каждого пользователя?

Я использую ELK v 6.3.0.

1 ответ

Решение

Чтобы ответить на второй вопрос, вы можете использовать безболезненный сценарий для его достижения. Это псевдокод для того же

for(int i=0; i<ctx._source.RESTAURANTS.size();i++) {
 if(ctx._source.RESTAURANTS[i].ID == params.RESTAURANT_ID) {
    ctx._source.RESTAURANTS[i].NAME = params.RESTAURANT_NAME;
    break;
 }
}

Params здесь карта, там вы указали идентификатор ресторана, который вы хотите обновить

esClient.prepareUpdate(indexName, type, documentId).setScript(new Script(ScriptType.INLINE, "painless", "replace script here", params)).execute().actionGet()

Вы также можете написать запрос и передать параметры

POST restaurant/1/_update
{
  "script": {
    "lang": "painless",
    "inline": "for(int i=0; i<ctx._source.RESTAURANTS.size();i++) { if(ctx._source.RESTAURANTS[i].ID == params.RESTAURANT_ID) { ctx._source.RESTAURANTS[i].NAME = params.RESTAURANT_NAME; break;}}",
    "params": {
      "RESTAURANT_ID": 16,
      "RESTAURANT_NAME": "Updated Name"
    }
  }
}

Это обновит документ с идентификатором 1, а во вложенном документе проверьте ресторан с идентификатором 16 и обновите имя с "Обновленное имя".

Для более подробной информации о том, как использовать безболезненно, см. Это

Другие вопросы по тегам