如何将倒排索引存储到二进制文件中?
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
。
我有一个词条 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
。