2014-10-28 20 views
0

空值的問題這是我的數據的例子:在Elasticsearch

{ 
    "MOD_DATE_START": "2010-04-20T15:05:49Z", 
    "MOD_DATE_END": null, 
    "MOD_ID": "123456789", 
} 

我有我的Elasticsearch查詢的一些問題。我有幾個日期字段,我正在做一個基於範圍的過濾,以確保我的日期在開始日期和結束日期之間。

我的第一個查詢(效果很好)是過濾的:

curl -s -XPOST http://server:9200/myindex/mytype/_search?pretty=true -d ' 
{ 
    "fields": ["MOD_ID", "MOD_DATE_START", "MOD_DATE_END"], 
    "query": { 
     "bool": { 
      "must": [ 
       {"term": {"MOD_ID": "123456789"}}, 
       {"range": {"MOD_DATE_START": {"lte": "2012-04-20T15:05:49Z"}}} 
      ] 
     } 
    } 
} 
' 

的MOD_DATE_START字段總是包含的信息,所以第一個查詢效果很好。

由於第二日期字段,MOD_DATE_END,是空在大多數情況下,我想修改我的查詢也添加了以下測試:

IF "MOD_DATE_END" NOT NULL then 
    {"range": {"MOD_DATE_END": {"gte": "2012-04-20T15:05:49Z"}}} 
ELSE skip "MOD_DATE_END" 

我,不過,不太能弄清楚如何修改我的查詢以添加第三個條件,以便能夠成功執行gte測試。

在此先感謝您的幫助。

回答

2

實現此目的的一種方法是在filtered query中使用missing filter。 示例如下:

curl -s -XPOST http://server:9200/myindex/mytype/_search?pretty=true -d ' 
    { 
     "fields": ["MOD_ID", "MOD_DATE_START", "MOD_DATE_END"], 
     "query": { 
      "filtered": { 
      "filter": { 
       "bool": { 
        "must": { 
         "range": { 
         "MOD_DATE_START": { 
          "lte": "2012-04-20T15:05:49Z" 
         } 
         } 
        }, 
        "should": [ 
         { 
         "missing": { 
          "field": "MOD_DATE_END", 
          "null_value": true, 
          "existence": true 
         } 
         }, 
         { 
         "range": { 
          "MOD_DATE_START": { 
           "gte": "2012-04-20T15:05:49Z" 
          } 
         } 
         } 
        ] 
       } 
      }, 
      "query": { 
       "term": { 
        "MOD_ID": "123456789" 
       } 
      } 
      } 
     } 
    } 

' 
+0

非常感謝。查詢看起來不錯。當我再次訪問服務器並且隨後恢復時,將在明天進行測試。 – Soucrit 2014-10-28 18:34:38

+0

我還發現了Elasticsearch腳本,它允許我使用這樣的函數: (mytype ['MOD_DATE_END']。empty?0:mytype ['MOD_DATE_END'] .value) – Soucrit 2014-10-28 18:35:26

+0

@Soucrit是好的,儘管腳本過濾器是通常比內置的更慢。 – keety 2014-10-28 19:10:33