ElasticSearch 2.X查找数组中存在的数值失败

时间:2016-11-02 14:24:12

标签: elasticsearch elasticsearch-2.0 elasticsearch-dsl

我在ES2.3中有一个字段的映射如下

 <div class="form-group">
            <input type="password" class="form-control form-control-danger" placeholder="Neues Passwort" name="password" id="password">
        </div>
        <div class="form-group">
            <input type="password" class="form-control form-control-danger" placeholder="Passwort wiederholen" name="password_confirmation" id="password_confirmation">
        </div>

我的DSL查询中有一个脚本(试图在该数组中找到一个整数)

"move_in_ts": {
  "type": "integer"
}

"move_out_ts": {
  "type": "integer"
}

Sample document stores data as follows:

"move_in_ts": [
        1475280000,
        1475539200,
        1475712000,
        1475884800,
        1477008000,
        1477785600
      ]

并尝试了这个:

"script": "if(doc['move_in_ts'] && doc['move_in_ts'].values.contains('1475280000')){return 200;}"

并尝试了这个:

 "script": "if(doc['move_in_ts'] && doc['move_in_ts'].contains('1475280000')){return 200;}"

并尝试了这个:

 "script": "if(doc['move_in_ts'] && doc['move_in_ts'].contains(1475280000)){return 200;}"

但在上述所有情况下,我都会收到以下错误:

 "script": "if(doc['move_in_ts'] && doc['move_in_ts'].values.contains(1475280000)){return 200;}"

这个字段可能在少数文档中根本不存在(在我的用例中我不能使用过滤器,我只需要在脚本中使用它)

我做错了什么或如何让它发挥作用?

1 个答案:

答案 0 :(得分:1)

我无法重现该问题(我也在使用ES 2.3)。您还需要toLong()才能获得正确的结果,否则结果为零。我像这样创建了样本索引。

PUT books
{
  "mappings": {
    "book":{
      "properties": {
        "move_in_ts":{
          "type": "integer"
        }
      }
    }
  }
}

我索引了几个文档

POST books/book
{
  "move_in_ts" : null
}

POST books/book
{
  "move_in_ts" : [4,null]
}

POST books/book
{
  "move_in_ts" : []
}

POST books/book
{
  "some_other_field" : "some value"
}

POST books/book
{
  "move_in_ts" : [
        1475280000,
        1475539200,
        1475712000,
        1475884800,
        1477008000,
        1477785600
      ]
}

然后在查询下方给出了正确的结果

GET books/book/_search
{
  "query": {
    "bool": {
      "filter": {
        "script": {
          "script": "if(doc['move_in_ts'] && doc['move_in_ts'].values.contains(1475280000.toLong())){return 200;}"
        }
      }
    }
  }
}