【问题标题】:ElasticSearch Fields Mapping to String by default when indexing索引时默认 ElasticSearch 字段映射到字符串
【发布时间】:2015-06-22 09:16:49
【问题描述】:

让我先解释一下我的情况。 我正在从 RDBMS 获取数据并将其推送到 ElasticSearch。 获取的结果是列表的形式,我正在准备这样的批量索引请求:

BulkRequestBuilder bulkRequest = client.prepareBulk(); 
for (Map<String,Object> singleDataRow : ResultSet) 
{ 
       IndexRequest indexRequest = new IndexRequest("testindex","testtype",singleDataRow.getObject("NAME")); 
       bulkRequest.add(indexRequest); 
} 

bulkRequest.execute().actionGet(); 

My Map = 包括字符串到字符串、字符串到大十进制、字符串到大整数等的映射。 例如。

{ BIRTHDATE : 2015-03-05 , NAME : deepankar , AGE : 22 , AMOUNT : 15.5 } 

但是当我在 testindex 中看到我的 testtype 的映射时,所有字段的映射都是 "type" : "string"

为什么字段不映射到 "type": "string" 或 "type" : "long" ,甚至像 elasticsearch 默认那样映射到 "type" : "date"?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    Elasticsearch 将尝试在第一次插入时“猜测”字段类型,除非您事先创建和映射字段。

    您的字段被索引为 string 而不是 long 或任何其他类型有两个可能的原因:

    1. 您并没有真正以int 发送这些字段,因此您发送的是'10' 而不是10

    2. 您已经为该字段插入了至少一个具有string 值的文档,因此如果您插入了第一个带有AGE: '22' 的文档,Elasticsearch 会将该字段设置为type: string 和任何未来的插入将具有 string 值。

    如果你想确定,你可以删除当前索引,重新创建它并在插入第一个文档之前手动设置映射,如下所示:

    curl -XPUT 'http://localhost:9200/testindex/_mapping/testmapping' -d '
    {
        "testmapping" : {
            "properties" : {
                "birthdate" : { "type" : "date", "format": "dateOptionalTime" },
                "name" : { "type" : "string" },
                "age" : { "type" : "long" },
                "amount" : { "type" : "double" }
            }
        }
    }
    '
    

    【讨论】:

    • 感谢您的回复。实际上我在调用 code indexRequest(singleDataRow); 之前确实输出了 singleDataRow ( MAP ); code 像这样:code System.out.println(singleDataRow.get("AGE").getClass()); code它返回我:java.math.BigDecimal
    • 您插入索引的第一个文档是否可能使用字符串而不是整数/浮点数?在任何情况下,删除索引,创建并使用映射 API 来设置字段类型,然后插入您的文档。
    • 我没有创建任何索引。我使用 sense 执行 DELETE _all 并运行我的 java 代码,当我 GET testindex/_mapping 时:所有字段的类型都为字符串!
    • 为什么映射不自动占用 long 、 float 、 date ?它应该默认做这个映射??
    • 我看到了你的回答。我知道我们可以使用映射 api 提供映射,但我的问题是为什么 es 默认使用 string 索引数据?我的Map&lt;String,Object&gt; singleDataRow.get("AGE").getClass(); 返回为java.Math.BigDecimal,所以并不是我的地图包含所有值string
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多