弹性搜索数组操作

时间:2018-06-19 17:29:24

标签: elasticsearch kibana elasticsearch-5

我想在Elasticsearch索引中有一个字符串数组。假设数组是我最近的餐馆选择的列表。每次去新餐厅时,我都会将此添加到列表中。我还希望能够找到列表中有特定餐厅的所有用户。

  1. 如何创建索引来处理这种映射?
  2. 如何更新餐厅列表?
  3. 如何查询每个用户的餐厅列表?

我正在使用ELK v 6.3.0。

1 个答案:

答案 0 :(得分:0)

要回答第二个问题,可以使用无痛脚本来实现。这是相同的伪代码

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;
 }
}

这里的参数是一张地图,您在其中放置了要更新的餐厅的ID

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"
    }
  }
}

这将更新ID为1的文档,并在嵌套文档中检查ID为16的餐厅,并使用“ Updated Name”更新名称。

有关如何轻松使用see this

的详细信息