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

How to store an inverted index in to binary file?

我有一个词条 HashMap,其中包含该词出现在哪个页面、该词在页面中出现的频率及其位置的数据。

例如:单词 - [页码,页面中的单词频率,页面中的位置]

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();

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

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

Is there a way to preserve this data structure?

是的。很多方法。

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

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

有很多方法可以解决这个问题。 想一想。你怎么能一个接一个地写两个列表,这样你就知道一个列表在哪里结束,下一个列表从哪里开始?

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