首页 > 解决方案 > Elastic Search 即时更新映射

问题描述

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

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. 可以使用 a dynamic_template,但这需要我修改字段名称,我强烈不希望这样做。
  3. 我无法使用 PredefinedTransportClient 因为与org.elasticsearch.transport.Netty3Plugin. 有一个Put Mapping可以用这个 TransportClient 分派的请求,我想从另一个客户端分派。
  4. 我正在使用 RestHighLevel Java 客户端。我目前正在尝试使用本教程发送一个放置映射请求。但我没有正确形成请求,我的代码如下所示

      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>

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

解决方案


推荐阅读