2016-08-15 33 views
0

我的映射:Elasticsearch,映射类型的最大长度长

POST /packtwo-order-sku-log 
{ 
    "settings": { 
     "number_of_shards": 5, 
     "number_of_replicas": 1 
    }, 
    "mappings": { 
     "baitu": { 
      "properties": { 
       "order_id":{ 
        "type": "long" 
       }, 
       .... 
      } 
     } 
     } 
} 

当我搜索

"query": {"term" : {"order_id" : 10160815114820888}}

OR

"query": {"match" : {"order_id" : 10160815114820888}} 

我命中0; 但是,当我改变order_id到1016081511482088 ,我得到了点击。 然而,JSON ES返回所示:

 "hits": [ 
     { 
      "_index": "packtwo-order-sku-log", 
      "_type": "baitu", 
      "_id": "AVaMWcchVwJTsNV878q2", 
      "_score": 2.7917593, 
      "_source": { 
       "order_id": 10160815114820888, 
       ... 
      } 
     } 

我搜索10160815114820888 - >没有结果

我搜索1016081511482088 - >结果是1016081511482088

我发现在长型官方文档:

long 

A signed 64-bit integer with a minimum value of -2^63 and a maximum value of 2^63-1 

我的数据不长于2^63-1

那么,我的问题是什么?

回答

2

这是由于针对IEEE-754双精度浮点值的rounding issue

全值,直到53位可以安全地表示,然而,10160815114820887是54位长(100100000110010011010100011111100011000001110100010111)

已收录的实数确实是10160815114820887,但由于上述的四舍五入问题,它被索引并显示为10160815114820888

你可以尝试在浏览器的JavaScript控制台以下:

> var num = 10160815114820887;  <--- assign value 
< undefined 
> num        <--- display value 
< 10160815114820888 

您也可以尝试快速测试你的ES :

# create doc with 10160815114820887 
POST test/test/1 
{ "number": 10160815114820887 } 

# get doc 1 
GET test/test/1 
# result 
{ "number": 10160815114820888 } 

正如你所看到的,你已经索引(10160815114820887)的数量显示为10160815114820888,并且可以发现10160815114820887,因为它也被在搜索时四舍五入为10160815114820888。

+0

就像你的ES例子。你说“但仍然可以找到10160815114820887”,但当我搜索号码10160815114820887时,我无法得到结果。如果我想获得这些数据,我必须搜索0888。所以我认为这不仅是显示问题,而且还改变我的数据是ES – wilsonlee

+0

最后一部分有点困惑。例如,我的结果是索引7。当我搜索7时,我什么都没有,但是当我搜索8时,我得到了8的答案。所以,问题是当我索引数字时,它会变成错误的。对? – wilsonlee

+1

是的,这是正确的。搜索时间 – Val