2012-04-17 10 views
7

चलो कहते हैं कि मैं निम्नलिखित मानचित्रण के साथ एक ElasticSearch सूचकांक में एक tag प्रकार है, करते हैं:मैं ElasticSearch में एकाधिक आइटम कैसे अपडेट करूं?

{ 
    "tag": { 
     "properties": { 
      "tag": {"type": "string", "store": "yes"}, 
      "aliases": {"type": "string"} 
     } 
    } 
} 

प्रत्येक प्रविष्टि एक टैग, और कहा कि टैग के उपनाम की एक सरणी है। यहाँ एक उदाहरण आइटम है:

{ 
    "word": "weak", 
    "aliases": ["anemic", "anaemic", "faint", "flimsy"] 
} 

समय-समय पर, मैं उनके उपनाम के साथ नए टैग शब्द जोड़ सकते हैं और मौजूदा टैग शब्द के लिए नए उपनाम जोड़ना चाहते हैं।

उनके उपनाम के साथ नए टैग शब्द जोड़ना आसान है, यह सिर्फ एक नया दस्तावेज है। हालांकि, मैं मौजूदा टैग शब्दों में नए उपनाम कैसे जोड़ सकता हूं?

मुझे पता है कि मैं सिर्फ टैग शब्द की खोज कर सकता हूं, अपना दस्तावेज़ प्राप्त कर सकता हूं, यह देखने के लिए खोज सकता हूं कि उपनाम एलियस की सरणी में पहले से मौजूद है या नहीं, अगर इसे जोड़ने से नहीं है। हालांकि - यह एक अच्छा समाधान की तरह नहीं लगता है।

वहाँ एक बहु-अपडेट करने के लिए एक तरीका है?

उत्तर

7

अंतर्निहित elasticsearch भंडारण, Lucene, एक अद्यतन आपरेशन नहीं है। इसलिए, रिकॉर्ड को ढूंढकर, पुराने संस्करण को हटाने और नया संस्करण जोड़ने के द्वारा सभी अपडेट किए जाते हैं। लोचदार खोज में, आप Update API का उपयोग करके क्लाइंट को सभी तरह से रिकॉर्ड चलने पर थोड़ा सा बचा सकते हैं। हालांकि इसे रिकॉर्ड खोजने की आवश्यकता होगी। आप शायद, Update by query चाहते हैं, लेकिन दुर्भाग्य से, यह अभी तक लागू नहीं हुआ है।

+1

क्वेरी द्वारा अद्यतन अभी भी लोचदार में जोड़ा नहीं गया है, लेकिन एक [प्लगइन] (https://github.com/yakaz/elasticsearch-action-updatebyquery/) मौजूद है। –

+1

Elasticsearch 2.3 के रूप में, अद्यतन-दर-क्वेरी उपलब्ध है - https://www.elastic.co/guide/en/elasticsearch/reference/2.3/docs-update-by-query.html – PhaedrusTheGreek

2

लचीला खोज एक Update API है। उस एपीआई के साथ आप निम्न कार्य कर सकते हैं:

curl -XPOST 'localhost:9200/test/tag/weak/_update' -d '{ 
    "script" : "ctx._source.aliases += faint" 
}' 
+0

हाय एरिक, यह है एक दस्तावेज़ अद्यतन सही है? –

+0

क्या आप कृपया मुझे बता सकते हैं कि मैं PHP में एक रिकॉर्ड को कैसे कार्यान्वित कर सकता हूं? –

0

यदि आप एक ही आईडी के साथ समान मान जोड़ते हैं, तो यह स्वचालित रूप से पुराने डेटा को अपडेट कर देगा।

6

_bulk का उपयोग कर इस प्रयास करें:

http://127.0.0.1:9200/myindex/type/_bulk 
{ 
"update": { 
    "_index": "myindex", 
    "_type": "type", 
    "_id": "myid" 
} 
}{ 
"doc": { 
    "field": "new value" 
} 
}{ 
"update": { 
    "_index": "myindex", 
    "_type": "type", 
    "_id": "id" 
} 
}{ 
"doc": { 
    "field": "new value" 
} 
} 
0

Elasticsearch के थोक एपीआई के साथ-साथ अद्यतन अनुरोधों के लिए इस्तेमाल किया जा सकता, कम से कम जावा ग्राहक के लिए।

List list = new Arraylist(); 
list.add("hello"); 
BulkProcessor bulk = new BulkProcessor(); 
UpdateRequest update = new UpdateRequest("index", "type", "id1"); 
update.script("ctx._source.aliases+= newaliases"); //dynamic script 
update.addScriptParam("newaliases", list); 
bulk.add(update); 

ध्यान दें कि लोचदार स्क्रिप्टिंग elasticsearch के नए संस्करणों में अक्षम है। या तो इस सुविधा का उपयोग करने के लिए सक्षम या पूर्व संकलित स्क्रिप्ट का उपयोग करें।

0

आप निम्न कोड का उपयोग कर वसंत जावा क्लाइंट का उपयोग कर ऐसा कर सकते हैं। कोड में उपयोग की जाने वाली निर्भरता निम्नलिखित हैं।

import org.elasticsearch.action.update.UpdateRequest; 

import org.elasticsearch.index.query.QueryBuilder; 

import org.springframework.data.elasticsearch.core.query.UpdateQuery; 

import org.springframework.data.elasticsearch.core.query.UpdateQueryBuilder; 

private UpdateQuery updateExistingDocument(String Id) { 
    // Add updatedDateTime, CreatedDateTime, CreateBy, UpdatedBy field in existing documents in Elastic Search Engine 
    UpdateRequest updateRequest = new UpdateRequest().doc("UpdatedDateTime", new Date(), "CreatedDateTime", new Date(), "CreatedBy", "admin", "UpdatedBy", "admin"); 

    // Create updateQuery 
    UpdateQuery updateQuery = new UpdateQueryBuilder().withId(Id).withClass(ElasticSearchDocument.class).build(); 
    updateQuery.setUpdateRequest(updateRequest); 

    // Execute update 
    elasticsearchTemplate.update(updateQuery); 
} 
2

यह मेरे लिए काम करता है।

input_list.dat:

{ "index" : { "_index": "my_index", "_type": "my_type", "_id": "existing-value" } } 

{ "Field_to_update": "New_Value" } 

{ "index" : { "_index": "my_index", "_type": "my_type", "_id": "existing_value" } } 

{ "Field_to_update": "New_Value" } 

कमान:

curl -k -XPOST 'https://my_host:9200/my_url/_bulk' --data-binary "@input_list.dat"; echo 
+0

धन्यवाद, मेरे लिए काम करता है! लोचदार खोज 5.4 का उपयोग करना –

1

Elasticsearch 2.3.0 लंबे समय से प्रतीक्षा Reindex API के हिस्से के रूप में पेश किया Update By Query API

POST /myindex/mytype/_update_by_query 
{ 
    "script": { 
    "inline": "ctx._source.remove(\"remove\")" 
    }, 
    "query": { 
    "exists": { 
     "field": "remove" 
    } 
    } 
} 

ऊपर के उदाहरण इनलाइन पटकथा का उपयोग करता है, तो script.inline: on साथ elasticsearch.yml में यह सक्षम करने के लिए सुनिश्चित हो:

उदाहरण के लिए, आप निम्न तरीके से यदि वह मौजूद है एक निश्चित क्षेत्र से हटाने के लिए सभी दस्तावेजों को अपडेट कर सकता है।

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