【问题标题】:Elastic Search Array Actions弹性搜索数组操作
【发布时间】:2018-11-28 17:51:06
【问题描述】:

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

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

我正在使用 ELK v 6.3.0。

【问题讨论】:

  • Elastic Array Datatype 这包含您需要的所有信息。你有没有尝试过,你有任何映射吗?有什么具体问题吗?
  • 谢谢,我看到了,但它没有回答我的最后两个问题。
  • 那个网站没有我的问题的答案。我的原始帖子末尾有三个具体问题。请试一试第二个问题。
  • 感谢您的编辑,@kahveci!看起来很棒!

标签: elasticsearch kibana elasticsearch-5


【解决方案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;
 }
}

这里的参数是一个地图,你把要更新的餐厅的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 的餐厅,并使用“更新的名称”更新名称

更多关于如何使用painless,see this

【讨论】:

  • 很高兴为您提供帮助。
猜你喜欢
  • 2019-06-03
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 2021-11-23
  • 2023-03-02
相关资源
最近更新 更多