2015-03-29 2 views
6

Проблема: Как создать индекс из файла JSON, используяElasticsearch Java API addMapping() и setSettings() использование

Файл JSon содержит определение индекса de_brochures. Он также определяет анализатор de_analyzer с пользовательскими фильтрами, которые используются соответствующим индексом. Поскольку json работает с curl и Sense, я предполагаю, что мне нужно адаптировать синтаксис для работы с java API.

Я не хочу использовать XContentFactory.jsonBuilder(), поскольку json происходит из файла!

У меня есть следующий JSon файл, чтобы создать свое отображение и установить параметры:

Использование Sense с PUT/IndexName это создать индекс от этого.

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

Как выше не работает с addMapping() я один пытался разбить его на две отдельные файлы (я понял, что мне пришлось удалить "mappings": и "settings": часть):

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

Это это мой код java для загрузки и добавления/установки 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(); 

Там больше нет жалоб о структуре файла отображения, но теперь он терпит неудачу с ошибкой:

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

ответ

4

Решение: мне удалось сделать это с моим исходным файлом JSon с помощью createIndexRequestBuilder.setSource(settings_json);

+0

Пожалуйста, не добавляйте решение вопроса. Решения не являются вопросами. Решения - это ответы. Stackoverflow поощряет самостоятельное отвечать на ваши вопросы, когда вы находите решения. Но, пожалуйста, сделайте это в ответ. Редактирование вопроса для включения решения просто путает читателей. Благодаря! – Vogel612

1

Я думаю, что проблема со структурой файла отображения.

Вот пример.

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

Это работает на моем, вы можете попробовать.

+0

У вас есть какие-либо идеи, как я могу вписаться в «анализатор» часть в вашей структуре JSon для его работы? – Peter

+0

Посмотрите! Я изменил, мой ответ. И для этого вам нужно добавить настройки (как и раньше) – progrrammer

+0

Предполагаю, что вы уже добавили en_analyzer? Как ты это сделал? В противном случае он жалуется, что не нашел «en_analyzer» для «текста». – Peter

Смежные вопросы