ElasticSearch在文档插入时运行脚本(插入API)

ecb*_*die 5 elasticsearch

是否可以指定在使用Index API将文档插入ElasticSearch时执行的脚本?通过在HTTP请求正文中传入属性,使用其Update API使用新信息更新现有文档时,会存在此功能.我认为它在Index API中也很有用,因为在插入过程中可能会有一些用户想要自动计算和填充的字段,而不必在插入后发送额外的Update请求以执行脚本.script

Rya*_*imm 2

弹性搜索 1.3

如果您只需要搜索/过滤要添加的字段,则添加到 1.3.0 中的映射转换功能可能适合您:

通过在映射的转换元素中注册脚本,可以在对文档进行索引之前对其进行转换。转换的结果被索引,但原始源存储在 _source 字段中。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-transform.html

当您获取文档时,也可以通过将_source_transformurl 参数添加到请求来运行相同的转换:

如果设置了 _source_transform 参数,get 端点将重新转换源。该转换在任何源过滤之前执行,但其主要设计目的是使您可以轻松查看传递到索引以进行调试的内容。

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/_get_transformed.html

但是,我认为 _search 端点不接受 _source_transform url 参数,因此我认为您无法将转换应用于搜索结果。这将是一个很好的功能请求。

弹性搜索 1.4

Elasticsearch 1.4 添加了一些功能,使这一切变得更加美好。正如您所提到的,更新 API 允许您指定要执行的脚本。1.4 中的更新 API 还可以接受在更新插入时使用的默认文档。来自 1.4 文档:

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
    "script" : "ctx._source.counter += count",
    "params" : {
        "count" : 4
    },
    "upsert" : {
        "counter" : 1
    }
}'
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,如果文档不存在,它将使用 upsert 键的内容来初始化文档。因此,在上述情况下,新创建的文档中的计数器键的值为 1。

现在,如果我们设置scripted_upsert为 true(scripted_upsert 是 1.4 中的另一个新选项),我们的脚本将针对新初始化的文档运行:

curl -XPOST 'localhost:9200/test/type1/2/_update' -d '{
    "script": "ctx._source.counter += count",
    "params": {
        "count": 4
    },
    "upsert": {
        "counter": 1
    },
    "scripted_upsert": true
}'
Run Code Online (Sandbox Code Playgroud)

在此示例中,如果文档不存在,计数器键的值为 5。

来自 Elasticsearch 站点的完整文档。