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