2017-10-14 5 views
0

私はElasticsearch 5.2から出てくる奇妙な動作を観察していますが、エラーは発生していないし、オンラインでも同様の問題を見つけることはできません。JSON配列の文字列elasticsearchを保存していますBug

JSON配列をelasticsearch(Pythonのjson.dumps()を使用)に「文字列」として格納しています。これは短いので、私はこのようにしなければなりません。しかし、DSLクエリを実行すると、1つのオブジェクトを含むJSON配列(単数の文字列として格納されているもの)のみが表示されます。 1より大きい場合、空のバケット0のオブジェクトだけが返されます。私はそれらを「メタデータ」と呼ばれるフィールドに保存しています。

なぜデータのサブセットのみが表示され、他のデータ(json配列内に1つ以上のオブジェクトがある)が無視されるのは非常に混乱しています。データは文字列としてエンコードされます。私はインデックスに格納されたデータを知っています。私はキバナの "発見"でそれを見ることができます - 私は大きなJSON文字列を複数のオブジェクトで見ることができます。

例1(JSON文字列/ 1物体w):

[{ "スコア":0.8829717636108398、 "高さ":0.875460147857666、 "幅": 0.3455989360809326、 "Y":0.08105117082595825、「X ":0.5616265535354614、 "メモ": "BOX1"}]

例2:

[{" スコア」:0.8829717636108398、 "高さ":0.875460147857666、 "幅": {"スコア":0.6821991136108398、 "高さ": 、0.875460147857666、 "幅":0.3455989360809326、 "y":0.08105117082595825、 "y":0.08105117082595825、 "x":0.5616265535354614、 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つのオブジェクトと文字列を返します。下記参照:観察されたように、1つのオブジェクトとJSON文字列を持つデータのみ(すなわち、[{..}])/可視戻される

{ 
    "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 
     }, 
... 
} 

。複数のオブジェクト([{...}、{...}])を含む文字列を完全に無視しています。

より明確化:これはデフォルトのマッピングを使用しています

  • 文書IDで照会、またはで「マッチ」を使用しているとき、私は(関係なく、オブジェクトの数の) をJSON文字列を取得することができています
  • 正確なフィールド値)
+1

私はいくつかの質問をしたいと思います。まず、マッピングを提供してもよろしいですか?次に、JSON配列をドキュメントIDで取得できますか?第3に、あなたが提供した集計のバケツの1つとして、そのような文書(例2のようなもの)を取得したいと思うのは間違いありませんか?ありがとう。 –

+1

キーワードフィールドには「ignore_above」:256が適用されていると思います。そのため、JSON配列内に2つ以上のオブジェクトがあるフィールドがインデックスに登録されないのはなぜですか。 – Val

+0

1)私はデフォルトマッピングを使用しています。したがって、「メタデータ」(分析済み)と「metadata.keyword」(分析されずに集計可能)の2つのフィールドがあります。 2)はい、データは文字列形式で保存されています。上記の例のように。集計されたクエリを実行した場合にのみ、それは中断されます。 3)バケットは完全に空です(私は他のクエリを試みました。バケットは "[]"です)。 –

答えて

2

デフォルトのマッピングを使用している場合はキーワードのマッピングがignore_above: 256の設定があり、このようになりますので、これはおそらくです:

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

JSON文字列のインデックスを256文字より長くするために、この制限を増やすことができます。

関連する問題