【问题标题】:Storing 128bit numbers in elastic or mongodb在弹性或 mongodb 中存储 128 位数字
【发布时间】:2019-07-04 23:21:22
【问题描述】:

我的设计要求是能够以十进制格式保存 IPv6 地址。在 java 中,我有 BigInteger 可以容纳 40 位数字,Oracle 通过 JDBC 驱动程序就可以了。

如何在 Elastic 或 Mongo DB 中做到这一点。根据我的阅读,elastic 或 mongodb 支持的最大数字是 64 位 bigint 数字。 例如如果我转换

 FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF, 

十进制格式是

 340282366920938463463374607431768211455 (total of 39 digits). 

在 elastic 或 mongo 中解决此问题的最佳方法是什么?我需要能够在此字段上运行范围函数(=、=)来搜索文档。

【问题讨论】:

    标签: java mongodb elasticsearch


    【解决方案1】:

    从 Elasticserch 5.0 开始,有一个 ip field type,它同时支持 IPv4 和 IPv6。

    我建议在 Elasticsearch 中使用这个,而不是进行整数/字符串转换。

    这样做的原因是它天生支持子网样式查询,我认为这很方便。例如

    GET index/_search
    {
        “query”: {
            “term”: {
                “ip_addr”: “2001:db8::/48”
            }
        }
    }
    

    此字段类型也支持范围查询

    【讨论】:

    • 是的,我试过了。我正在使用 ip 类型来存储实际的 IP 地址,但我需要看看我是否也可以存储十进制。当然,如果不可能,我将不得不依赖这种类型。
    • @Sannu 只需使用fields 功能将IP 地址索引为IP 以及number。对于 39 位数字,您可能需要使用 double
    • @dmbaughman,我使用字段来存储其他内容,例如文本和相同文本字段的原始内容。但在这种情况下,我需要找到一种存储 128 位十进制的方法。 Double 和 long 不提供足够的空间。不确定是否有办法将这个大数字分成 3 个或 4 个较小的数字,并且仍然对这些数字运行查询。
    猜你喜欢
    • 2017-12-21
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2021-12-04
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    相关资源
    最近更新 更多