1、问题的来源
增加分词以后结果的准确度提高了,但是用户反映返回结果的速度很慢
BANG48D1BFD627C49E3110A55E03XIANGUO
2、解决方法
在Lucene1.4.3版本中的一个新功能可以解决这个问题。Term Vector现在支持保存Token.getPositionIncrement() 和Token.startOffset() 以及Token.endOffset() 信息。利用Lucene中新增加的Token信息的保存结果以后,就不需要为了高亮显示而在运行时解析每篇文档
//增加文档时保存Term位置信息。
private void addDoc(IndexWriter writer, String text) throws IOException
{
Document d = new Document();
//Field f = new Field(FIELD_NAME, text, true, true, true);
Field f = new Field(FIELD_NAME, text ,
d.add(f);
writer.addDocument(d);
}
//利用Term位置信息节省Highlight时间。
void doStandardHighlights() throws Exception
{
Highlighter highlighter =new Highlighter(this,new QueryScorer(query));
highlighter.setTextFragmenter(new SimpleFragmenter(20));
for (int i = 0; i < hits.length(); i++)
{
String text = hits.doc(i).get(FIELD_NAME);
int maxNumFragmentsRequired = 2;
String fragmentSeparator = “…”;
TermPositionVector tpv = (TermPositionVector)reader
//如果没有stop words去除还可以改成 TokenSources.getTokenStream(tpv,true); 进一步提速。
TokenStream tokenStream=TokenSources.getTokenStream(tpv);
//analyzer.tokenStream(FIELD
String result =
highlighter.getBestFragments(
System.out.println(“t” + result);
}
}
最后把highlight包中的一个额外的判断去掉。对于中文来说没有明显的单词界限
tokenGroup.isDistinct(token)
这样中文分词就不会影响到查询速度了