tceic.com
學霸學習網 這下你爽了
當前位置:首頁 >> 計算機軟件及應用 >>

倒排索引

6、倒排索引
"倒排索引"是文檔檢索系統中最常用的數據結構,被廣泛地應用于全文搜索引擎。它主要是用來 存儲某個單詞(或詞組)在一個文檔或一組文檔中的存儲位置的映射,即提供了一種根據內容來查 找文檔的方式。由于不是根據文檔來確定文檔所包含的內容,而是進行相反的操作,因而稱為倒排 索引(Inverted Index)。

6.1 實例描述
通常情況下,倒排索引由一個單詞(或詞組)以及相關的文檔列表組成,文檔列表中的文檔或者 是標識文檔的 ID 號,或者是指文檔所在位置的 URL,如圖 6.1-1 所示。

圖 6.1-1 倒排索引結構 從圖 6.1-1 可以看出,單詞 1 出現在{文檔 1,文檔 4,文檔 13,……}中,單詞 2 出現在{文 檔 3,文檔 5,文檔 15,……}中,而單詞 3 出現在{文檔 1,文檔 8,文檔 20,……}中。在實際 應用中,還需要給每個文檔添加一個權值,用來指出每個文檔與搜索內容的相關度,如圖 6.1-2 所 示。

圖 6.1-2 添加權重的倒排索引 最常用的是使用詞頻作為權重,即記錄單詞在文檔中出現的次數。以英文為例,如圖 6.1-3 所示, 索引文件中的"MapReduce"一行表示:"MapReduce"這個單詞在文本 T0 中出現過 1 次,T1 中出 現過 1 次,T2 中出現過 2 次。當搜索條件為"MapReduce"、"is"、"Simple"時,對應的集合為: {T0,T1,T2}∩{T0,T1}∩{T0,T1}={T0,T1},即文檔 T0 和 T1 包含了所要索引的單詞, 而且只有 T0 是連續的。

圖 6.1-3 倒排索引示例

更復雜的權重還可能要記錄單詞在多少個文檔中出現過,以實現 TF-IDF(Term FrequencyInverse Document Frequency)算法,或者考慮單詞在文檔中的位置信息(單詞是否出現在標 題中,反映了單詞在文檔中的重要性)等。 樣例輸入如下所示。 1)file1:

MapReduce is simple

2)file2:

MapReduce is powerful is simple

3)file3:

Hello MapReduce bye MapReduce

樣例輸出如下所示。

MapReduce is simple powerful Hello bye

file1.txt:1;file2.txt:1;file3.txt:2; file1.txt:1;file2.txt:2; file1.txt:1;file2.txt:1; file2.txt:1; file3.txt:1; file3.txt:1;

6.2 設計思路
實現"倒排索引"只要關注的信息為:單詞、文檔 URL 及詞頻,如圖 3-11 所示。但是在實現過 程中,索引文件的格式與圖 6.1-3 會略有所不同,以避免重寫 OutPutFormat 類。下面根據 MapReduce 的處理過程給出倒排索引的設計思路。

1)Map 過程 首先使用默認的 TextInputFormat 類對輸入文件進行處理,得到文本中每行的偏移量及其內 容。顯然,Map 過程首先必須分析輸入的對,得到倒排索引中需要的三個信息:單詞、文檔 URL 和詞頻,如圖 6.2-1 所示。

圖 6.2-1 Map 過程輸入/輸出

這里存在兩個問題:第一,對只能有兩個值,在不使用 Hadoop 自定義數據類型的情況下,需 要根據情況將其中兩個值合并成一個值,作為 key 或 value 值;第二,通過一個 Reduce 過程無 法同時完成詞頻統計和生成文檔列表,所以必須增加一個 Combine 過程完成詞頻統計。 這里講單詞和 URL 組成 key 值(如"MapReduce:file1.txt"),將詞頻作為 value,這樣做的 好處是可以利用 MapReduce 框架自帶的 Map 端排序,將同一文檔的相同單詞的詞頻組成列表, 傳遞給 Combine 過程,實現類似于 WordCount 的功能。 2)Combine 過程 經過 map 方法處理后,Combine 過程將 key 值相同的 value 值累加,得到一個單詞在文檔在 文檔中的詞頻,如圖 6.2-2 所示。如果直接將圖 6.2-2 所示的輸出作為 Reduce 過程的輸入,在 Shuffle 過程時將面臨一個問題:所有具有相同單詞的記錄(由單詞、URL 和詞頻組成)應該交由 同一個 Reducer 處理,但當前的 key 值無法保證這一點,所以必須修改 key 值和 value 值。這次 將單詞作為 key 值,URL 和詞頻組成 value 值(如"file1.txt:1")。這樣做的好處是可以利用 MapReduce 框架默認的 HashPartitioner 類完成 Shuffle 過程,將相同單詞的所有記錄發送給同 一個 Reducer 進行處理。

圖 6.2-2 Combine 過程輸入/輸出 3)Reduce 過程 經過上述兩個過程后,Reduce 過程只需將相同 key 值的 value 值組合成倒排索引文件所需的 格式即可,剩下的事情就可以直接交給 MapReduce 框架進行處理了。如圖 6.2-3 所示。索引文件 的內容除分隔符外與圖 6.1-3 解釋相同。 4)需要解決的問題 本實例設計的倒排索引在文件數目上沒有限制,但是單詞文件不宜過大(具體值與默認 HDFS 塊大小及相關配置有關),要保證每個文件對應一個 split。否則,由于 Reduce 過程沒有進一步 統計詞頻,最終結果可能會出現詞頻未統計完全的單詞。可以通過重寫 InputFormat 類將每個文 件為一個 split,避免上述情況。或者執行兩次 MapReduce,第一次 MapReduce 用于統計詞頻, 第二次 MapReduce 用于生成倒排索引。除此之外,還可以利用復合鍵值對等實現包含更多信息的 倒排索引。

圖 6.2-3 Reduce 過程輸入/輸出

6.3 程序代碼
程序代碼如下所示:

package com.hebut.mr;

import java.io.IOException; import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.input.FileSplit;

import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.GenericOptionsParser;

public class InvertedIndex {

public static class Map extends Mapper

private Text keyInfo = new Text(); // 存儲單詞和 URL 組合 private Text valueInfo = new Text(); // 存儲詞頻 private FileSplit split; // 存儲 Split 對象

// 實現 map 函數 public void map(Object key, Text value, Context context) throws IOException, InterruptedException {

// 獲得對所屬的 FileSplit 對象 split = (FileSplit) context.getInputSplit();

StringTokenizer itr = new StringTokenizer(value.toString());

while (itr.hasMoreTokens()) { // key 值由單詞和 URL 組成,如"MapReduce:file1.txt" // 獲取文件的完整路徑 // keyInfo.set(itr.nextToken()+":"+split.getPath().toString()); // 這里為了好看,只獲取文件的名稱。
int splitIndex = split.getPath().toString().indexOf("file");

keyInfo.set(itr.nextToken() + ":" + split.getPath().toString().substring(splitIndex)); // 詞頻初始化為 1 valueInfo.set("1");

context.write(keyInfo, valueInfo); } }

}

public static class Combine extends Reducer {

private Text info = new Text();

// 實現 reduce 函數 public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {

// 統計詞頻 int sum = 0; for (Text value : values) { sum += Integer.parseInt(value.toString()); }

int splitIndex = key.toString().indexOf(":"); // 重新設置 value 值由 URL 和詞頻組成 info.set(key.toString().substring(splitIndex + 1) + ":" + sum); // 重新設置 key 值為單詞 key.set(key.toString().substring(0, splitIndex));

context.write(key, info); } }

public static class Reduce extends Reducer {

private Text result = new Text();

// 實現 reduce 函數 public void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {

// 生成文檔列表 String fileList = new String(); for (Text value : values) { fileList += value.toString() + ";"; }

result.set(fileList);

context.write(key, result); } }

public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); // 這句話很關鍵 conf.set("mapred.job.tracker", "192.168.1.2:9001");

String[] ioArgs = new String[] { "index_in", "index_out" }; String[] otherArgs = new GenericOptionsParser(conf, ioArgs) .getRemainingArgs(); if (otherArgs.length != 2) { System.err.println("Usage: Inverted Index "); System.exit(2); }

Job job = new Job(conf, "Inverted Index"); job.setJarByClass(InvertedIndex.class);

// 設置 Map、Combine 和 Reduce 處理類 job.setMapperClass(Map.class); job.setCombinerClass(Combine.class); job.setReducerClass(Reduce.class);

// 設置 Map 輸出類型 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(Text.class);

// 設置 Reduce 輸出類型 job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class);

// 設置輸入和輸出目錄 FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } }

6.4 代碼結果
1)準備測試數據 通過 Eclipse 下面的"DFS Locations"在"/user/hadoop"目錄下創建輸入文件"index_in"文件 夾(備注:"index_out"不需要創建。)如圖 6.4-1 所示,已經成功創建。

圖 6.4-1 創建"index_in"

圖 6.4.2 上傳"file*.txt"

然后在本地建立三個 txt 文件,通過 Eclipse 上傳到"/user/hadoop/index_in"文件夾中,三個 txt 文件的內容如"實例描述"那三個文件一樣。如圖 6.4-2 所示,成功上傳之后。 從 SecureCRT 遠處查看"Master.Hadoop"的也能證實我們上傳的三個文件。

圖 6.4.3 三個"file*.txt"的內容 2)查看運行結果 這時我們右擊 Eclipse 的"DFS Locations"中"/user/hadoop"文件夾進行刷新,這時會發現多 出一個"index_out"文件夾,且里面有 3 個文件,然后打開雙其"part-r-00000"文件,會在 Eclipse 中間把內容顯示出來。如圖 6.4-4 所示。

Hadoop 下進行反向索引(Inverted Index)操作
分類: Hadoop 2011-01-07 19:26 1784 人閱讀 評論(0) 收藏 舉報 hadoopstringtemplatesclasspathimport 參考資料: 代碼參考 1: http://www.pudn.com/downloads212/sourcecode/unix_linux/detail999273.h tml 理論參考 2:http://zhangyu8374.javaeye.com/blog/86307, http://nything.javaeye.com/blog/411787 在 eclipse 下創建 map/reduce 項目 InvertedIndex,然后將參考 1 中的 src 目 錄拷貝到項目目錄下替換原有 src 目錄。 在本地創建文件夾 IndexTest 并在里面創建 3 個文件,每個文件中的內容如下。 * T0 = "it is what it is" * T1 = "what is it" * T2 = "it is a banana" 其中 T0,T1,T2 分別是文件名,后面為文件內容。將 IndexTest 文件夾上傳到 DFS 中。然后運行反向索引程序。 最后輸出結果為: a (T2, 3) banana (T2, 4) is (T2, 2) (T0, 2) (T0, 5) (T1, 2) it (T1, 3) (T2, 1) (T0, 1) (T0, 4) what (T0, 3) (T1, 1)

代碼清單: InvertedIndex.java [c-sharp] view plaincopy 1. /* 2. * To change this template, choose Tools | Templates 3. * and open the template in the editor. 4. */

5. package pa4; 6. import java.io.IOException; 7. import org.apache.hadoop.conf.Configuration; 8. import org.apache.hadoop.fs.FileSystem; 9. import org.apache.hadoop.fs.Path; 10.import org.apache.hadoop.io.Text; 11.import org.apache.hadoop.mapreduce.Job; 12.import org.apache.hadoop.mapreduce.Mapper; 13.import org.apache.hadoop.mapreduce.Reducer; 14.import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 15.import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 16.import org.apache.hadoop.util.GenericOptionsParser; 17./** 18. * 19. * @author Ming 20. */ 21.public class InvertedIndex { 22. public static class TokenizerMapper 23. extends Mapper<Text, ValuePair, Text, ValuePair> { 24. @Override 25. public void map(Text key, ValuePair value, Context context) throws IOException, InterruptedException { 26. // TokenInputFormat has generate (word, (fileID, wordPositi on)) 27. // so mapper just spill it to reducer 28. key.set(key.toString().toLowerCase()); 29. context.write(key, value); 30. } 31. } 32. public static class IndexReducer 33. extends Reducer<Text, ValuePair, Text, Text> { 34. private Text postings = new Text(); 35. @Override 36. public void reduce(Text key, Iterable<ValuePair> values, 37. Context context) throws IOException, InterruptedExcepti on { 38. String list = ""; 39. for (ValuePair val : values) { 40. list += " " + val.toString(); 41. } 42. postings.set(list); 43. context.write(key, postings); 44. }

45. 46. 47. 48.

} public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); String[] otherArgs = new GenericOptionsParser(conf, args).g etRemainingArgs(); 49. if (otherArgs.length != 2) { 50. System.err.println("Usage: InvertedIndex <in-dir> <outdir>"); 51. System.exit(2); 52. } 53. // remove the old output dir 54. FileSystem.get(conf).delete(new Path(otherArgs[1]), true); 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. ; 68. 69. 70.} Job job = new Job(conf, "Inverted Indexer"); job.setJarByClass(InvertedIndex.class); job.setInputFormatClass(TokenInputFormat.class); job.setMapperClass(InvertedIndex.TokenizerMapper.class); //job.setCombinerClass(InvertedIndex.IndexReducer.class); job.setReducerClass(InvertedIndex.IndexReducer.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(ValuePair.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])) System.exit(job.waitForCompletion(true) ? 0 : 1); }

TokenInputFormat.java [c-sharp] view plaincopy 1. 2. 3. 4. 5. 6. 7. package pa4; import java.io.IOException; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.input.FileSplit;

8. import org.apache.hadoop.mapreduce.InputSplit; 9. import org.apache.hadoop.conf.Configuration; 10.import org.apache.hadoop.fs.FSDataInputStream; 11.import org.apache.hadoop.mapreduce.JobContext; 12.import org.apache.hadoop.mapreduce.RecordReader; 13.import org.apache.hadoop.mapreduce.TaskAttemptContext; 14.import org.apache.hadoop.mapreduce.TaskAttemptID; 15.import org.apache.hadoop.util.LineReader; 16.import java.util.StringTokenizer; 17.public class TokenInputFormat extends FileInputFormat<Text, Val uePair> { 18. /** 19. * Don't allow the files to be split! 20. */ 21. @Override 22. protected boolean isSplitable(JobContext ctx, Path filename ) { 23. // ensure the input files are not splittable! 24. return false; 25. } 26. /** 27. * Just return the record reader 28. * key is the docno 29. */ 30. public RecordReader<Text, ValuePair> createRecordReader(Inp utSplit split, 31. TaskAttemptContext ctx) 32. throws IOException, InterruptedException { 33. return new TokenRecordReader(); 34. } 35. public static class TokenRecordReader extends RecordReader< Text, ValuePair> { 36. private long start; 37. private long pos; 38. private long end; 39. private LineReader in; 40. private int maxLineLength; 41. private Text line; 42. private Text key = null; 43. private ValuePair value = null; 44. private StringTokenizer tokens = null; 45. private int tokenPos = 0; 46. private String fileID = "0"; // input file id that appea rs in inverted index

47. 48. 49. 50. 51.

public void initialize(InputSplit genericSplit, TaskAttemptContext context) throws IOException { FileSplit split = (FileSplit) genericSplit; Configuration job = context.getConfiguration(); this.maxLineLength = job.getInt("mapred.linerecordreade r.maxlength", 52. Integer.MAX_VALUE); 53. start = split.getStart(); 54. end = start + split.getLength(); 55. final Path file = split.getPath(); 56. // Assume file name is an integer of file ID 57. fileID = file.getName(); 58. FileSystem fs = file.getFileSystem(job); 59. FSDataInputStream fileIn = fs.open(split.getPath()); 60. in = new LineReader(fileIn, job); 61. this.pos = start; 62. line = new Text(); 63. key = new Text(); 64. value = new ValuePair(); 65. } 66. public boolean nextKeyValue() throws IOException { 67. boolean splitEnds = false; 68. while (tokens == null || !tokens.hasMoreTokens()) { 69. int lineSize = in.readLine(line, maxLineLength, 70. Math.max((int) Math.min(Integer.MAX_VALUE, end pos), 71. maxLineLength)); 72. if (lineSize == 0) { 73. splitEnds = true; 74. break; 75. } 76. pos += lineSize; 77. tokens = new StringTokenizer(line.toString(), " /t/n/r/ f,.;<>-?///!'/":=*{}()$[]"); 78. } 79. if (splitEnds) { 80. key = null; 81. value = null; 82. line = null; 83. tokens = null; 84. return false; 85. } else 86. return true; 87. }

88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106.

@Override public Text getCurrentKey() { key.set(tokens.nextToken()); tokenPos ++; return key; } @Override public ValuePair getCurrentValue() { value.set(fileID, tokenPos); return value; } /** * Get the progress within the split */ public float getProgress() { if (start == end) { return 0.0f; } else { return Math.min(1.0f, (pos start) / (float) (end - start)); 107. } 108. } 109. public synchronized void close() throws IOException { 110. if (in != null) { 111. in.close(); 112. } 113. } 114. } 115. public static void main(String[] args) 116. throws IOException { 117. String fn = args[0]; 118. Configuration conf = new Configuration(); 119. FileSplit split = new FileSplit(new Path(fn), 0, 10000 000, null); 120. TokenRecordReader irr = new TokenRecordReader(); 121. TaskAttemptContext ctx = new TaskAttemptContext(conf, 122. new TaskAttemptID("hello", 12, true, 12, 12)); 123. irr.initialize(split, ctx); 124. while (irr.nextKeyValue()) { 125. System.out.println(irr.getCurrentKey() + ": " + ir r.getCurrentValue()); 126. }

127. 128.

} }

ValuePair.java [c-sharp] view plaincopy 1. package pa4; 2. /* 3. * To change this template, choose Tools | Templates 4. * and open the template in the editor. 5. */ 6. import java.io.*; 7. import org.apache.hadoop.io.*; 8. /** 9. * 10. * @author Ming 11. */ 12.public class ValuePair implements WritableComparable<ValuePair> { 13. private Text one; 14. private IntWritable two; 15. public void set(Text first, IntWritable second) { 16. one = first; 17. two = second; 18. } 19. public void set(String first, int second) { 20. one.set(first); 21. two.set(second); 22. } 23. public ValuePair() { 24. set(new Text(), new IntWritable()); 25. } 26. public ValuePair(Text first, IntWritable second) { 27. set(first, second); 28. } 29. public ValuePair(String first, int second) { 30. set(first, second); 31. } 32. public Text getFirst() { 33. return one; 34. } 35. public IntWritable getSecond() {

36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73.

return two; } @Override public void write(DataOutput out) throws IOException { one.write(out); two.write(out); } @Override public void readFields(DataInput in) throws IOException { one.readFields(in); two.readFields(in); } @Override public int hashCode() { return one.hashCode(); } @Override public boolean equals(Object o) { if (o instanceof ValuePair) { ValuePair tp = (ValuePair)o; return one.equals(tp.one); } return false; } @Override public String toString() { return "(" + one + ", " + two + ")"; } @Override public int compareTo(ValuePair tp) { int cmp = one.compareTo(tp.one); if (cmp != 0) { return cmp; } return two.compareTo(tp.two); } public static class Comparator extends WritableComparator {

private static final Text.Comparator TEXT_COMPARATOR = new Text.Comparator(); 74. private static final IntWritable.Comparator INT_COMPARATOR = new IntWritable.Comparator(); 75. public Comparator() { 76. super(ValuePair.class);

77. 78. 79. 80. 81. 82.

} @Override public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) { try { int oneL1 = WritableUtils.decodeVIntSize(b1[s1]) + read VInt(b1, s1); 83. int oneL2 = WritableUtils.decodeVIntSize(b2[s2]) + read VInt(b2, s2); 84. int cmp = TEXT_COMPARATOR.compare(b1, s1, oneL1, b2, s2 , oneL2); 85. if (cmp != 0) { 86. return cmp; 87. } 88. return INT_COMPARATOR.compare(b1, s1+oneL1, l1-oneL1, 89. b2, s2+oneL2, l2-oneL2); 90. } catch (IOException e) { 91. throw new IllegalArgumentException(e); 92. } 93. } 94. @Override 95. public int compare(WritableComparable a, WritableComparable b) { 96. if (a instanceof ValuePair && b instanceof ValuePair) { 97. 98. 99. 100. 101. 102. 103. tor()); 104. 105. } return ((ValuePair) a).compareTo((ValuePair) b); } return super.compare(a, b); } } static { WritableComparator.define(ValuePair.class, new Compara }


推薦相關:

倒排索引_圖文.ppt

倒排索引 - 倒排索引簡介 xxx 概要 ? ? ? ? ? 倒排索引的概念 倒排索引的創建 倒排索引的規模估算 倒排索引的歸并處理 倒排索引的分布式存儲 倒排索引的...

基于java的倒排索引.doc

基于java的倒排索引 - 倒排索引 一、倒排索引 倒排索引源于實際應用中需要根

倒排索引介紹.doc

倒排索引介紹 - 倒排索引 百科名片 倒排索引 倒排索引源于實際應用中需要根據屬

倒排索引.doc

倒排索引 - hadoop倒排索引編碼實現... 倒排索引_計算機軟件及應用_IT/計算機_專業資料。hadoop倒排索引編碼實現 6、倒排索引 "倒排索引"是文檔檢索系統中最常用...

倒排索引技術_圖文.ppt

倒排索引技術 - 索引技術簡介、分治思想 以及排序算法 2010/05/13 Hu Junfeng 內容 ? ? ? ? ? 作業講解 分治思想 分治排序算法 倒排索引技術 中文信息處理與...

倒排索引布爾查詢的處理繼續_圖文.ppt

倒排索引布爾查詢的處理繼續 - 倒排檢索構建 主講人:陳文亮 蘇州大學計算機學院 提綱 ① 倒排索引 ② 布爾查詢的處理 2 一個簡單的例子(金庸小說) ? 金庸的哪...

一種高效的倒排索引存儲結構_鄧攀.pdf

2 倒排索引存儲結構設計 2.1 詞典結構詞典結構如圖 1 所示。 Word 中

倒排索引布爾查詢的處理-SUDA-HLT-蘇州大學_圖文.ppt

倒排索引布爾查詢的處理-SUDA-HLT-蘇州大學 - 倒排檢索構建 主講人:陳文亮 蘇州大學計算機學院 提綱 ① 倒排索引 ② 布爾查詢的處理 2 一個簡單的例子(金庸...

建立倒排索引文件.txt

建立倒排索引文件 - import java.io.*; import java.text...... ("倒排索引建立"); this.setLayout(new FlowLayout()); this.setSize(300, 200...

分塊組織技術的倒排索引方法研究.pdf

分塊組織技術的倒排索引方法研究 - 為了進一步提高檢索系統的整體效率,提出了一種分塊組織技術的倒排索引方法.具體研究過程是在數據統計的基礎上產生倒排索引的檢索...

基于倒排索引的問答系統的設計與實現.doc

基于倒排索引的問答系統的設計與實現 - 龍源期刊網 http://www.qikan.com.cn 基于倒排索引的問答系統的設計與實現 作者:齊翌辰,王森淼,趙亞慧* 來源:《教育...

Lucene倒排索引原理剖析.doc

Lucene倒排索引原理剖析 - Lucene 倒排索引原理 xzall 原創

倒排索引的mapreduce代碼.txt

倒排索引: import java.io.IOException; import

搜索引擎之倒排索引:產品經理需要了解的搜索算法_圖文.doc

搜索引擎之倒排索引:產品經理需要了解的搜索算法 - 文檔均來自網絡,如有侵權請聯

實驗二 文檔的倒排索引算法實現.doc

實驗二 文檔的倒排索引算法實現 - 實驗二 文檔的倒排索引算法實現 一、實驗目的 倒排索引(Inverted Index)被用來存儲在全文搜索下某個單詞在一個文檔 或者一組...

基于分散分配的非對稱距離倒排索引機制研究.doc

基于分散分配的非對稱距離倒排索引機制研究 - 龍源期刊網 http://www.qikan.com.cn 基于分散分配的非對稱距離倒排索引機制研 究 作者:寶航 來源:《電子技術與...

hadoop倒排索引實驗報告.doc

設計 利用兩個 Map/Reduce 過程,第一個 MR 統計各個文件中的所有單 詞的出現次數,以及各個文件單詞總數,第二個 MR 根據統計結果處 理加工得到單詞倒排索引。...

【論文】基于倒排索引的MR定位算法.pdf

基于倒排索引的MR定位算法_互聯網_IT/計算機_專業資料 暫無評價|0人閱讀|0次下載 基于倒排索引的MR定位算法_互聯網_IT/計算機_專業資料。西安 理工大學學報 ...

GPU倒排索引分享---李雨前_圖文.ppt

GPU倒排索引分享---李雨前 - GPUGPU-based Inverted

倒排索引設計公開課PPT.ppt

倒排索引設計公開課PPT_互聯網_IT/計算機_專業資料。倒排索引設計吳凱 20

網站首頁 | 網站地圖
All rights reserved Powered by 學霸學習網 www.rincrl.live
copyright ©right 2010-2021。
文檔資料庫內容來自網絡,如有侵犯請聯系客服。[email protected]
北京快3助手安卓版