ElasticSearch 2.X не находит числовое значение в массиве.

У меня есть отображение одного поля в ES2.3 следующим образом

"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
      ]

У меня есть скрипт в моем запросе DSL (пытается найти целое число в этом массиве)

"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;}"

но во всех вышеперечисленных случаях я получаю следующую ошибку:

"reason": {
      "type": "null_pointer_exception",
      "reason": null
    }

Возможно, это поле вообще не существует в нескольких документах (я не могу использовать фильтр в моем случае использования, мне нужно, чтобы он был только в сценарии)

Что я делаю неправильно или как заставить его работать?


person JVK    schedule 02.11.2016    source источник
comment
является вложенным полем «move_in_ts»?   -  person ChintanShah25    schedule 02.11.2016
comment
Я не могу воспроизвести проблему. Не могли бы вы опубликовать весь свой запрос? Ваш индекс огромен?   -  person ChintanShah25    schedule 02.11.2016
comment
нет, это не вложенное поле   -  person JVK    schedule 02.11.2016
comment
@ ChintanShah25 нет, мой индекс довольно маленький. Какой конкретный сценарий сработал у вас?   -  person JVK    schedule 02.11.2016
comment
@ ChintanShah25 это мой настоящий сценарий, который я использую. "functions": [{ "script_score": { "script": "if (doc['move_in_ts'] && doc['move_out_ts']) {return per_day_boost * ( [ doc['move_in_ts'], doc['move_out_ts'] ].transpose().find { av_start, av_out -> av_start <= desired_in_ts && av_out >= desired_out_ts }[0] - desired_in_ts).abs()/86400}; return 0;", "params": { "per_day_boost": -175, "desired_in_ts": 1478131200, "desired_out_ts": 1494547200 } } }]   -  person JVK    schedule 02.11.2016
comment
и мой реальный скрипт выдает эту ошибку "reason": "failed to run inline script [if (doc['move_in_ts'] && doc['move_out_ts']) {return per_day_boost * ( [ doc['move_in_ts'], doc['move_out_ts'] ].transpose().find { av_start, av_out -> av_start <= desired_in_ts && av_out >= desired_out_ts }[0] - desired_in_ts).abs()/86400}; return 0;] using lang [groovy]", "caused_by": { "type": "null_pointer_exception", "reason": "Cannot invoke method getAt() on null object" } Я упростил свой вопрос в stackoverflow, чтобы получить работу первого уровня   -  person JVK    schedule 02.11.2016
comment
ох, это большой сценарий. Вы нашли что-нибудь в журналах ES?   -  person ChintanShah25    schedule 02.11.2016
comment
Давайте продолжим обсуждение в чате.   -  person ChintanShah25    schedule 02.11.2016


Ответы (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;}"
        }
      }
    }
  }
}
person ChintanShah25    schedule 02.11.2016