2017-02-12 4 views
0

Javaアプリケーションでは、JSON文書をElasticSearchに保存する必要があります。私はESで文書の重複を避けたいので、JSONオブジェクト/文字列に基づいて何らかのid(キー)を計算し、ESでインデックスを作成するときにこの文書のIDとして使用します。残念ながら、私はこのJSONの内部に自然なキーの候補を持っていないので、このキー生成のためのJSONオブジェクト/文字列全体を考慮する必要があります。Elasticsearch用のJSON文書にid(キー)を作成する

これは、JSON文書の例である:

{ 
    "filterQueries":[ 
     { 
     "type":"LessOrEqualQuery", 
     "characteristicId":630, 
     "value":799621200000, 
     "operator":"<=" 
     } 
    ], 
    "sortCriteriaIds":[ 
     566, 
     572 
    ], 
    "sortWeightCriteriaDirection":"DESC", 
    "sortTotalVotesCriteriaDirection":null, 
    "sortCriteriaCoefficients":{ 
     "572":20.0 
    }, 
    "sortCharacteristicId":631, 
    "sortCharacteristicDirection":"DESC", 
    "sortDecisionPropertyName":"createDate", 
    "sortDecisionPropertyDirection":"DESC", 
    "excludeChildDecisionIds":null, 
    "includeChildDecisionIds":null, 
    "pageNumber":0, 
    "pageSize":100 
} 

JavaでJSONオブジェクト/文字列に基づいて、このキーを計算するための最良の方法は何ですか?パフォーマンスは私にとって非常に重要な基準です。

+0

JSONは同じになりますが、プロパティキーの順序は、非一貫性があり、結果のキーが同じである必要がありますか? – laser

+0

理想的ですが、必須ではありません。私は自分で注文を維持しようとします – alexanoid

+1

あなたは単純に文字列化してからsha256(文字列)できますか?またはより小さいサイズのハッシュ...ハッシュサイズに応じて、衝突の確率は異なります。 – laser

答えて

1

速度が非常に懸念される場合。 XOR演算を使用することができます(任意のサイズに対してほぼCRC32)。

擬似コード:

input_string = Stringify(json) 
result = 0; 
for(each chunk of size K from input_string){ 
    result = result XOR chunk; 
} 
return result 
+0

私はcrc32は、感謝のために働くべきだと思う! \t 'public static long crc32(文字列入力){ \t \tバイト[] bytes = input.getBytes(); \t \tチェックサムチェックサム=新しいCRC32(); \t \t checksum.update(bytes、0、bytes.length); \t \t戻り値checksum.getValue(); \t} ' – alexanoid

関連する問題