2017-07-03 59 views
0

我在使用日期範圍時遇到了問題。我有下面的代碼片段:elasticsearch上的日期範圍返回太多結果

const ISO8601_FROM = 'Y-m-d\TH:i:s+1200'; 
const ISO8601_TO = 'Y-m-d\TH:i:s-1200'; 

$dateRange = new RangeBuilder(); 
if ($this->filterDateFrom instanceof \DateTime) { 
    $dateRange->from($this->filterDateFrom 
     ->setTime(0, 0, 0) 
     ->format(self::ISO8601_FROM) 
    ); 
} 
if ($this->filterDateTo instanceof \DateTime) { 
    $dateRange->to($this->filterDateTo 
     ->setTime(23, 59, 59) 
     ->format(self::ISO8601_TO) 
    ); 
} 
if ($dateRange->isValid()) { 
    $boolQuery->addMust(new Range('dateCreate', $dateRange->buildRange())); 
} 

JSON字符串我RangeBuilder將返回是的一部分:

"range" : { 
    "dateCreate" : { 
     "gte" : "2000-01-01T00:00:00+1200", 
     "lte" : "2000-01-01T23:59:59-1200" 
    } 
} 

正如你可以看到我想從1月1日的結果。
我現在的問題是我也獲得了1月2日的文檔。

因爲_mapping有點廣泛,我將只發布塊的開始:

{"myindex":{"mappings":{"tdo":{"properties":{"author":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"client":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"content":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"dateCreate":{"type":"date"},"documents":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"id":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},... 
+0

'dateCreate'字段的類型是什麼?請在您的索引映射中檢查它。 – Roopendra

+0

它是「日期」類型。 – altralaser

+0

好的,您是否使用[官方文檔](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html)中給出的日期格式嘗試過? – Roopendra

回答

0

好像你不查詢和索引映射使用相同的時區。

發佈您的映射信息和其中一個響應的命中你不想得到可能幫助更多。

+0

您的每個文檔在「dateCreate」字段中都有「+1200」。 (順便說一下,我猜部分''lte「:」2000-01-01T23:59:59-1200「'有一個手寫錯誤) – fmyblack

+0

嗯,你的權利。看起來不是每個文檔都有+1200偏移量。無論如何,是否有可能獲得這些文件? – altralaser

+0

你可以使用腳本查詢,就像'doc ['dateCreate'] .length()<24'。 – fmyblack