2014-05-08 8 views
10

के साथ लोचदार खोज मैपिंग कॉन्फ़िगर करें मेरे पास कुछ लोचदार क्षेत्र हैं जो मैं इंडेक्सिंग से पहले विश्लेषण नहीं करना चाहता हूं। मैंने पढ़ा है कि ऐसा करने का सही तरीका इंडेक्स मैपिंग को बदलकर है। अभी मेरी मानचित्रण इस तरह दिखता है:जावा एपीआई

{ 
    "test" : { 
    "general" : { 
     "properties" : { 
     "message" : { 
      "type" : "string" 
     }, 
     "source" : { 
      "type" : "string" 
     } 
     } 
    } 
    } 
} 

और मैं यह चाहते हैं इस तरह देखने के लिए:

{ 
    "test" : { 
    "general" : { 
     "properties" : { 
     "message" : { 
      "type" : "string", 
      "index" : "not_analyzed" 
     }, 
     "source" : { 
      "type" : "string" 
     } 
     } 
    } 
    } 
} 

मैं

client.admin().indices().prepareCreate("test") 
     .setSettings(getGrantSettings()); 

कहाँ getGrantSettings के माध्यम से सेटिंग में बदलाव करने की कोशिश कर दिया गया है() इस तरह दिखता है:

static Settings getGrantSettings(){ 
    JSONObject settingSource = new JSONObject(); 
    try{ 
     settingSource.put("mapping", new JSONObject() 
     .put("message", new JSONObject() 
      .put("type", "string") 
      .put("index", "not_analyzed") 
     )); 
    } catch (JSONException e){ 
     e.printStackTrace(); 
    } 


    Settings set = ImmutableSettings.settingsBuilder() 
      .loadFromSource(settingSource.toString()).build(); 
    return set; 
} 
+1

मुझे यहां कोई प्रश्न नहीं दिख रहा है। क्या आपको समस्याएं आ रही हैं? यदि ऐसा है तो किस तरह? –

उत्तर

19

मैं सफलतापूर्वक एक Elasticsearch सूचकांक निम्नलिखित की तरह जावा एपीआई का उपयोग करने के लिए मैपिंग आवेदन किया है:

XContentBuilder mapping = jsonBuilder() 
           .startObject() 
            .startObject("general") 
             .startObject("properties") 
              .startObject("message") 
               .field("type", "string") 
               .field("index", "not_analyzed") 
              .endObject() 
              .startObject("source") 
               .field("type","string") 
              .endObject() 
             .endObject() 
            .endObject() 
           .endObject(); 

    PutMappingResponse putMappingResponse = client.admin().indices() 
       .preparePutMapping("test") 
       .setType("general") 
       .setSource(mapping) 
       .execute().actionGet(); 

आशा इस मदद करता है।

+3

बस स्पष्ट करने के लिए: jsonBuilder() org.elasticsearch.common.xcontent.XContentFactory – padilo

+1

में एक स्थैतिक विधि है, यदि आपकी अनुक्रमणिका क्लाइंट.एडमिन() इंडेक्स() बनाते हैं, तो यह अनुक्रमणिका जोड़ें। (नया CreateIndexRequest (" indexname ")) actionGet()।; मैपिंग लागू करने से पहले अन्यथा indexMissingException फेंक दिया जाएगा – swaheed

9

भविष्य के पाठकों के लिए इसे जोड़ना। कृपया ध्यान दें कि आपको वास्तविक अनुक्रमणिका बनाने से पहले मैपिंग करने की आवश्यकता है या आपको अपवाद मिलेगा। निम्नलिखित कोड देखें।

client.admin().indices().create(new CreateIndexRequest("indexname")).actionGet(); 

PutMappingResponse putMappingResponse = client.admin().indices() 
    .preparePutMapping("indexname") 
    .setType("indextype") 
    .setSource(jsonBuilder().prettyPrint() 
       .startObject() 
        .startObject("indextype") 
         .startObject("properties") 
          .startObject("country").field("type", "string").field("index", "not_analyzed").endObject() 
         .endObject() 
        .endObject() 
       .endObject()) 
    .execute().actionGet(); 

IndexResponse response1 = client.prepareIndex("indexname", "indextype") 
    .setSource(buildIndex()) 
    .execute() 
    .actionGet(); 

// Now "Sri Lanka" considered to be a single country :) 
SearchResponse response = client.prepareSearch("indexname" 
    ).addAggregation(AggregationBuilders.terms("countryfacet").field("country")).setSize(30).execute().actionGet(); 
+0

बहुत धन्यवाद, मैं इस लाइन क्लाइंट.एडमिन() इंडेक्स() बनाये गये स्वीकृत उत्तर में दिए गए कोड का पालन करने के बाद इंडेक्समेसिंग अपवाद प्राप्त कर रहा था। (नया CreateIndexRequest ("indexname") बनाएँ। actionGet(); मेरी समस्या हल हो गई – swaheed

0

बस Definitive Guide ध्यान से पढ़ें:

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

स्रोत: https://www.elastic.co/guide/en/elasticsearch/guide/current/mapping-intro.html#updating-a-mapping

तो आप बस यह करने के लिए जब आप मैदान बनाने की है। Thats क्यों this answer से कोड बिना किसी समस्या के काम करता है।

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