动态弹性搜索更新映射

时间:2018-05-05 15:21:13

标签: elasticsearch elasticsearch-5 spring-data-elasticsearch elasticsearch-6

我想创建(并稍后更新)索引而不知道它将包含哪些字段。现在我这样做如下:

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为基础。我使用正确的类型向索引添加新字段,并插入新文档。在用户输入字段名称或类型之前,我不会知道它们。

问题是我无法在弹性搜索中显示正确的字段类型,这使得搜索数字类型变得非常困难。

我尝试了什么

  1. numeric_detection属性正在做一个糟糕的工作,所以我无法依赖它。
  2. 可以使用dynamic_template,但这需要我修改字段名称,而强烈更喜欢不这样做。
  3. 由于与org.elasticsearch.transport.Netty3Plugin的传递依赖项冲突,我无法使用PredefinedTransportClient。有一个Put Mapping请求可以使用此TransportClient调度,我想从另一个客户端发送。
  4. 我正在使用RestHighLevel Java客户端。我目前正在尝试使用此tutorial调度put映射请求。但是我没有正确地形成请求,我的代码如下所示

      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);
    
  5. 但这引发了一个异常,稍后当我能够再次找到它时,我将发布该异常。

    您可以提供任何建议,我们将不胜感激。如果没有一些额外的帮助,我无法使用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>
    

0 个答案:

没有答案