﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-梦幻e家人-随笔分类-java全文检索</title><link>http://www.blogjava.net/dreamer/category/33571.html</link><description>java咖啡</description><language>zh-cn</language><lastBuildDate>Wed, 06 Aug 2008 07:18:32 GMT</lastBuildDate><pubDate>Wed, 06 Aug 2008 07:18:32 GMT</pubDate><ttl>60</ttl><item><title>Lucene关键字高亮显示</title><link>http://www.blogjava.net/dreamer/archive/2008/08/06/220383.html</link><dc:creator>轩辕</dc:creator><author>轩辕</author><pubDate>Wed, 06 Aug 2008 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/dreamer/archive/2008/08/06/220383.html</guid><wfw:comment>http://www.blogjava.net/dreamer/comments/220383.html</wfw:comment><comments>http://www.blogjava.net/dreamer/archive/2008/08/06/220383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dreamer/comments/commentRss/220383.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dreamer/services/trackbacks/220383.html</trackback:ping><description><![CDATA[<p>package searchfileexample;</p>
<p>import javax.servlet.*;<br />
import javax.servlet.http.*;<br />
import java.io.*;<br />
import java.io.IOException;<br />
import java.io.StringReader;</p>
<p>import org.apache.lucene.analysis.Analyzer;<br />
import org.apache.lucene.analysis.TokenStream;<br />
import org.apache.lucene.document.Document;<br />
import org.apache.lucene.document.Field;<br />
import org.apache.lucene.index.CorruptIndexException;<br />
import org.apache.lucene.index.IndexWriter;<br />
import org.apache.lucene.queryParser.ParseException;<br />
import org.apache.lucene.queryParser.QueryParser;<br />
import org.apache.lucene.search.Hits;<br />
import org.apache.lucene.search.IndexSearcher;<br />
import org.apache.lucene.search.Query;<br />
import org.apache.lucene.search.highlight.Highlighter;<br />
import org.apache.lucene.search.highlight.QueryScorer;<br />
import org.apache.lucene.search.highlight.SimpleFragmenter;<br />
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;<br />
import org.apache.lucene.analysis.standard.StandardAnalyzer;</p>
<p><br />
public class MyHighLighterServlet extends HttpServlet {<br />
&nbsp; private static final String CONTENT_TYPE = "text/html; charset=GB18030";</p>
<p>&nbsp; private String indexPath = "C:\\index";<br />
&nbsp; private Analyzer analyzer;<br />
&nbsp; private IndexSearcher searcher;</p>
<p>&nbsp; //Initialize global variables<br />
&nbsp; public void init() throws ServletException {<br />
&nbsp;&nbsp;&nbsp; analyzer = new StandardAnalyzer();<br />
&nbsp; }<br />
&nbsp; public void createIndex() throws IOException {&nbsp;&nbsp; // 该方法建立索引<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IndexWriter writer = new IndexWriter(indexPath,analyzer,true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document docA = new Document();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileTextA = "因为火烧云总是燃烧着消失在太阳冲下地平线的时刻，然后便是宁静的自然的天籁，没有谁会在这样的时光的镜片里伤感自语，因为灿烂给人以安静的舒适感。";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field fieldA = new Field("contents", fileTextA, Field.Store.YES,Field.Index.TOKENIZED);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; docA.add(fieldA); <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document docB = new Document();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileTextB = "因为带有以伤痕为代价的美丽风景总是让人不由地惴惴不安，紧接着袭面而来的抑或是病痛抑或是灾难，没有谁会能够安逸着恬然，因为模糊让人撕心裂肺地想呐喊。";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field fieldB = new Field("contents", fileTextB, Field.Store.YES,Field.Index.TOKENIZED);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; docB.add(fieldB); <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document docC = new Document();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileTextC = "我喜欢上了一个人孤独地行游，在梦与海洋的交接地带炽烈燃烧着。"+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "因为，一条孤独的鱼喜欢上了火焰的颜色，真是荒唐地不合逻辑,原因。";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Field fieldC = new Field("contents", fileTextC, Field.Store.YES,Field.Index.TOKENIZED);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; docC.add(fieldC); <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.addDocument(docA);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.addDocument(docB);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.addDocument(docC);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.optimize();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.close();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void search(String fieldName,String keyword,PrintWriter out) throws CorruptIndexException, IOException, ParseException{&nbsp;&nbsp; // 检索的方法，并实现高亮显示<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searcher = new IndexSearcher(indexPath); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueryParser queryParse = new QueryParser(fieldName, analyzer);&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp; 构造QueryParser，解析用户输入的检索关键字<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query query = queryParse.parse(keyword); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hits hits = searcher.search(query);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;hits.length();i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document doc = hits.doc(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String text = doc.get(fieldName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("&lt;font color='red'&gt;", "&lt;/font&gt;");&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Highlighter highlighter = new Highlighter(simpleHTMLFormatter,new QueryScorer(query));&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; highlighter.setTextFragmenter(new SimpleFragmenter(text.length()));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (text != null) {&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TokenStream tokenStream = analyzer.tokenStream(fieldName,new StringReader(text));&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String highLightText = highlighter.getBestFragment(tokenStream, text); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("★高亮显示第 "+(i+1) +" 条检索结果如下所示："); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println(highLightText);&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searcher.close();<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp; //Process the HTTP Get request<br />
&nbsp; public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<br />
&nbsp;&nbsp;&nbsp; response.setContentType(CONTENT_TYPE);<br />
&nbsp;&nbsp;&nbsp; PrintWriter out = response.getWriter();<br />
&nbsp;&nbsp;&nbsp; out.println("&lt;html&gt;");<br />
&nbsp;&nbsp;&nbsp; out.println("&lt;head&gt;&lt;title&gt;MyHighLighterServlet&lt;/title&gt;&lt;/head&gt;");<br />
&nbsp;&nbsp;&nbsp; out.println("&lt;body bgcolor=\"#ffffff\"&gt;");</p>
<p>&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createIndex();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; search("contents", "因为",out);<br />
&nbsp;&nbsp;&nbsp;&nbsp; } catch (CorruptIndexException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp; } catch (ParseException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; out.println("&lt;/body&gt;&lt;/html&gt;");<br />
&nbsp; }</p>
<p>&nbsp; //Clean up resources<br />
&nbsp; public void destroy() {<br />
&nbsp; }<br />
}</p>
<img src ="http://www.blogjava.net/dreamer/aggbug/220383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dreamer/" target="_blank">轩辕</a> 2008-08-06 11:22 <a href="http://www.blogjava.net/dreamer/archive/2008/08/06/220383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>