[lucene] field存储时附带tokenStream,但无法取出的问题

viruscamp 2010-08-06
我做了一个基于lucene的文档搜索系统,现在功能已经实现。
现在寻求一个比较好的优化方案,能在时间和空间方面达到一个平衡。

现在想要采取 方案3, 但问题就是搜索时取不出来tokenStream, 还要析花很长时间重新分析。

请问下有谁有存储tokenStream的经验,给分享下。

//方案1 文本存储在index,很大
document.add(new Field("contents", contents, Field.Store.YES,Field.Index.ANALYZED));

//方案2 文本不存index,需要从外部读,小
document.add(new Field("contents", contents, Field.Store.NO,Field.Index.ANALYZED));

//方案3 文本不存index,需要从外部读,额外存tokenStream,比1小,比2大,具体比例不知道
//但搜索时取不出来tokenStream
document.add(new Field("contents",analyzer.tokenStream("contents", new StringReader(contents))));


//下面是高亮的代码,已经从搜索结果中取到 Document doc
String str = doc.get("contents");//从index取文本,很大
if ( str == null){//index取文本失败
	str = getContent(doc.get("id"),"contents");//从database,或者存储的压缩文本,或者当场分析,取文本,基本上会慢
}
Field f =doc.getField("contents");
TokenStream tokens = (f==null)?null:(f.tokenStreamValue());//从index里的field取tokenStream,一直失败
if ( tokens == null){//index取token失败
	tokens = analyzer.tokenStream("contents", new StringReader(str));//当场分析,很慢
}
ret = highlighter.getBestFragment(tokens, str);//高亮
viruscamp 2010-08-13
自己解决了,实际field存储附带的不是tokenstream 而是 TermPositionVector。

//方案1 文本存储在index,很大  
document.add(new Field("contents", contents, Field.Store.YES,Field.Index.ANALYZED));  
  
//方案2 文本不存index,需要从外部读,小 ,tokens搜索时现场分析,搜索慢
document.add(new Field("contents", contents, Field.Store.NO,Field.Index.ANALYZED));

//方案3 文本不存index,需要从外部读,额外存 TermPositionVector,比1小,比2大,具体比例不知道,搜索时较快 
document.add(new Field("contents", contents, Field.Store.NO,Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS ));
//也许WITH_OFFSETS就够了
document.add(new Field("contents", contents, Field.Store.NO,Field.Index.ANALYZED,Field.TermVector.WITH_OFFSETS ));


//下面是高亮的代码,已经从搜索结果中取到 Document doc  
String str = doc.get("contents");//从index取文本,很大  
if ( str == null){//index取文本失败  
    str = getContent(doc.get("id"),"contents");//从database,或者存储的压缩文本,或者当场分析,取文本,稍慢  
}

//拿indexreader
reader = indexSearcher.getIndexReader();
TokenStream tokens = null;
if (reader != null){
	try {
		//读保存的 TermPositionVector ,并处理到tokens
		TermPositionVector tpv = (TermPositionVector)reader.getTermFreqVector(docid,field);
		tokens=(tpv==null)?null:TokenSources.getTokenStream(tpv);
	} catch (Exception e) {
	}
}
if (tokens == null){//index取tokens失败
	tokens = analyzer.tokenStream(field, new StringReader(str));//现场分析,这个会很慢
}
ret = h.getBestFragment(tokens, str);
Global site tag (gtag.js) - Google Analytics