2014-12-31 1 views
0

У меня возникают проблемы с попыткой получить запрос, работающий с функцией «сейчас». Мой текущий запрос выглядит примерно так:Elasticsearch теперь работает с проблемами

{ 
    "query": { 
     "bool" : { 
      "must" : [ 
       { "match": { "originCountry" : "GB" }}, 
       { "match": { "destinationCity" : "MIL" }} 
      ] 
     } 
    }, 
    "filter" : { 
     "and": { 
      "filters": [ 
       { 
        "exists": {"field": "dateBack"} 
       } , 
       { 
        "script" : {"script" : "doc['originRegion'].value == doc['destinationRegion'].value"} 
       }, 
       { 
       "range": { 
        "dateOut": { 
         "gte": "now" 
        } 
       } 
       } 
      ] 
     } 
    } 
} 

Это не возвращает никаких результатов. Однако, если я изменю раздел диапазона на строку, например:

"range": { 
    "dateOut": { 
      "gte": "20150101" 
     } 
} 

Работает отлично. В моем сопоставлении индексов все поля даты используют формат «basic_date» (YYYYMMDD)

Может ли это создать любые проблемы для функции now? Кто-нибудь знает, как работает функция now? Преобразует ли «дату» в любой формат даты, с которым сравнивается поле? Я не смог найти полезную документацию об этом. Благодаря

+0

вы работаете «больше или равно», чем сейчас? как вы планируете получить что-то в будущем, если еще не проиндексированы? – eliasah

ответ

1

Проверьте вашу отображение даты - она ​​должна быть YYYYMMdd вместо YYYYMMDD

Когда я настроить отображение:

curl -XPOST http://localhost:9200/index/testnow/_mapping -d ' 
{"testnow": { 
    "properties": { 
     "dateOut": {"type": "date","format" : "YYYYMMdd"}, 
     "dateBack": {"type": "date","format" : "YYYYMMdd"} 
    }}}' 

и пост в нескольких Документах

curl -XPOST http://localhost:9200/index/testnow/ -d ' 
{ 
    "originCountry": "GB", 
    "destinationCity": "MIL", 
    "dateBack" : "20140212", 
    "originRegion" : "X", 
    "destinationRegion" : "X", 
    "dateOut" : "20140201" 
}' 

curl -XPOST http://localhost:9200/index/testnow/ -d ' 
{ 
    "originCountry": "GB", 
    "destinationCity": "MIL", 
    "dateBack" : "20150212", 
    "originRegion" : "X", 
    "destinationRegion" : "X", 
    "dateOut" : "20150201" 
}' 

и запустите запрос:

curl -XGET http://localhost:9200/index/testnow/_search -d ' 
{ 
    "query" : { 
    "filtered" : { 
    "query": { 
     "bool" : { 
      "must" : [ 
       { "match": { "originCountry" : "GB" }}, 
       { "match": { "destinationCity" : "MIL" }} 
      ] 
     } 
    }, 
    "filter" : { 
     "and" : [ 
      {"exists": {"field": "dateBack"}}, 
      {"script" : {"script" : "doc[\"originRegion\"].value == doc[\"destinationRegion\"].value"}}, 
      {"range": {"dateOut": {"gte": "now"}}} 
      ]} }}}' 

я вернусь один документ, как и ожидалось:

{ 
    "took" : 11, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 1, 
    "max_score" : 1.4142135, 
    "hits" : [ { 
     "_index" : "index", 
     "_type" : "testnow", 
     "_id" : "AUqgq8u4aqAGLvfmRnfz", 
     "_score" : 1.4142135, 
     "_source": 
{ 
    "originCountry": "GB", 
    "destinationCity": "MIL", 
    "dateBack" : "20150212", 
    "originRegion" : "X", 
    "destinationRegion" : "X", 
    "dateOut" : "20150201" 
} 
    } ] 
    } 
} 
+1

Большое спасибо Олли. Извините, полностью моя вина, я доверял, что все поля даты были правильно настроены, но, к сожалению, dateOut не был, он был фактически настроен как строка, поэтому «сейчас» не работает. Я воссоздал сопоставления, и теперь все работает нормально. Извините за беспокойство – jdiaz4517

Смежные вопросы