使用 Index API 将文档插入 ElasticSearch 时,是否可以指定执行脚本?使用 Update API 更新现有文档时,通过在HTTP请求正文中传入script
属性,可以使用此功能。我认为它在Index API中也很有用,因为在插入过程中可能会有一些用户想要自动计算和填充的字段,而不必在插入后发送额外的更新请求以执行脚本。
答案 0 :(得分:2)
Elasticsearch 1.3
如果您只需要搜索/过滤您想要添加的字段,则添加到1.3.0中的映射转换功能可能对您有用:
在通过注册a来索引文档之前,可以对文档进行转换 脚本在映射的transform元素中。结果 transform被索引,但原始源存储在_source中 字段。
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-transform.html
通过在请求中添加_source_transform
url参数,您也可以获得相同的转换运行:
如果_source_transform,get端点将重新转换源 参数设置。转换在任何源之前执行 过滤,但它主要是为了让你很容易看到它是什么 传递给索引进行调试。
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/_get_transformed.html
但是,我不认为_search端点接受_source_transform url参数,因此我认为您无法将转换应用于搜索结果。这将是一个很好的功能请求。
Elasticsearch 1.4
Elasticsearch 1.4添加了一些功能,使所有这些更好。如您所述,更新API允许您指定要执行的脚本。 1.4中的更新API也可以接受在upsert的情况下使用的默认文档。来自1.4文档:
curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{
"script" : "ctx._source.counter += count",
"params" : {
"count" : 4
},
"upsert" : {
"counter" : 1
}
}'
在上面的示例中,如果文档不存在,则使用upsert键的内容来初始化文档。因此,在上面的情况下,新创建的文档中的计数器键的值为1.
现在,如果我们将scripted_upsert
设置为true(scriptted_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
}'
在此示例中,如果文档不存在,则计数器键的值为5.