मैं एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो एलैस्टिकशर्च के लिए एक नया उपयोगकर्ता रिकॉर्ड अपरिवर्तित करेगा, यदि उपयोगकर्ता पहले से मौजूद है तो किसी भी जानकारी को अद्यतन कर रहा है, और यदि यह मौजूद है तो उपयोगकर्ता की भुगतान सरणी में एक नई 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
तत्वों के बाद अपडेट नहीं होता है क्योंकि दस्तावेज़ पहले से मौजूद नहीं है)।
https://discuss.elastic.co/t/append-to-existing-field/16423 –
क्या आप पूरे दस्तावेज़ को किसी शर्त के साथ अपडेट करने में सक्षम थे? i.e.g एक स्क्रिप्ट और एक डॉक्टर का एक साथ उपयोग करें? मुझे एक त्रुटि मिलती है कि स्क्रिप्ट और डॉक्टर का एक साथ उपयोग नहीं किया जा सकता है। – animageofmine