2015-03-29 16 views
6

Vấn đề: Làm thế nào để tạo ra một chỉ số từ một tập tin JSON sử dụngElasticsearch Java API addMapping() và setSettings() sử dụng

Các tệp json chứa một định nghĩa cho các chỉ số de_brochures. Nó cũng định nghĩa một bộ phân tích de_analyzer với các bộ lọc tùy chỉnh được sử dụng bởi chỉ mục tương ứng. Khi json hoạt động với curl và Sense I cho rằng tôi phải điều chỉnh cú pháp của nó để làm việc với API java.

Tôi không muốn sử dụng XContentFactory.jsonBuilder() khi json đến từ một tệp!

Tôi có file json sau để tạo lập bản đồ của tôi từ và để đặt thiết lập:

Sử dụng Sense với PUT/indexname nó tạo ra một chỉ số từ này.

{ 
    "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" 
      ] 
     } 
     } 
    } 
    } 
} 

Như ở trên đã không làm việc với addMapping() một mình tôi cố gắng chia nó thành hai tập tin riêng biệt (Tôi nhận ra rằng tôi đã phải loại bỏ các "mappings":"settings": phần):

------ 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" 
     ] 
     } 
    } 
    } 
} 

này là mã java của tôi để tải và thêm/đặt json.

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(); 

Không có khiếu nại thêm về cấu trúc tập tin bản đồ, nhưng nó bây giờ không thành công với các lỗi:

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

Trả lời

4

Giải pháp: tôi cố gắng làm điều đó với tệp json ban đầu của tôi sử dụng createIndexRequestBuilder.setSource(settings_json);

+0

Vui lòng không thêm giải pháp cho câu hỏi. Giải pháp không phải là câu hỏi. Giải pháp là câu trả lời. Stackoverflow khuyến khích tự trả lời câu hỏi của bạn khi bạn tìm thấy giải pháp. Nhưng hãy làm điều đó trong một câu trả lời. Chỉnh sửa câu hỏi để bao gồm giải pháp chỉ gây nhầm lẫn cho người đọc. Cảm ơn! – Vogel612

1

Tôi nghĩ rằng vấn đề là với cấu trúc của tập tin bản đồ của bạn.

Đây là ví dụ mẫu.

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(); 

Điều này làm việc trong tôi, bạn có thể thử.

+0

Bạn có bất cứ ý tưởng làm thế nào tôi có thể phù hợp trong phần "phân tích" vào cấu trúc json của bạn cho nó hoạt động? – Peter

+0

Tra cứu! Tôi đã thay đổi, câu trả lời của tôi. Và, để làm việc này bạn phải thêm cài đặt (như bạn đã làm trước) – progrrammer

+0

Tôi cho rằng bạn đã thêm en_analyzer? Cậu đã làm thế nào vậy? Nếu không, nó than phiền về việc không tìm thấy "en_analyzer" cho "văn bản". – Peter

Các vấn đề liên quan