Elastic Search Array Actions
Я хотел бы иметь массив строк в индексе эластичного поиска. Предположим, что массив - это список моих недавних выборов в ресторане. Каждый раз, когда я иду в новый ресторан, я добавляю это в свой список. Я также хотел бы иметь возможность найти всех пользователей, у которых есть определенный ресторан в их списке.
- Как я могу создать индекс для обработки этого вида сопоставления?
- Как я могу обновить список ресторанов?
- Как я могу запросить список ресторанов каждого пользователя?
Я использую 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 и обновите имя с "Обновленное имя".
Для более подробной информации о том, как использовать безболезненно, см. Это