【问题标题】:How Groovy script can be invoked using java api for Elasticsearch如何使用 java api for Elasticsearch 调用 Groovy 脚本
【发布时间】:2015-08-14 09:43:41
【问题描述】:

寻找指针以了解如何使用 java api 调用 Groovy 脚本。

test.groovy

def value = dynamicValue    
return value

想用 Java 翻译以下查询:

GET /test-index/_search
{
   "query": {
      "match_all": {}
   },
   "script_fields": {
      "checkValue": {
         "script": "test",
         "params": {
            "dynamicValue": 7
         }
      }
   }
}

【问题讨论】:

  • 我必须警告,确保您的 ES-cluster 不能从外部调用(我突然关闭,并且中国鸡在我的 ES 中栖息)都从 HTTP 作为传输
  • @Danielson:当我有数据要使用 java-api 进行索引时,我正在调用 ES 运行,完成后我正在搜索它,在一种情况下,我需要根据一些用 groovy 编写的条件放在 ES 目录中。在这种情况下,如何从外部调用 ES-cluster ?我没有得到正确的,你能解释一下吗?
  • 首先,如果你的版本是 > v1.4.3 并且你还没有将script.groovy.sandbox.enabled: false 更改为script.groovy.sandbox.enabled: true,那么请忽略我!否则,您需要检查您是否可以通过your_external_ip_address:9200 访问您的集群(您应该不会得到响应)。尝试从远处的计算机以Node 的身份连接到您的集群,您一定无法访问,请尝试使用Client CLIENT = new TransportClient(ImmutableSettings.settingsBuilder().put("cluster.name", "your_name").build()).addTransportAddress(new InetSocketTransportAddress("external_ip", 9300));
  • 顺便说一句,这就是我所说的elastic.co/guide/en/elasticsearch/reference/current/…
  • 根据elastic.co 链接:If you are running a vulnerable version of Elasticsearch, you should either upgrade to at least v1.3.8 or v1.4.3, or disable dynamic Groovy scripts by adding this setting to the config/elasticsearch.yml file in all nodes in the cluster: script.groovy.sandbox.enabled: false 如您所说。所以根据ES,你很好......

标签: java groovy elasticsearch elasticsearch-java-api


【解决方案1】:

你可以这样做:

Map<String, Object> params = ImmutableMap.of("dynamicValue", 7);
SearchResponse response = client().prepareSearch("test-index")
        .setQuery(matchAllQuery())
        .addScriptField("checkValue", new Script("test", ScriptType.FILE, "groovy", params))
        .execute().actionGet();

您需要将test.groovy 文件存储在每个数据节点上的config/scripts 文件夹中,并确保在config/elasticsearch.yml 中启用脚本

script.inline: on
script.file: on

【讨论】:

  • 感谢@Val 的快速回复:) 但我想知道是否也可以使用返回ScriptFilterBuilderFilterBuilders.scriptFilter() 来完成?基本上我想根据某些条件过滤我的数据,这些条件将作为参数传递。
  • 是的,您可以按照here 所示的方式进行操作,但是,我不确定您是否可以使用存储在文件中的脚本,只能使用内联的脚本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2019-05-04
  • 1970-01-01
相关资源
最近更新 更多