小编pmi*_*hev的帖子

无痛(Elasticsearch)将任何类型的值转换为整数

我正在将 Elasticsearch 脚本从 Groovy 转换为 Painless。该脚本接受一个参数,该参数可以是整数或可转换为整数的字符串(即可以是123"123")。

在 Groovy 中,执行my_val.toLong()可以很好地转换两者,但该方法在 Painless 中不可用。

是否有任何替代语法可以在 Painless 中执行相同的操作?

我尝试使用(long) my_var进行显式转换,但我得到java.lang.String无法转换为 java.lang.Number

简而言之,我想在 Painless 中执行以下操作并最终实现

GET _search
{
  "script_fields": {
    "test": {
      "script": {
        "lang": "groovy",
        "params": {
          "my_val1": "123",
          "my_val2": 123
        },
        "source": """
        my_val1.toLong() == my_val2.toLong()
        """
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

elasticsearch elasticsearch-painless

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

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 2.4,对嵌套对象不起作用存在过滤器

我的映射是:

"properties": {
  "user": {
    "type": "nested",
    "properties": {
      "id": {
        "type": "integer"
      },
      "is_active": {
        "type": "boolean",
        "null_value": false
      },
      "username": {
        "type": "string"
      }
    }
  },
Run Code Online (Sandbox Code Playgroud)

我想获取所有没有user字段的文档。

我试过了:

GET /index/type/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": {
            "field": "user"
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

返回所有文档。基于ElasticSearch 2.x,存在用于嵌套字段的过滤器不起作用的问题,我也尝试过:

GET /index/type/_search
{
  "query": {
    "nested": {
      "path": "user",
      "query": {
        "bool": {
          "must_not": [
            {
              "exists": {
                "field": "user"
              }
            }
          ]
        } …
Run Code Online (Sandbox Code Playgroud)

elasticsearch elasticsearch-dsl elasticsearch-2.0

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