文档的倒排 invertDocument方法的源代码
来源:互联网 发布:计算机最小的数据单位 编辑:程序博客网 时间:2024/04/28 05:12
代码中的Enumeration如果有不懂得,参见我的上一篇博客。
package indexwriter;
import java.io.IOException;import java.io.Reader;
import java.io.StringReader;
import java.util.Enumeration;
import java.lang.Object.*;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.TermVectorOffsetInfo;
//invertDocument方法的源代码
public class InvertDocument {
private final void invertDocument(Document doc) throws IOException{
FieldInfo
//获取对Document中所有field的遍历
Enumeration fields = doc.fields();
//判断是否还有元素
while(fields.hasMoreElements()){
Field field = (Field) fields.nextElement();
//取出field的名称
String fileName = field.name();
//取出field的编号
int fileNumber = fieldInfos.fileNumber(fieldName);
int length = fieldLengths[fieldNumber];
int position = fieldPositions[fieldNumber];
if(length > 0)
position += analyzer.getPositionIncrementGap(fileName);
int offset = fieldOffsets[fieldNumber];
//如果当前field是需要被索引的
if(field.isIndexed()){
//首先处理那些不需要被分词的field
if(!field.isTokenized()){
//取出当前的field的数值
String stringValue = field.stringValue();
//是否按词条向量存储
if(field.isStoreOffsetWithTermVector())
//把整个field的数据当成一个词条存储进postingTable中
addPosition(fileName, stringValue, position++, new TermVectorOffsetInfo(offset, offset + stringValue.length()));
else
//把整个field的数据当成一个词条进行存储进postingTable中
addPostion(fieldName, stringValue, postion++, null);
offset += stringValue.length();
length++;
}
//如field需要进行分词
else{
Reader reader;
//如果是用Reader来当做数据源的
if(field.readerValue() != null)
reader = field.readerValue();
//如果是直接用字符串来当做数据的
else if(field.stringValue() !=null)
reader= new StringReader(field.stringValue());
else
throw new IllegalArgumentException("field must have either String or Reader value()");
//调用底层分析器的接口来对field里的数据进行分词和过滤
TokenStream stream = analyzer.tokenStream(fieldName, reader);
try{
Token lastToken = null;
for(Token t = stream.next(); t != null; t = stream.next()){
//每切出一个词,就将position加上当前这个切出来的词的长度
position += (t.getPositionIncrement() - 1);
//如果与词条向量有关的就存储偏移量信息
if(field.isStoreOffsetWithTermVector())
//将切出来的词存入postingTable中
addPosition(fieldName, t.termText(), position++, new TermVectorOffsetInfo(offset + t.startOffset(), offset + t.endOffset()));
else
//将切出的词条存入postingTable中
addPosition(fieldName, t.termText(), position++, null);
lastToken = t;
//如果当前的词条数目已经达到了最大域长度
if(++length > maxFieldLength){
if(infoStream != null)
infoStream.println("maxFieldLength " + maxFieldLength + " reached, ignoring following tokens");
break;
}
}
if(lastToken != null)
offset += lastToken.endOffset() + 1;
}finally{
stream.close();
}
}
//记录先关属性信息
fieldLengths[fieldNumber] = length;
fieldPosition[fieldNumber] = position;
fieldOffsets[fieldNumber] = offset;
}
}
}
}
0 0
- 文档的倒排 invertDocument方法的源代码
- hadoop - 带词频属性的文档倒排索引
- 从 WordCount 到文档的倒排索引详解
- Doclist压缩方法简介 [转者注:搜索引擎设计的倒排索引设计中文档列表的存储压缩]
- 倒排文档
- 倒排文件的应用
- 倒排索引的基础知识
- 倒排索引的建立
- 倒排句子的单词
- 倒排索引的了解
- 基于Hadoop的带词频属性的文档倒排索引
- 软件实习-倒排文档
- hadoop实现文档倒排
- Lucene的倒排索引(学习整理)
- 关于搜索引擎的倒排索引技术
- 某人发布的倒排索引
- 倒排索引-搜索引擎的基石
- 倒排索引-搜索引擎的基石
- 求子数组的最大和
- 第一次笔试经历
- linux文件系统——读书笔记
- Android 读取APK签名信息
- css布局几个问题
- 文档的倒排 invertDocument方法的源代码
- ACM-判素数
- struts2学习笔记
- HTML5移动开发之路(12)——HTML5中的音频
- 黑马程序员--java线程
- Android 仿大众点评团购购买条浮动效果
- UVA 10192 - Vacation
- java解析xml汇总
- 如何运行python脚本 及 如何在脚本中输入中文