2015-03-29 28 views
6

Sorun:Elasticsearch Java API addMapping() ve setSettings() kullanımı

json dosyasını kullanarak bir json dosyasından bir dizin nasıl oluşturulur endeksi de_brochures için bir tanım içeriyor. Ayrıca, ilgili indeks tarafından kullanılan özel filtrelerle bir analizör de_analyzer'u tanımlar. Json, curl ve Sense ile çalıştığı için, sözdizimini java API'siyle çalışacak şekilde uyarlamalıyım.

Json bir dosyadan geldiği için XContentFactory.jsonBuilder() kullanmak istemiyorum! Bu bir dizin oluşturmak gelmez indexname/PUT ile Sense kullanma

:

Ben benim eşleme oluşturmak ve ayarlarını yapmak için aşağıdaki json dosyası var.

------ Mapping json ------ 
{ 
    "de_brochures": { 
    "properties": { 
     "text": { 
     "type": "string", 
     "store": true, 
     "index_analyzer": "de_analyzer" 
     }, 
     "classification": { 
     "type": "string", 
     "index": "not_analyzed" 
     }, 
     "language": { 
     "type": "string", 
     "index": "not_analyzed" 
     } 
    } 
    } 
} 
------- Settings json -------- 
{ 
    "analysis": { 
    "filter": { 
     "de_stopwords": { 
     "type": "stop", 
     "stopwords": "_german_" 
     }, 
     "de_stemmer": { 
     "type": "stemmer", 
     "name": "light_german" 
     } 
    }, 
    "analyzer": { 
     "de_analyzer": { 
     "type": "custom", 
     "tokenizer": "standard", 
     "filter": [ 
      "lowercase", 
      "de_stopwords", 
      "de_stemmer" 
     ] 
     } 
    } 
    } 
} 

Bu: Yukarıdaki addMapping() ile işe yaramadı gibi

{ 
    "mappings": { 
    "de_brochures": { 
     "properties": { 
     "text": { 
      "type": "string", 
      "store": true, 
      "index_analyzer": "de_analyzer" 
     }, 
     "classification": { 
      "type": "string", 
      "index": "not_analyzed" 
     }, 
     "language": { 
      "type": "string", 
      "index": "not_analyzed" 
     } 
     } 
    } 
    "settings": { 
    "analysis": { 
     "filter": { 
     "de_stopwords": { 
      "type": "stop", 
      "stopwords": "_german_" 
     }, 
     "de_stemmer": { 
      "type": "stemmer", 
      "name": "light_german" 
     } 
     }, 
     "analyzer": { 
     "de_analyzer": { 
      "type": "custom", 
      "tokenizer": "standard", 
      "filter": [ 
      "lowercase", 
      "de_stopwords", 
      "de_stemmer" 
      ] 
     } 
     } 
    } 
    } 
} 

yalnız ben iki ayrı dosyaya bölmek için çalıştı (I "mappings": ve "settings": bölümünü kaldırmak zorunda olduğunu fark) json yüklemek ve eklemek/ayarlamak için benim java kodum.

CreateIndexRequestBuilder createIndexRequestBuilder = client.admin().indices().prepareCreate(index); 
// CREATE SETTINGS 
String settings_json = new String(Files.readAllBytes(brochures_mapping_path)); 
createIndexRequestBuilder.setSettings(settings_json); 
// CREATE MAPPING 
String mapping_json = new String(Files.readAllBytes(brochures_mapping_path)); 
createIndexRequestBuilder.addMapping("de_brochures", mapping_json); 
CreateIndexResponse indexResponse = createIndexRequestBuilder.execute().actionGet(); 

haritalama dosyanın yapısı hakkında daha fazla şikayet yoktur ama şimdi hata ile başarısız:

Caused by: org.elasticsearch.index.mapper.MapperParsingException: Analyzer [de_analyzer] not found for field [text] 

cevap

4

Çözüm: kullanıyorum benim orijinal json dosyası ile bunu başardı createIndexRequestBuilder.setSource(settings_json);

+0

Lütfen soruya çözüm eklemeyin. Çözümler soru değil. Çözümler cevaptır. Stackoverflow, çözümleri bulduğunuzda kendi sorularınızı cevaplamaya teşvik eder. Ama lütfen bunu bir cevapta yapın. Sorunun dahil edilmesi, çözümü sadece okuyucuları karıştırıyor. Teşekkürler! – Vogel612

1

Sorun, harita dosyasının yapısı ile olduğunu düşünüyorum.

İşte örnek bir örnek.

mapping.json 
{ 
"en_brochures": { 
    "properties": { 
     "text": { 
      "type": "string", 
      "store": true, 
      "index_analyzer": "en_analyzer", 
      "term_vector": "yes" 
     }, 
     "classification": { 
      "type": "string", 
      "index": "not_analyzed" 
     }, 
     "language": { 
      "type": "string", 
      "index": "not_analyzed" 
     } 
    } 
    } 
} 



String mapping = new String(Files.readAllBytes(Paths.get("mapping.json"))); 
    createIndexRequestBuilder.addMapping('en_brochures', mapping); 
    CreateIndexResponse indexResponse =createIndexRequestBuilder.execute().actionGet(); 

Bu benimkilerde çalışır, deneyebilirsiniz.

+0

bunu çalışmak için senin json yapısına "analizörü" bölümünde sığabilecek nasıl bir fikrin var mı? – Peter

+0

Yukarı bak! Değiştim, cevabım. Ve bunun işe yaraması için ayarları eklemelisiniz (daha önce yaptığınız gibi) – progrrammer

+0

En_analyzer'ı zaten eklediniz mi? Bunu nasıl yaptın? Aksi takdirde "metin" için "en_analyzer" bulamamaktan yakınıyor. – Peter

İlgili konular