当前位置:编程学习 > JAVA >>

如何实现类似于百度所搜到关键词变颜色

    

        小弟最近在做个BBS,然后有个查询功能!我想做一个类似于百度搜索一样的,搜索出来的关键词变个颜色,麻烦大家教教小弟!感激不尽..! --------------------编程问答-------------------- 简单点可以这样的,搜索到结果之后,用关键字替换查询出来的内容,
比如这样 查询123       过热<font color="red">123</font>光荣感 --------------------编程问答--------------------
引用 1 楼 ailongni 的回复:
简单点可以这样的,搜索到结果之后,用关键字替换查询出来的内容,
 比如这样 查询123       过热 <font color="red">123 </font>光荣感


办法不错。
如果是用lucene搜索文本的话,里面提供高亮显示的方法的。 --------------------编程问答-------------------- 这个要做正则替换,其实很容易的 --------------------编程问答-------------------- lucene里面有高亮显示的类 --------------------编程问答--------------------
    这个方法我想到过,但是我觉得这个方法怎么说呢,感觉不够聪明!不知道还有没有牛人提供更好的方法! --------------------编程问答-------------------- 嗯,用lenuce解决,比较快。 --------------------编程问答-------------------- 求指教,为什么下面的高亮显示程序,总报空指针错误
package test;

import java.io.IOException;
import net.teamhot.lucene.ThesaurusAnalyzer;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.TermFreqVector;
import org.apache.lucene.index.TermPositionVector;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.search.highlight.TokenSources;

public class DynamicSummaryTest2 {
private String indexPath = "D:\\index";
private Analyzer analyzer;
private IndexSearcher searcher;
private String prefixHTML = "<font color='red'>";
private String suffixHTML = "</font>";
public DynamicSummaryTest2(){
   analyzer = new ThesaurusAnalyzer();
}
public void createIndex() throws IOException {
   IndexWriter writer = new IndexWriter(indexPath,analyzer,true);
   Document docA = new Document();
   String fileTextA = "挖掘频繁项集的方法可以扩展到挖掘闭频繁项集(由它们容易导出频繁项集的集合)。这些方法结合了附加的优化技术,如项合并、子项剪枝和项跳过,以及模式树中产生的项集的有效子集检查。挖掘频繁项集和关联已经用不同的方法扩展,包括挖掘多层关联规则和多维关联规则。多层关联规则可以根据每个抽象层的最小支持度阈值如何定义,使用多种策略挖掘。如一致的支持度、递减的支持度和基于分组的支持度。冗余的多层(后代)关联规则可以删除,如果根据其对应的祖先规则,他们的支持度和置信度接近于期望值的话。挖掘多维关联规则的技术可以根据对量化属性的处理分为若干类。第一,量化属性可以根据预定义的概念分层静态离散化。数据立方体非常适合这种方法,因为数据立方体和量化属性都可以利用概念分层。第二,可以挖掘量化关联规则,其中量化属性根据分箱和/或聚类动态离散化,“邻近的”关联规则可以用聚类合并,产生更简洁、更有意义的规则。基于约束的规则挖掘允许用户通过提供元规则(即模式模板)和其他挖掘约束对规则搜索聚焦。这种挖掘推动了说明性数据挖掘查询语言和用户界面的使用,并对挖掘查询优化提出了巨大挑战。规则约束可以分为五类:反单调的、单调的、简洁的、可转变的和不可转变的。前四类约束可以在频繁项集挖掘中使用,使挖掘更有功效,更有效率。没有进一步分析或领域知识,关联规则不应该直接用于预测。它们不必指示因果关系。然而,对于进一步探查,它们是有帮助的切入点,使得它们成为理解数据的流行工具。流数据不断地在计算机系统中流进流出并且具有变化的更新速度,涉及数据流的应用非常广泛。大纲提供数据流的汇总,通常用来返回查询的近似解答。随机抽样、滑动窗口、直方图、多分辨率方法、梗概以及随机算法都是大纲的形式。倾斜时间框架模型允许数据以多个时间粒度存储,最近的时间记录在最细的粒度上,最远的时间记录在最粗的粒度上。流立方体可以存储压缩的数据,对时间维度使用倾斜时间框架模型,并且仅在一些关键的层上存储数据,关键层反映了分析人员最感兴趣的数据层,从而基于到关键层的“常用路径”进行部分物化。";
   Field fieldA = new Field("contents", fileTextA, Field.Store.YES,Field.Index.TOKENIZED);
   docA.add(fieldA); 
  
   Document docB = new Document();
   String fileTextB = " 数据挖掘(Data Mining),又称为数据库中的知识发现(Knowledge Discovery in Database, KDD),就是从大量数据中获取有效的、新颖的、潜在有用的、最终可理解的模式的非平凡过程,简单的说,数据挖掘就是从大量数据中提取或“挖掘”知识。";
   Field fieldB = new Field("contents", fileTextB, Field.Store.YES,Field.Index.TOKENIZED);
   docB.add(fieldB); 
  
   writer.addDocument(docA);
   writer.addDocument(docB);
   writer.optimize();
   writer.close();
}
public void search(String fieldName,String keyword) throws CorruptIndexException, IOException, ParseException, InvalidTokenOffsetsException{
   searcher = new IndexSearcher(indexPath); 
   QueryParser queryParse = new QueryParser(fieldName, analyzer); 
   Query query = queryParse.parse(keyword); 
   Hits hits = searcher.search(query);
   for(int i=0;i<hits.length();i++){
    Document doc = hits.doc(i);
   String text = doc.get(fieldName);
   //System.out.println("||||||||||||"+text);
    int htmlLength = prefixHTML.length()+suffixHTML.length();
    System.out.println("高亮HTML的总长度为"+htmlLength); 
    SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter(prefixHTML, suffixHTML);    
//            Highlighter highlighter = new Highlighter(simpleHTMLFormatter,new QueryScorer(query));    
//            String highLightText = highlighter.getBestFragment(analyzer,"contents",text);
//    
//              Highlighter highlighter =new Highlighter(new QueryScorer(query));
              Highlighter highlighter =new Highlighter(simpleHTMLFormatter, new QueryScorer(query));
              highlighter.setTextFragmenter(new SimpleFragmenter(40));
//            for(int i1=0;i1<hits.length();i1++){
//                String text1 = hits.doc(i1).get(fieldName);
               int maxNumFragmentsRequired =2;
               String fragmentSeparator ="...";
               IndexReader reader = IndexReader.open(indexPath);
               
               TermPositionVector tpv = (TermPositionVector)reader.getTermFreqVector(hits.id(i),fieldName);
//              
               TokenStream tokenStream = TokenSources.getTokenStream(tpv,true);
//               TokenStream tokenStream = TokenSources.getAnyTokenStream(reader, hits.id(i), fieldName, analyzer);
               String result = highlighter.getBestFragment(tokenStream, text);
//               String[] result = highlighter.getBestFragments(analyzer, fieldName, text, maxNumFragmentsRequired);
               System.out.println("\t"+result);
//               
//               
////              }
//            System.out.println("★高亮显示第 "+(i+1) +" 条检索结果如下所示:"); 
//            System.out.println(highLightText); 
//            System.out.println("显示第 "+(i+1) +" 条检索结果摘要的长度为(含高亮HTML代码):"+highLightText.length()); 
   }
   searcher.close();
}

public static void main(String[] args) throws InvalidTokenOffsetsException {
DynamicSummaryTest2 ed = new DynamicSummaryTest2();
   try {
    ed.createIndex();
    ed.search("contents", "根据 挖掘");
   } catch (CorruptIndexException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   } catch (ParseException e) {
    e.printStackTrace();
   }
}
} --------------------编程问答-------------------- lucene里面提供了高亮显示的! --------------------编程问答-------------------- lucene 3.0 contribute里面有现成的
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,