2013-08-03 2 views
23

मैं एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो एलैस्टिकशर्च के लिए एक नया उपयोगकर्ता रिकॉर्ड अपरिवर्तित करेगा, यदि उपयोगकर्ता पहले से मौजूद है तो किसी भी जानकारी को अद्यतन कर रहा है, और यदि यह मौजूद है तो उपयोगकर्ता की भुगतान सरणी में एक नई PaymentInfo ऑब्जेक्ट जोड़ना अद्यतन वस्तु में। यहाँ मैं अब तक के साथ काम कर रहा हूँ की एक सरलीकृत संस्करण है:Elasticsearch upserting और सरणी में जोड़ने के लिए

curl -XPOST 'http://localhost:9200/usrtest/usr/1/_update' -d ' 
{ 
    "doc_as_upsert": true, 
    "doc": { 
     "customerId": "1", 
     "firstName": "Mark", 
     "lastName": "Z", 
     "emailAddress": "[email protected]", 
     "paymentInfo": { 
      "pid": "1", 
      "amt": "10" 
     } 
    } 
}' 

यह लगभग कि मैं क्या चाहता हूँ कि यह दस्तावेज़ ठीक से सम्मिलित करता है, या दस्तावेज़ को अद्यतन करता है एक उपयोगकर्ता एक ही आईडी से मौजूद है, लेकिन यह है करता है इस भुगतान को जोड़ने के लिए पहलू को याद करना उपयोगकर्ता के भुगतान में इन्फॉर्फ़ इन्फोस सरणी यदि उपयोगकर्ता पहले से मौजूद है। चूंकि यह अभी है, यह सिर्फ PaymentInfo ऑब्जेक्ट को ओवरराइड करता है। मैं अद्यतन JSON को यह स्क्रिप्ट डाल दिया है की कोशिश की:

"script": "if (ctx._source.containsKey(\"paymentInfos\")) {ctx._source.paymentInfos += paymentInfo;} else {ctx._source.paymentInfos = paymentInfo}" 

लेकिन जब script तत्व निर्दिष्ट किया जाता है elasticsearch doc तत्वों पर ध्यान नहीं देता।

मुझे लगता है कि मुझे कुछ मूर्खतापूर्ण याद आ रही है, लेकिन मुझे यकीन नहीं है। क्या कोई यहां मेरी मदद कर सकता है?

संपादित करें: मैं भी निम्नलिखित की कोशिश की है:

curl -XPOST 'http://localhost:9200/usrtest/usr/1/_update' -d ' 
{  
    "script": "if (ctx._source.containsKey(\"paymentInfos\")) {ctx._source.paymentInfos += paymentInfo;} else {ctx._source.paymentInfos = paymentInfo}", 
    "upsert": { 
     "customerId": "1", 
     "firstName": "Mark", 
     "lastName": "Z", 
     "emailAddress": "[email protected]", 
     "paymentInfo": { 
      "pid": "1", 
      "amt": "10" 
     } 
    }, 
    "params": { 
     "paymentInfo": { 
      "pid": "1", 
       "amt": "10" 
     } 
    } 
}' 

कौन सा भी लगभग पड़ता कि मैं इसे करना चाहते हैं, जबकि इसमें paymentInfo वस्तुओं संलग्न कर देता है जब मैं स्क्रिप्ट कई चलाने कई बार, लेकिन अन्यथा यह दस्तावेज़ को स्वयं अपडेट नहीं करता है (यानी यदि मैं फिर से स्क्रिप्ट चलाता हूं, तो मार्क टू मिंडी को बदलता हूं, यह upsert तत्वों के बाद अपडेट नहीं होता है क्योंकि दस्तावेज़ पहले से मौजूद नहीं है)।

+0

https://discuss.elastic.co/t/append-to-existing-field/16423 –

+0

क्या आप पूरे दस्तावेज़ को किसी शर्त के साथ अपडेट करने में सक्षम थे? i.e.g एक स्क्रिप्ट और एक डॉक्टर का एक साथ उपयोग करें? मुझे एक त्रुटि मिलती है कि स्क्रिप्ट और डॉक्टर का एक साथ उपयोग नहीं किया जा सकता है। – animageofmine

उत्तर

24

आप स्क्रिप्ट के सम्मिलित भाग में कुछ सरणी ब्रैकेट जोड़ना चाहेंगे।

"script": "if (ctx._source.containsKey(\"paymentInfos\")) {ctx._source.paymentInfos += paymentInfo;} else {ctx._source.paymentInfos = [paymentInfo]}" 

पहले भाग में 'paymentInfos' संपत्ति, एक वस्तु के रूप में परिभाषित किया गया है, ताकि आप भी नीचे गिर के कारण हो सकता है कर रहा है।

+2

क्या यह उत्तर मान्य है? यदि ऐसा है तो @ सेवेंथ हेलिक्स कृपया इसे वोट दें। – JohnnyM

+1

यह मेरे लिए ठीक काम करता है – Leabdalla

+0

ग्रोवी के साथ कोई भी ऐसा ही करेगा? – cwarny

संबंधित मुद्दे