Эластичный поиск Обновление картирования на лету - PullRequest
0 голосов
/ 05 мая 2018

Я хотел бы создать (и позже обновить) индекс, не зная, какие поля он будет содержать. Сейчас я делаю так:

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, что затрудняет поиск числовых типов.

Что я пробовал

  1. Свойство numeric_detection делает дрянную работу, поэтому я не могу на него положиться.
  2. Я мог бы использовать dynamic_template, но для этого потребовалось бы изменить имена полей, а я решительно предпочел бы этого не делать.
  3. Я не могу использовать PredefinedTransportClient из-за конфликта с переходными зависимостями на org.elasticsearch.transport.Netty3Plugin. С этим TransportClient может быть отправлен запрос Put Mapping, который я хотел бы отправить от другого клиента.
  4. Я использую 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>
...