弹性搜索忽略映射,长字段显示为字符串

时间:2016-05-09 22:40:17

标签: elasticsearch

我正在向elasticsearch添加一个模式,在模式中我试图添加一些字段作为以前作为字符串处理的long。我创建了一个新索引并重新处理了数据,但在新索引中,这些字段仍然显示为字符串。

索引端点映射的相关部分:

image_features: {
    properties: {
        brightness: {
            type: "string"
        },
        contrast: {
            type: "string"
        },
        height: {
            type: "long"
        },
        sharpness: {
            type: "string"
        },
        width: {
            type: "long"
        }
    }
}

但回程发回:

image_features: {
     width: "400",
     height: "400",
     sharpness: "good",
     contrast: "good",
     brightness: "good"
},

我最初创建了一个新索引并使用reindex来迁移数据。我还尝试创建一个新索引并通过批量操作重新加载所有数据。但这些价值观仍然存在。

1 个答案:

答案 0 :(得分:0)

您所看到的是消息来源,ES将始终完全按照您发送的方式存储来源,因此,它将完全返回您发送给他的内容。

但是,您可以确保image_features.widthlong已经处理得很长并且已经编入索引,因为您的映射会将这些字段声明为image_features: { width: 400, height: 400, sharpness: "good", contrast: "good", brightness: "good" },

如果您希望源返回数值,您需要使用数值发送源(见下文),ES不会转换您的源值,这意味着您需要修改您的客户端进程索引。

SELECT CASE WHEN hireorder <= cnt/10 THEN '*' ELSE '' END AS star,
       ename,
       hiredate 
FROM (
  SELECT ename, hiredate, 
         ROWNUMBER() OVER (PARTITION BY ename ORDER BY hiredate DESC) as hireorder,
         COUNT(*) OVER () as cnt
  FROM EMP
) sub