Я хотел бы создать (и позже обновить) индекс, не зная, какие поля он будет содержать. Сейчас я делаю так:
curl -XPUT 'localhost:9200/myIndexName?pretty' -H 'Content-Type: application/json' -d'
{
"settings" : {
"index" : {
"number_of_shards" : 3,
"number_of_replicas" : 2
}
},
"mappings" : {
"myIndexName" : {
"dynamic" : true,
"numeric_detection": true,
"properties" : {}
}
}
}
'
и это прекрасно работает.
Теперь история выглядит следующим образом. Многие люди заходят на веб-страницы и вводят информацию, некоторые из них будут text
, а некоторые - double
. Я добавляю в индекс новые поля с правильными типами и вставляю их новые документы. Я не буду знать имена или типы полей, пока пользователи не введут их.
Проблема в том, что мне не удается отобразить правильные типы полей в Elastic Search, что затрудняет поиск числовых типов.
Что я пробовал
- Свойство
numeric_detection
делает дрянную работу, поэтому я не могу на него положиться.
- Я мог бы использовать
dynamic_template
, но для этого потребовалось бы изменить имена полей, а я решительно предпочел бы этого не делать.
- Я не могу использовать PredefinedTransportClient из-за конфликта с переходными зависимостями на
org.elasticsearch.transport.Netty3Plugin
. С этим TransportClient может быть отправлен запрос Put Mapping
, который я хотел бы отправить от другого клиента.
Я использую Java-клиент RestHighLevel. В настоящее время я пытаюсь отправить запрос отображения пут с помощью этого учебника . Но я не правильно формирую запрос, мой код выглядит следующим образом
final Map<String, Object> properties = new HashMap<>();
for (String key : esHeaderTypes.keySet()) {
final Map<String, String> typeMap =
new HashMap<String, String>() {
{
put("type", esHeaderTypes.get(key).name());
}
};
properties.put(key, typeMap);
}
final Map<String, Object> propertiesMap = new HashMap<>();
propertiesMap.put("properties", properties);
HttpEntity entity =
new NStringEntity(OBJECT_MAPPER.writeValueAsString(propertiesMap), ContentType.APPLICATION_JSON);
Response response = restHighLevelClient
.getLowLevelClient()
.performRequest("PUT", index, Collections.emptyMap(), entity);
LOGGER.debug("putMapping Response: ", response);
но это вызывает исключение, которое я опубликую позже, когда смогу найти его снова.
Буду очень признателен за любой совет Я не могу использовать командный код cURL
без небольшой дополнительной помощи.
Я использую
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.2.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>6.2.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.2.2</version>
</dependency>