2016-12-14 8 views
0

ノード環境でelasticsearchを使用しています。elasticsearch複数のフィールドを持つapi upsertが一致する

client.update({ 
    index: 'loreal', 
    type: 'reviews', 
    id: reviewID, 
    body: { 
     script: { 
      inline: "ctx._source.comments.add(params.comment)", 
      lang: "painless", 
      params: { 
       comment: { 
        tuple: { 
         reviewee: data.reviewee, 
         reviewer: data.reviewer 
        }, 
        nb: data.nb, 
        type: data.type 
       } 
      } 
     } 
    } 
}) 

しかし、同じ「reviewee」、「投稿者」AND「論理」とのコメントがすでに私が存在する場合:私は、次のコードを使用して、コメントを追加

"_source": { 
    "repo_id": "ecom-test", 
    "pr_id": "1", 
    "pr_status": "approved", 
    "date_created": "2016-12-14T12:55:50.317Z", 
    "date_modified": "2016-12-14T12:55:50.317Z", 
    "comments": [ 
     { 
     "tuple": { 
      "reviewee": "Max", 
      "reviewer": "Vic" 
     }, 
     "nb": "1", 
     "type": "typo" 
     }, 
     { 
     "tuple": { 
      "reviewee": "Antoine", 
      "reviewer": "Vic" 
     }, 
     "nb": "2", 
     "type": "logic" 
     } 
    ] 
} 

: は、これが私のデータモデルです"comments"配列に新しい項目を作成する代わりに "nb"属性を更新したいと考えています。

私は私が最初に検索を行うだろうと思ったが、私はこれらの3つの値を持つ配列「コメント」のいずれかの要素にマッチする検索を行うための方法を見つけることができません。私は本当にあなたたちはこれで私の手を与えることができることを望む

、それは私が= Sを探しています長い時間がかかりました。

ドキュメントの構造体を考えると、事前

答えて

0

のおかげで、私はネストされたオブジェクトのようにコメントフィールドを定義しているだろう:あなたのユースケースにかなり近いドキュメントの例を参照してくださいことを考えるとhttps://www.elastic.co/guide/en/elasticsearch/guide/current/nested-objects.html#nested-objects

paramにrevieweeの値が入っていれば、ネストされたクエリとboolクエリの組み合わせを使用します。 https://www.elastic.co/guide/en/elasticsearch/guide/2.x/nested-query.html

ここ
{ 
"query": { 
    "nested": { 
     "path": "comments", 
     "query": { 
      "bool": { 
       "must": [{ 
        "match": { 
         "comments.tuple.reviewee": "your reviewee" 
        } 
       }, { 
        "match": { 
         "comments.tuple.reviewer": "your reviewee" 
        } 
       }, { 
        "term": { 
         "comments.type": "logic" 
        } 
       }] 
      } 
     } 
    } 
} 

私が書いたテスト:あなたの答えのための

PUT test 
{ 
    "mappings": { 
    "item": { 
     "properties": { 
     "comments": { 
      "type": "nested" 
     } 
     } 
    } 
    } 
} 





POST test/item 
{ "comments": [ 
     { 
     "tuple": { 
      "reviewee": "Max", 
      "reviewer": "Max" 
     }, 
     "nb": "1", 
     "type": "logic" 
     }, 
     { 
     "tuple": { 
      "reviewee": "Antoine", 
      "reviewer": "Vic" 
     }, 
     "nb": "2", 
     "type": "logic" 
     } 
    ] 
} 

POST test/item 
{ 
    "comments": [ 
     { 
     "tuple": { 
      "reviewee": "Max", 
      "reviewer": "Max" 
     }, 
     "nb": "1", 
     "type": "test" 
     }, 
     { 
     "tuple": { 
      "reviewee": "Antoine", 
      "reviewer": "Vic" 
     }, 
     "nb": "2", 
     "type": "logic" 
     } 
    ] 
} 

POST test/item 
{ 
    "comments": [ 
     { 
     "tuple": { 
      "reviewee": "Max", 
      "reviewer": "Mac" 
     }, 
     "nb": "1", 
     "type": "logic" 
     }, 
     { 
     "tuple": { 
      "reviewee": "Antoine", 
      "reviewer": "Vic" 
     }, 
     "nb": "2", 
     "type": "logic" 
     } 
    ] 
} 

GET /test/item/_search 
{ 
"query": { 
    "nested": { 
     "path": "comments", 
     "query": { 
      "bool": { 
       "must": [{ 
        "match": { 
         "comments.tuple.reviewee": "Max" 
        } 
       }, { 
        "match": { 
         "comments.tuple.reviewer": "Max" 
        } 
       }, { 
        "term": { 
         "comments.type": "logic" 
        } 
       }] 
      } 
     } 
    } 
}} 
+0

おかげで多くのことを。残念ながら、それは私が探していたものではありませんでしたが、それは別の問題で私を助けました。私はついに前のものを更新するのではなく、新しい文書を作成することにしました。このように私は更新を複雑にする必要はなく、私は文書の履歴を保持することができます。 – Mexos

関連する問題