【问题标题】:Updating document in Elastic App Search with script not working使用脚本在 Elastic App Search 中更新文档不起作用
【发布时间】:2022-01-27 09:41:53
【问题描述】:

我是弹性搜索的新手,我正在使用 Elastic App Search

所以我正在尝试通过 MongoDB Realm App 更新弹性应用搜索中的数据,该应用基本上提供了 CRUD 操作的触发器。

我可以添加文档或更新现有字段。

但问题是我无法向数组字段添加元素。我想从数组中添加或删除元素,经过一些研究我发现可以使用一些脚本来完成:

"script": {
  "source": "ctx._source.fieldToUpdate.add(elementToAdd);",
  "lang": "painless"
}

但它只是不工作。我正在使用 REST APIs 在弹性应用搜索中添加或更新数据。我正在使用弹性云托管服务。

更新 - 1

我在使用 ES App Search,创建引擎并将其命名为“articles”,当我尝试使用 kibana 运行查询时,我不得不使用一些奇怪的名称“.ent-search-engine-documents-article” . 所以我尝试在 Elastic Search REST API 中使用相同的名称

POST /.ent-search-engine-documents-article/_update/docid

它工作得非常好,但我想只使用 APP Search 的 REST API 来执行相同的工作。

【问题讨论】:

  • 您对这个脚本有什么反应?
  • 我已对问题添加了更新。此外,当我尝试使用 ES App Search 的 REST API 添加脚本时,它只是添加了一个名为“脚本”的字段,并将我们发送的脚本对象的值字符串化并将其用作它的值。我附上了更新文件的图像。 imgur.com/m7J1OWp

标签: elasticsearch elastic-appsearch


【解决方案1】:

要对通过 AppSearch 存储的数据执行 CRUD 操作,您应该使用 Documents API


AppSearch 不处理嵌套对象,仅提供 4 种字段类型:文本、数字、日期和地理位置。如果您要发布对象,它将按照您在评论中的描述将它们展平和字符串化。

数组也是如此,因此您不能只将元素添加到包含数组的字段,因为它只是一个文本字段,您需要重写整个字段(尽管它确实将它们检测为数组和例如,如果您将该字段用作构面,则分别处理每个元素)。

至于如何使用 AppSearch REST API 打补丁,这里有一个受the official documentation启发的小例子:

curl -X PATCH 'https://[instance id].ent-search.[region].[provider].cloud.es.io:443/api/as/v1/engines/articles/documents' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer private-xxxxxxxxxxxxxxxxxxxx' \
-d '[
  { "id": "your_article_id", 
    "source": "your article source",
    "lang": "painless" }
]'

还有clients for several programming languages,您可能会觉得有用或更直观。


您为引擎看到的奇怪名称,例如 ".ent-search-engine-documents-article" 是 ElasticSearch 上的基础索引,您通常不希望直接操作它们。

【讨论】:

    猜你喜欢
    • 2019-03-12
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2017-07-13
    • 1970-01-01
    • 2019-12-30
    相关资源
    最近更新 更多