【发布时间】: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