如何将倒排索引存储到二进制文件中?

时间:2017-10-02 01:02:41

标签: java binary binaryfiles binary-data

我有一个HashMap术语,其中包含单词出现的页面数,单词在页面中的频率以及它们的位置。

Ex:Word - [页码,页面中的词频,页面中的位置]

cat [1, 3, 1, 2, 5 ], [2, 2, 2, 5 ]
dog [2, 2, 1, 7 ]

如何将此信息存储在易于回读的二进制文件中?

我做了以下尝试:

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream out = new DataOutputStream(baos);

        for(String word: invertedIndex.keySet()) {
            out.writeUTF(word);  // Write the word
            for(Entry entry: invertedIndex.get(word)) {  // Info for a page
                out.writeInt(entry.pageNum); // Write its page number
                out.writeInt(entry.wordFrequency); // Write its freq in that page

                for(int position: entry.positions) {
                    out.writeInt(position); // Write the positions
                }
            }
        }

        byte[] bytes = baos.toByteArray();

        FileOutputStream fos = new FileOutputStream(PATH);
        fos.write(bytes);
        fos.close();

不确定这是否正确...提前致谢。

编辑:谢谢,结果我的问题更多的是关于如何解码这个相当严格的编码。

1 个答案:

答案 0 :(得分:2)

  

有没有办法保留这个数据结构?

是的。很多方法。

提示:您尝试的解决方案是一个良好的开端。

但是,完整的解决方案需要相应的方法来读取数据。当您尝试编写与您的编写代码相对应的读取方法时,您会发现存在系统性问题。例如,没有简单的方法可以确定一个int值列表的结束位置和下一个值的开始位置。

有办法解决这个问题。 想一想。你怎么能一个接一个地写两个列表,以便你知道哪一个结束而另一个结束呢?

注意:您不必使用ByteArrayOutputStream。您可以直接写入FileOutputStream中包含的BufferedOutputStream