【问题标题】:Encoding unique IDs to a maximum document size of 100kb将唯一 ID 编码为最大 100kb 的文档大小
【发布时间】:2011-10-21 19:08:37
【问题描述】:

我认为这将是一个不错的小脑筋。这是一个现实生活中的问题,我一直在试图弄清楚如何实现它。我不认为它会成为多年的问题,到那时它将成为那些“很好的问题”之一。

所以,我的搜索引擎索引中有文档。文档可以有多个字段,但是每个字段的大小必须限制在 100kb 以内。

我想存储可以访问此文档的特定站点的 ID。站点 id 计数很低,因此它永远不会达到极高的数字。

例如,这里的文档可以被 ID 为 7 和 10 的站点访问。

Document: {
 docId: "1239"
 text: "Some Cool Document",
 access: "7 10"
}

现在,因为“访问”字段限制为 100kb,这意味着如果您要获取连续 ID,则只能存储 18917 唯一 ID。

参考: http://codepad.viper-7.com/Qn4N0K

<?php
    $ids = range(1,18917);
    $ids = implode(" ", $ids);
    echo mb_strlen($ids, '8bit') / 1024 . "kb";
?>

// 输出

99.9951171875kb

在我的应用程序中,站点 ID 为 7 的特定站点尝试搜索,他将有权访问该“一些很酷的文档”

所以现在,我的问题是,有什么方法可以让更多的 ID 适合该字段? 我考虑过正确的编码,并应用类似 Huffman Tree 的东西,但由于每个文档都有不同的 ID,因此不可能将单个编码集应用于每个文档。

或许,我可以使用标记化的罗马数字之类的东西?

无论如何,我对想法持开放态度。

我应该添加,我想尽可能长时间地将所有 ID 保留在同一字段中。在第二个字段上搜索,将对性能产生相当大的影响。因此,当我尽可能长时间地挤压访问字段时,我只会切换到使用第二个 access2 字段。

编辑:

转换为十六进制

<?php
        function hexify(&$item){
             $item = dechex($item);
        }
    $ids = range(1,21353);
    array_walk( $ids, "hexify");
    $ids = implode(" ", $ids);
    echo mb_strlen($ids, '8bit') / 1024 . "kb";

?>

这会产生 21353 个连续 ID 的性能提升。 所以上升了 12.8%

重要提示

我认为我的字段只能存储 UTF 编码字符这一事实使得几乎不可能从中获得更多信息。

【问题讨论】:

    标签: php search encoding indexing


    【解决方案1】:

    使用数据压缩怎么样?

    $ids = range(1,18917);
    $ids = implode(" ", $ids);
    $ids = gzencode($ids);
    echo mb_strlen($ids, '8bit') / 1024 . "kb"; // 41.435546875kb
    

    【讨论】:

    • 你不能这样做,因为那我如何搜索每个可以通过 ID 为 7 访问的文档。
    • 您可以使用gzdecode 进行解压缩(但是,我开始怀疑我在您的问题中遗漏了一些关键点)。
    【解决方案2】:

    18917 是从哪里来的? 100kb 是一个很大的数字。

    您有大约 100,000 个字节。如果将其存储为数字,则每个字节的长度可以是 255。

    如果你编码为十六进制,你会得到 100,000 ^ 16,这是一个非常大的数字,而且只是十六进制编码。

    base64 呢?您将 3 个字节填充到 4 个字节的空间中(有点损失),但每个字符有 64 个字符。所以 100,000 ^ 64。这是一个很大的数字。

    你不会有任何问题。只需做一个简单的十六进制编码。

    编辑:

    TL;DR

    假设您使用 base64。您可以在同一位置容纳 6.4 倍的数据。无需压缩。

    【讨论】:

    • 刚检查,字段类型只能接受字符串或数字表示。所以基本上仅限于纯粹用 UTF-8 兼容字符来制定我的 $ID。
    • 18917 = 连续 ID 的最大值,如果您假设文档将具有从 1 到 18917 的每个 ID。因此,例如 1 2 3 4 5 等。形成的字符串的 mb_strlen , 不到 100kb。
    • 两者都兼容 UTF-8。 base64用于将二进制数据存储为字符串,hex就是0-9和A-F这两个字符。
    • tjameson:我刚刚添加了一个“hexify”编码,这让我得到了 22k 个连续的 ID,我不确定我会如何为 base64 做同样的事情?我会尝试 :) 但是得到了.. 'Http 请求失败:(400)错误请求:“字段文本的值不是字符串也不是数字”'.. 当我尝试做 mb_convert_encoding("Testing", "UTF-8", "BASE64")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    相关资源
    最近更新 更多