标签: elasticsearch-painless

在Elasticsearch中,如何将时区应用于脚本化日期操作?

通过下面的聚合并使用ES5,我想根据给定的时区(作为TZ数据库中的标识符提供)获取dayOfWeek和hourOfDay.

如何编辑"doc['created'].date.dayOfWeek'以调整偏移量?

    aggs: {
      dayOfWeek: {
        terms: {
          script: {
            inline: "doc['created'].date.dayOfWeek",
            lang: 'painless',
          },
        },
        aggs: {
          hourOfDay: {
            terms: {
              script: {
                inline: "doc['created'].date.hourOfDay",
                lang: 'painless',
              },
            },
          },
        },
      },
    },
Run Code Online (Sandbox Code Playgroud)

timezone elasticsearch elasticsearch-painless

4
推荐指数
2
解决办法
2363
查看次数

用于计算数组长度的脚本化字段

我有以下文件:

{
  "likes": {
    "data": [
      {
        "name": "a"
      },
      {
        "name": "b"
      },
      {
        "name": "c"
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试运行一个update_by_query将添加一个名为“like_count”的字段,其中包含数组项的数量likes.data

重要的是要知道并非我的所有文档都有likes.data对象。

我试过这个:

POST /facebook/post/_update_by_query
{
  "script": {
  "inline": "if (ctx._source.likes != '') { ctx._source.like_count = ctx._source.likes.data.length }",
    "lang": "painless"
  }
}
Run Code Online (Sandbox Code Playgroud)

但是收到此错误消息:

{
    "type": "script_exception",
    "reason": "runtime error",
    "script_stack": [
      "ctx._source.like_count = ctx._source.likes.data.length }",
      "                                               ^---- HERE"
    ],
    "script": "if (ctx._source.likes != '') { ctx._source.like_count = ctx._source.likes.data.length }",
    "lang": "painless"
  }
Run Code Online (Sandbox Code Playgroud)

elasticsearch elasticsearch-painless

4
推荐指数
1
解决办法
7776
查看次数

在elasticsearch / kibana脚本字段中将IP(字符串)转换为long

我在doc中有一个字段,它是ipv4(“ 1.2.3.4”)的字符串表示形式,该字段的名称为“ originating_ip”。我正在尝试使用无痛语言编写脚本字段,以便添加新字段(originating_ip_calc)来表示上述IPv4的int(长整数)表示形式。

下面的脚本可以在groovy中工作(从我的理解中,这基本上可以工作几乎相同),但是在这种特定情况下,似乎几乎不是。

?String[] ipAddressInArray = "1.2.3.4".split("\\.");

long result = 0;
for (int i = 0; i < ipAddressInArray.length; i++) {
    int power = 3 - i;
    int ip = Integer.parseInt(ipAddressInArray[i]);
    long longIP = (ip * Math.pow(256, power)).toLong();
    result = result + longIP;
}
return result;
Run Code Online (Sandbox Code Playgroud)

我也在寻找这个问题,正如您从上面的代码中看到的那样,它基于那里的答案之一。

还尝试使用InetAddress,但没有运气。

elasticsearch elasticsearch-painless

4
推荐指数
1
解决办法
851
查看次数

ElasticSearch:从存在的所有文档中删除字段(使用 Painless?)

情况:我有一个严格映射的索引,我想从中删除一个不再使用的旧字段。因此,我使用不包含该字段的映射创建了一个新索引,并尝试将数据重新索引到新索引中。

问题:当我重新编制索引时,出现错误,因为我试图将数据索引到映射中不可用的字段中。所以为了解决这个问题,我想先从原始索引中的所有文档中删除该字段,然后才能重新索引。

PUT old_index/_doc/1
{
    "field_to_delete" : 5
}
PUT old_index/_doc/2
{
    "field_to_delete" : null
}
Run Code Online (Sandbox Code Playgroud)
POST _reindex
{
  "source": {
    "index": "old_index"
  },
  "dest": {
    "index": "new_index"
  }
}
Run Code Online (Sandbox Code Playgroud)
"reason": "mapping set to strict, dynamic introduction of [field_to_delete] within [new_index] is not allowed"
Run Code Online (Sandbox Code Playgroud)

1. 我发现的一些地方建议这样做:

POST old_index/_doc/_update_by_query
{
  "script": "ctx._source.remove('field_to_delete')",
  "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "field_to_delete"
          }
        }
      ]
    }
  }
}

Run Code Online (Sandbox Code Playgroud)

但是,这与具有显式值为 的文档不匹配null,因此在此更新后重新索引仍然失败。

2. 其他人(例如他们官方论坛上的 Elastic 团队成员)建议执行以下操作:

POST old_index/_doc/_update_by_query …
Run Code Online (Sandbox Code Playgroud)

elasticsearch elasticsearch-painless

4
推荐指数
1
解决办法
4011
查看次数

Elasticsearch无痛脚本不会使用if条件替换嵌套对象字段值

我刚开始使用ES,但仍然喜欢交易的技巧!!!我需要替换/覆盖嵌套对象类型的字段之一。这是示例文档:

{
"name":"db_ref",
"ref_counter":[
    {"ref_name":"test1","count":1},
    {"ref_name":"test2","count":2},
    {"ref_name":"test3","count":3}
    ]
}
Run Code Online (Sandbox Code Playgroud)

映射以上文档:

{
    "settings": {
        "mappings": {
            "test_doc": {
                "properties": {
                    "name": {
                        "type": "string"
                    },
                    "ref_count": {
                        "type": "nested",
                        "ref_name": "string",
                        "count": "long"
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要更新给定ref_name的计数字段值。例如,在上述情况下,如果ref_name是“ test1 ”,我希望新计数500。我想出了下面的简单脚本来更改数值,它执行得很好,没有任何错误,但是我看不到该值正在更新。

curl -XPOST "http://localhost:9200/test_type/test_type/test_db/_update" -d '
{"script": "if (ctx._source.ref_counter.ref_name == cur_ref 
                && ctx._source.ref_counter.count == cur_count)
            {ctx._source.ref_counter.count = new_count };",
"params": {"cur_count": 1,"new_count": 500, "cur_ref": "test1"}}}'
Run Code Online (Sandbox Code Playgroud)

以下是响应:

{"_index":"test_index","_type":"test_type","_id":"test_db","_version":2}
Run Code Online (Sandbox Code Playgroud)

但是,当我看到该文档时,它仍然具有旧值。

有人可以帮我将计数值更改为新值吗?

elasticsearch elasticsearch-painless

3
推荐指数
1
解决办法
813
查看次数

如何创建字典对象并在无痛弹性搜索中向其添加数据

我想编写一个应该返回字典的无痛脚本。基本上,如果我将它与 java 相关联,我想要 Dictionary< String, List > 的输出。

所以,我需要轻松声明一个 Map 和 List。另外,我需要向其中添加数据(如map.add())

我可以举例说明如何声明地图并向其添加数据吗?

[painless] ( https://www.elastic.co/guide/en/elasticsearch/painless/6.7/painless-examples.html )中的示例并未涵盖这一点。

我用的是v6.7

elasticsearch elasticsearch-aggregation elasticsearch-painless

3
推荐指数
1
解决办法
5359
查看次数

如何在无痛脚本 Elasticsearch 5.3 中执行此操作

我们正在尝试复制这个 ES 插件https://github.com/MLnick/elasticsearch-vector-scoring。原因是 AWS ES 不允许安装任何自定义插件。该插件只是做点积和余弦相似度,所以我猜想在painless脚本中复制它应该很简单。看起来groovy脚本在 5.0 中已被弃用。

这是插件的源代码。

    /**
     * @param params index that a scored are placed in this parameter. Initialize them here.
     */
    @SuppressWarnings("unchecked")
    private PayloadVectorScoreScript(Map<String, Object> params) {
        params.entrySet();
        // get field to score
        field = (String) params.get("field");
        // get query vector
        vector = (List<Double>) params.get("vector");
        // cosine flag
        Object cosineParam = params.get("cosine");
        if (cosineParam != null) {
            cosine = (boolean) cosineParam;
        }
        if (field == null || vector == …
Run Code Online (Sandbox Code Playgroud)

vector elasticsearch elasticsearch-5 elasticsearch-painless

2
推荐指数
1
解决办法
3409
查看次数

ElasticSearch/Painless:如何访问/求和对象中的所有值

我一直在研究聚合和使用脚本编写painless,但我无法弄清楚如何对对象中的所有值进行迭代/求和。

例子:

我的映射看起来像

"field1": {
  "properties": {
    "subfield1": {
      "type": "float"
    },
    "subfield2": {
      "type": "float"
    },
    "subfield3": {
      "type": "float"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

假设我的数据如下所示:

{
  "field1" : {
    "subfield1": 50.0,
    "subfield2": 20.5,
    "subfield3": 30.5
  }
}
Run Code Online (Sandbox Code Playgroud)

我想对 执行范围查询50.0 + 20.5 + 30.5,或者基本上以某种方式访问​​对象内的所有值field1

聚合不允许我在字段中使用通配符。我正在查看LeafDocLookup(内部使用无痛)的代码,我发现相关方法已被禁用。

我已经成功地编写了这样的脚本:

"query": {
  "script": {
    "script": {
      "inline": "return (doc['field1.subfield1'].value + doc['field1.subfield2'].value + doc['field1.subfield3'].value > 50);",
      "lang": "painless"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但这显然不是最优的,并且没有解决动态密钥的主要问题。

java json elasticsearch kibana elasticsearch-painless

1
推荐指数
1
解决办法
5887
查看次数

通过查询API在Elasticsearch中选择带有参数的文档字段

ElasticSearch版本= 5.5

我继承了一些通过查询API更新将任意文档字段更新为任意值的代码,如下所示:

{
 "query": ...
 "script": {
   "inline": "ctx._source." + field + " = " + value + ";"
   }
 }
Run Code Online (Sandbox Code Playgroud)

由于每分钟断路器的最大编译次数,这有时会导致查询失败。

一个部分更新将为这种情况下工作良好,但据我可以判断,部分更新标准更新API,而不是查询API提供的更新只支持:

{
 "query": ...
 "doc": {
   field: value
   }
 }

Unknown key for a START_OBJECT in [doc]
Run Code Online (Sandbox Code Playgroud)

至少,作为ES newb,我认为这就是该错误的含义。在doc查询API文档的更新中也没有提及。

假设我是正确的,部分更新将不起作用,按照脚本指南中的建议对脚本进行参数化似乎是下一步,但似乎没有任何方法可以访问由参数指定的源字段:

# I wouldn't expect this to work, but tried anyway
{
 "query": ...
 "script": {
   "inline": "ctx._source.params.field = value;",
   "params": {
      "field": field,
      "value": value …
Run Code Online (Sandbox Code Playgroud)

field elasticsearch elasticsearch-5 elasticsearch-painless

1
推荐指数
1
解决办法
1755
查看次数

如何在elasticsearch中调用存储的无痛脚本函数

我正在尝试使用一个例子

https://www.elastic.co/guide/en/elasticsearch/reference/6.4/modules-scripting-using.html

我创建了一个函数并保存了它。

POST http://localhost:9200/_scripts/calculate-score
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.added + params.my_modifier"
  }
}
Run Code Online (Sandbox Code Playgroud)

尝试调用保存的函数

POST http://localhost:9200/users/user/_search
{
  "query": {
    "script": {
      "script": {
        "id": "calculate-score",
        "params": {
          "my_modifier": 2
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

它返回一个错误:Variable [ctx] is not defined。我尝试使用doc['added']但收到相同的错误。请帮助我了解如何调用该函数。

function elasticsearch elasticsearch-painless

1
推荐指数
1
解决办法
3897
查看次数

将元素追加到Eslasticsearch字段

如果类型不匹配,可以将一些元素追加到elasticsearch字段吗?如果我有这样的文件:

{
"counter" : 1,
"tags" : "red"
}
Run Code Online (Sandbox Code Playgroud)

我想像这样附加另一个标签字段“蓝色”:

{
"script" : {
    "source": "ctx._source.counter += params.newTag",
    "lang": "painless",
    "params" : {
        "newTag" : "blue"
    }
}
}
Run Code Online (Sandbox Code Playgroud)

我想要的结果类似于:

{
"counter" : 1,
"tags" : ["red", "blue"]
 }
Run Code Online (Sandbox Code Playgroud)

我知道这个:

"source": "ctx._source.counter += params.newTag"
Run Code Online (Sandbox Code Playgroud)

用于将字符串追加到另一个字符串

和这个:

"source": "ctx._source.counter.add(params.newTag)"
Run Code Online (Sandbox Code Playgroud)

用于将另一个元素追加到列表。那么有什么办法可以将另一个元素附加到字符串字段?谢谢您的任何建议。

elasticsearch elasticsearch-painless

0
推荐指数
1
解决办法
1063
查看次数

ElasticSearch 术语聚合脚本时区转换

我真的很挣扎。在 Painless 中,我将如何更新以下内容:

 "aggs": {
    "total_messages_per_day_of_week": {
      "terms": {
        "script": {
          "lang": "painless",
          "source": "doc['date'].value.dayOfWeek"
        }
      },
Run Code Online (Sandbox Code Playgroud)

在获取星期几之前,要将 doc.date 中的 UTC 日期时间转换为区域设置(例如“America/Los_Angeles”)?

基本上我想按天数聚合,但其中天数代表所需的时区日,而不是 UTC 日。

提前谢谢了!

elasticsearch elasticsearch-painless

0
推荐指数
1
解决办法
1130
查看次数