zoukankan      html  css  js  c++  java
  • Lucene 中文分词的 highlight 显示

    1 、问题的来源
    
    增加分词以后结果的准确度提高了,但是用户反映返回结果的速度很慢。原因是, Lucene 做每一篇文档的相关关键词的高亮显示时,在运行时执行了很多遍的分词操作。这样降低了性能。
    
    2 、解决方法
    
    在 Lucene1.4.3 版本中的一个新功能可以解决这个问题。 Term Vector 现在支持保存 Token.getPositionIncrement() 和 Token.startOffset() 以及 Token.endOffset() 信息。利用 Lucene 中新增加的 Token 信息的保存结果以后,就不需要为了高亮显示而在运行时解析每篇文档。通过 Field 方法控制是否保存该信息。修改 HighlighterTest.java 的代码如下:
    
    // 增加文档时保存 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 ,
    
    Field.Store.YES, Field.Index.TOKENIZED,
    
    Field.TermVector.WITH_POSITIONS_OFFSETS);
    
    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.getTermFreqVector(hits.id(i),FIELD_NAME);
    
    // 如果没有 stop words 去除还可以改成 TokenSources.getTokenStream(tpv,true); 进一步提速。
    
    TokenStream tokenStream=TokenSources.getTokenStream(tpv);
    
    //analyzer.tokenStream(FIELD_NAME,new StringReader(text));
    
    String result =
    
    highlighter.getBestFragments(
    
    tokenStream,
    
    text,
    
    maxNumFragmentsRequired,
    
    fragmentSeparator);
    
    System.out.println("\t" + result);
    
    }
    
    }
    
    最后把 highlight 包中的一个额外的判断去掉。对于中文来说没有明显的单词界限,所以下面这个判断是错误的:
    
    tokenGroup.isDistinct(token)
    
    这样中文分词就不会影响到查询速度了。

    本文转自http://www.tianyablog.com/blogger/post_show.asp?BlogID=114714&PostID=2852189
  • 相关阅读:
    Java的错误类型
    交换两个变量的值
    变量的自增、自减、自乘、自除运算
    通过Scanner从控制台获取数据
    通过args数组获取数据
    int类型与char类型的转换
    大类型向小类型转换
    小类型向大类型转换
    6 高级2 自连接 视图
    5 高级 关系 连接
  • 原文地址:https://www.cnblogs.com/88223100/p/1269872.html
Copyright © 2011-2022 走看看