2017-10-14 123 views
0

我正在觀察Elasticsearch 5.2中出現的一些奇怪行爲,並且不可能調試 - 因爲沒有發生錯誤,我能否在網上找到類似的問題/文檔。我使用python的json.dumps())存儲一個JSON數組作爲一個「字符串」 - 長話短說,我必須這樣做。但是,當我執行DSL查詢時,僅顯示包含1個對象的JSON數組(存儲爲單數字符串)。如果超過1,那麼它只是返回一個空桶0對象。我將它們存儲在一個名爲「元數據」的字段中。存儲JSON數組字符串elasticsearch Bug

我很困惑爲什麼只顯示數據的一個子集,而其他數據(在json數組中有超過1個對象)被忽略。數據被編碼爲字符串。我知道存儲在索引中的數據。我可以在kibana「發現」中看到它 - 因爲我可以看到帶有多個對象的大型JSON字符串。

實施例1(JSON字符串瓦特/ 1對象):

[{ 「分數」:0.8829717636108398, 「高度」:0.875460147857666, 「寬度」: 0.3455989360809326, 「Y」:0.08105117082595825中,「x 「:0.5616265535354614 」注意「: 」BOX1「}]

實施例2:

[{」 得分「:0.8829717636108398, 」高度「:0.875460147857666, 」寬度「: y「:0.08105117082595825,」x「:0.5616265535354614,」note「:」box1「},{」score「:0.6821991136108398,」height「: 0.875460147857666,」width「 X「:0.5616265535354614, 」注意「: 」BOX2「}]

這裏是我的查詢:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "query_string": { 
      "analyze_wildcard": true, 
      "query": "*" 
      } 
     }, 
     { 
      "range": { 
      "created_at": { 
       "gte": 1508012482796, 
       "lte": 1508014282797, 
       "format": "epoch_millis" 
      } 
      } 
     } 
     ], 
     "must_not": [] 
    } 
    }, 
    "size": 0, 
    "_source": { 
    "excludes": [] 
    }, 
    "aggs": { 
    "5": { 
     "terms": { 
     "field": "metadata.keyword", 
     "size": 31, 
     "order": { 
      "_count": "desc" 
     } 
     } 
    } 
    } 
} 

此查詢只返回一個字符串1個對象。見下文:

{ 
    "took": 4, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 4214, 
    "max_score": 0, 
    "hits": [] 
    }, 
    "aggregations": { 
    "5": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 35, 
     "buckets": [ 
     { 
      "key": "[]", 
      "doc_count": 102 
     }, 
     { 
      "key": "{}", 
      "doc_count": 8 
     }, 
     { 
      "key": "[{\"score\": 0.9015679955482483, \"height\": 0.8632315695285797, \"width\": 0.343660831451416, \"y\": 0.08102986216545105, \"x\": 0.5559845566749573, \"note\": \"box11\"}]", 
      "doc_count": 6 
     }, 
     { 
      "key": "[{\"score\": 0.6365205645561218, \"height\": 0.9410756528377533, \"width\": 0.97696852684021, \"y\": 0.04701271653175354, \"x\": 0.013666868209838867, \"note\": \"box17\"}]", 
      "doc_count": 4 
     }, 
... 
} 

如觀察到的,僅僅用1個對象JSON字符串數據(即[{..}])返回/可見光。它完全忽略了具有多個對象的字符串(即[{...},{...}])。

進一步澄清:

  • 它使用默認映射
  • 我能夠得到JSON字符串(不管對象的數量) 當文檔ID查詢,或使用「匹配」的確切的字段值)
+1

我想問幾個問題。首先,請您提供您的地圖?其次,你是否能夠通過文檔ID檢索這樣的JSON數組?第三,如果你想得到這樣的文件(如例2)作爲你提供的聚合中的一個桶,那麼我做對了嗎?謝謝。 –

+1

我認爲關鍵字字段也有''ignore_above':256'應用於它,因此JSON數組中有兩個或更多對象的字段沒有被索引。 – Val

+0

1)我使用默認映射。因此,它有兩個字段「元數據」(分析)和「metadata.keyword」(未分析,但可聚合)。 2)是的,我看到以字符串格式存儲的數據。像上面提供的例子一樣。只有當我執行聚合查詢時,它纔會中斷。 3)的確,桶完全是空的(我試過其他查詢,桶是「[]」)。 –

回答

2

如果您使用的是默認的映射,這是最有可能是因爲您的關鍵字映射具有一個ignore_above: 256設置,如下所示:

{ 
    "mappings": { 
    "my_type": { 
     "properties": { 
     "metadata": { 
      "type": "keyword", 
      "ignore_above": 256 
     } 
     } 
    } 
    } 
} 

您可以增加該限制,以便索引長於256個字符的JSON字符串。