﻿<?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-大漠驼铃-随笔分类-lucene</title><link>http://www.blogjava.net/nkjava/category/38040.html</link><description>置身浩瀚的草原，方向最为重要，希望此blog能向大漠驼铃一样，给我方向和指引。</description><language>zh-cn</language><lastBuildDate>Tue, 03 Mar 2009 08:21:30 GMT</lastBuildDate><pubDate>Tue, 03 Mar 2009 08:21:30 GMT</pubDate><ttl>60</ttl><item><title>Lucene 索引数据库2</title><link>http://www.blogjava.net/nkjava/archive/2009/03/03/257586.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Tue, 03 Mar 2009 08:01:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/03/03/257586.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/257586.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/03/03/257586.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/257586.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/257586.html</trackback:ping><description><![CDATA[Lucene，作为一种全文搜索的辅助工具，为我们进行条件搜索，无论是像Google,Baidu之类的搜索引擎，还是论坛中的搜索功能，还是其它
C/S架构的搜索，都带来了极大的便利和比较高的效率。本文主要是利用Lucene对MS Sql Server
2000进行建立索引，然后进行全文索引。至于数据库的内容，可以是网页的内容，还是其它的。本文中数据库的内容是图书馆管理系统中的某个作者表
－Authors表。
<p>　　因为考虑到篇幅的问题，所以该文不会讲的很详细，也不可能讲的很深。</p>
<p>　　本文以这样的结构进行：</p>
<p>　　1.介绍数据库中Authors表的结构</p>
<p>　　2.为数据库建立索引</p>
<p>　　3.为数据库建立查询功能</p>
<p>　　4.在web界面下进行查询并显示结果</p>
<p>　　1．介绍数据库中Authors表的结构</p>
<p>字段名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字段类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字段含义</p>
<p>Au_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Varchar(11)&nbsp;&nbsp;&nbsp; 作者号<br />
Au_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Varchar(60)&nbsp;&nbsp;&nbsp;&nbsp; 作者名<br />
Phone&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Char(12)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 电话号码<br />
Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Varchar(40)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 地址<br />
City&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Varchar(20)&nbsp;&nbsp;&nbsp;&nbsp; 城市<br />
State&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Char(2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 省份<br />
Zip&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Char(5)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 邮编<br />
contract&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bit(1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 外键（关系不大）</p>
<p><br />
表中的部分内容：<br />
&nbsp;</p>
<p>　　2．为数据库建立索引</p>
<p>　　首先建立一个类TestLucene.java。这个类就是对数据库进行建立索引，编写查询条件等。</p>
<p>　　当然，最开始就是建立数据库连接。连接代码这里就省略了。^_^</p>
<p>　　接着，新建一个方法getResutl(String),它返回的是数据库表Authors的内容。具体代码如下：</p>
<p><br />
&nbsp;&nbsp;&nbsp; public ResultSet getResult(String sql){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement stmt = conn.createStatement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs = stmt.executeQuery(sql);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rs;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(SQLException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;</p>
<p><br />
然后，为数据库建立索引。</p>
<p>　　首先要定义一个IndexWriter（），它是将索引写进Lucene自己的数据库中，它存放的位置是有你自己定义的。在定义
IndexWriter是需要指定它的分析器。Lucene自己自带有几个分析器，例
如：StandarAnalyzer(),SimpleAnalyzer(),StopAnalyzer()等。它作用是对文本进行分析，判断如何进行切
词。<br />
接着，要定义一个Document。Document相当于二维表中一行数据一样。Document里包含的是Field字段，Field相当于数据库中一列，也就是一个属性，一个字段。<br />
最后应该对IndexWriter进行优化，方法很简单，就是writer.optimize().<br />
具体代码如下：</p>
<p><br />
&nbsp; public void Index(ResultSet rs){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IndexWriter writer = new IndexWriter("d:/index/", getAnalyzer(), true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(rs.next()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document doc=new Document();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.Keyword("id",rs.getString("au_id")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.Text("name",rs.getString("au_name")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.UnIndexed("address",rs.getString("address")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.UnIndexed("phone",rs.getString("phone")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.Text("City",rs.getString("city")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.addDocument(doc);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.optimize();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(IOException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(SQLException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; public Analyzer getAnalyzer(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new StandardAnalyzer();<br />
&nbsp;&nbsp;&nbsp; }</p>
<p><br />
3．为数据库建立查询功能</p>
<p>　　在类TestLucene中建立一个新的方法searcher(String)，它返回的是一个搜索的结构集，相当于数据库中的ResultSet一样。它代的参数是你要查询的内容。这里，我把要查询的字段写死了。你可以在添加一个参数表示要查询的字段。<br />
这里主要有两个对象IndexSearcher和Query。IndexSearcher是找到索引数据库，Query是处理搜索，它包含了三个参数：查询内容，查询字段，分析器。<br />
具体代码如下：</p>
<p><br />
&nbsp; public Hits seacher(String queryString){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hits hits=null;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IndexSearcher is = new IndexSearcher("D:/index/");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query query=QueryParser.parse(queryString,"City",getAnalyzer());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hits=is.search(query);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return hits;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;</p>
<p><br />
4．在web界面下进行查询并显示结果</p>
<p>　　这里建立一个Jsp页面TestLucene.jsp进行搜索。</p>
<p>　　在TestLucene.jsp页面中首先引入类</p>
<p><br />
&lt;%@ page import="lucenetest.LucentTest"%&gt;<br />
&lt;%@ page import="org.apache.lucene.search.*,org.apache.lucene.document.*" %&gt;<br />
&nbsp;</p>
<p><br />
然后定义一个LuceneTest对象，获取查询结果集：</p>
<p><br />
&nbsp; LucentTest lucent=new LucentTest();<br />
&nbsp; Hits hits=lucent.seacher(request.getParameter("queryString"));<br />
&nbsp;</p>
<p><br />
定义一个Form，建立一个查询环境：</p>
<p><br />
&lt;form action="TestLucene.jsp"&gt;<br />
&nbsp; &lt;input&nbsp; type="text" name="queryString"/&gt;<br />
&nbsp; &lt;input type="submit" value="搜索"/&gt;<br />
&lt;/form&gt;<br />
&nbsp;</p>
<p><br />
显示查询结果：</p>
<p><br />
&lt;table&gt;<br />
&nbsp; &lt;%if(hits!=null){%&gt;<br />
&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;作者号&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;作者名&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;地址&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;电话号码&lt;/td&gt;<br />
&nbsp; &lt;/tr&gt; </p>
<p>&nbsp;&lt;% for(int i=0;i&lt;hits.length();i++){<br />
&nbsp;&nbsp;&nbsp; Document doc=hits.doc(i);<br />
&nbsp;&nbsp; %&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%=doc.get("id") %&gt;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%=doc.get("name") %&gt;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%=doc.get("address") %&gt;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%=doc.get("phone") %&gt;&lt;/td&gt;<br />
&nbsp; &lt;/tr&gt;<br />
&nbsp;&lt;% }}%&gt;<br />
&lt;/table&gt;</p>
<img src ="http://www.blogjava.net/nkjava/aggbug/257586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-03-03 16:01 <a href="http://www.blogjava.net/nkjava/archive/2009/03/03/257586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Lucene索引数据库</title><link>http://www.blogjava.net/nkjava/archive/2009/03/03/257582.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Tue, 03 Mar 2009 07:57:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/03/03/257582.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/257582.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/03/03/257582.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/257582.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/257582.html</trackback:ping><description><![CDATA[(转)http://www.wujianrong.com/archives/2007/03/lucene_7.html<br />
&nbsp;1.写一段传统的JDBC程序，讲每条的用户信息从数据库读取出来<br />
2.针对每条用户记录，建立一个lucene document <br />
Document doc = new Document();<br />
并根据你的需要，将用户信息的各个字段对应luncene document中的field 进行添加，如： <br />
doc.add(new Field("NAME","USERNAME",Field.Store.YES,Field.Index.UN_TOKENIZED));<br />
然后将该条doc加入到索引中， 如： luceneWriter.addDocument(doc);<br />
这样就建立了lucene的索引库<br />
3.编写对索引库的搜索程序（看lucene文档），通过对lucene的索引库的查找，你可以快速找到对应记录的ID<br />
4.通过ID到数据库中查找相关记录
<div>
<div><font style="font-weight: bold;" size="4">用Lucene索引数据库</font><br />
<br />
Lucene，作为一种全文搜索的辅助工具，为我们进行条件搜索，无论是像Google,Baidu之类的搜索引擎，还是论坛中的搜索功能，还是其它
C/S架构的搜索，都带来了极大的便利和比较高的效率。本文主要是利用Lucene对MS Sql Server
2000进行建立索引，然后进行全文索引。至于数据库的内容，可以是网页的内容，还是其它的。本文中数据库的内容是图书馆管理系统中的某个作者表－
Authors表。 </div>
<p>　　因为考虑到篇幅的问题，所以该文不会讲的很详细，也不可能讲的很深。</p>
<p>　　本文以这样的结构进行：</p>
<p>　　1.介绍数据库中Authors表的结构</p>
<p>　　2.为数据库建立索引</p>
<p>　　3.为数据库建立查询功能</p>
<p>　　4.在web界面下进行查询并显示结果</p>
<p>　　1．介绍数据库中Authors表的结构</p>
<p>字段名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字段类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字段含义</p>
<p>Au_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Varchar(11)&nbsp;&nbsp;&nbsp; 作者号<br />
Au_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Varchar(60)&nbsp;&nbsp;&nbsp;&nbsp; 作者名<br />
Phone&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Char(12)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 电话号码<br />
Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Varchar(40)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 地址<br />
City&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Varchar(20)&nbsp;&nbsp;&nbsp;&nbsp; 城市<br />
State&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Char(2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 省份<br />
Zip&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Char(5)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 邮编<br />
contract&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bit(1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 外键（关系不大）<br />
<br />
表中的部分内容：&nbsp;</p>
<p>　　2．为数据库建立索引</p>
<p>　　首先建立一个类TestLucene.java。这个类就是对数据库进行建立索引，编写查询条件等。</p>
<p>　　当然，最开始就是建立数据库连接。连接代码这里就省略了。^_^</p>
<p>　　接着，新建一个方法getResutl(String),它返回的是数据库表Authors的内容。具体代码如下：</p>
<p>&nbsp;&nbsp;&nbsp; public ResultSet getResult(String sql){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement stmt = conn.createStatement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs = stmt.executeQuery(sql);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rs;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(SQLException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
然后，为数据库建立索引。</p>
<p>　　首先要定义一个IndexWriter（），它是将索引写进Lucene自己的数据库中，它存放的位置是有你自己定义的。在定义
IndexWriter
是需要指定它的分析器。Lucene自己自带有几个分析器，例如：StandarAnalyzer(),SimpleAnalyzer(),
StopAnalyzer()等。它作用是对文本进行分析，判断如何进行切词。<br />
接着，要定义一个Document。Document相当于二维表中一行数据一样。Document里包含的是Field字段，Field相当于数据库中一列，也就是一个属性，一个字段。<br />
最后应该对IndexWriter进行优化，方法很简单，就是writer.optimize().<br />
具体代码如下：<br />
<br />
&nbsp; public void Index(ResultSet rs){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IndexWriter writer = new IndexWriter("d:/index/", getAnalyzer(), true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(rs.next()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document doc=new Document();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.Keyword("id",rs.getString("au_id")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.Text("name",rs.getString("au_name")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.UnIndexed("address",rs.getString("address")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.UnIndexed("phone",rs.getString("phone")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.Text("City",rs.getString("city")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.addDocument(doc);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.optimize();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(IOException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(SQLException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; public Analyzer getAnalyzer(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new StandardAnalyzer();<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
3．为数据库建立查询功能</p>
<p>　　在类TestLucene中建立一个新的方法searcher(String)，它返回的是一个搜索的结构集，相当于数据库中的ResultSet一样。它代的参数是你要查询的内容。这里，我把要查询的字段写死了。你可以在添加一个参数表示要查询的字段。<br />
这里主要有两个对象IndexSearcher和Query。IndexSearcher是找到索引数据库，Query是处理搜索，它包含了三个参数：查询内容，查询字段，分析器。<br />
具体代码如下：<br />
<br />
&nbsp; public Hits seacher(String queryString){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hits hits=null;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IndexSearcher is = new IndexSearcher("D:/index/");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query query=QueryParser.parse(queryString,"City",getAnalyzer());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hits=is.search(query);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return hits;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
4．在web界面下进行查询并显示结果</p>
<p>　　这里建立一个Jsp页面TestLucene.jsp进行搜索。</p>
<p>　　在TestLucene.jsp页面中首先引入类</p>
<p><br />
&lt;%@ page import="lucenetest.LucentTest"%&gt;<br />
&lt;%@ page import="org.apache.lucene.search.*,org.apache.lucene.document.*" %&gt; <br />
</p>
<p>　　然后定义一个LuceneTest对象，获取查询结果集：<br />
<br />
&nbsp; LucentTest lucent=new LucentTest();<br />
&nbsp; Hits hits=lucent.seacher(request.getParameter("queryString"));<br />
<br />
定义一个Form，建立一个查询环境：<br />
<br />
&lt;form action="TestLucene.jsp"&gt;<br />
&nbsp; &lt;input&nbsp; type="text" name="queryString"/&gt;<br />
&nbsp; &lt;input type="submit" value="搜索"/&gt;<br />
&lt;/form&gt;<br />
<br />
显示查询结果：<br />
<br />
&lt;table&gt;<br />
&nbsp; &lt;%if(hits!=null){%&gt;<br />
&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;作者号&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;作者名&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;地址&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;电话号码&lt;/td&gt;<br />
&nbsp; &lt;/tr&gt; </p>
<p>&nbsp;&lt;% for(int i=0;i&lt;hits.length();i++){<br />
&nbsp;&nbsp;&nbsp; Document doc=hits.doc(i);<br />
&nbsp;&nbsp; %&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%=doc.get("id") %&gt;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%=doc.get("name") %&gt;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%=doc.get("address") %&gt;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%=doc.get("phone") %&gt;&lt;/td&gt;<br />
&nbsp; &lt;/tr&gt;<br />
&nbsp;&lt;% }}%&gt;<br />
&lt;/table&gt;<br />
</p>
<p><font size="4">用Lucene-1.3-final为网站数据库建立索引</font></p>
<p><font color="#333333">下是看了lnboy写的《用lucene建立大富翁论坛的全文检索》后写的测试代码。<br />
&nbsp; <br />
为数据库cwb.mdb建立全文索引的indexdb.jsp&nbsp;<br />
<br />
&lt;%@&nbsp;page&nbsp;import&nbsp;="org.apache.lucene.analysis.standard.*"&nbsp;%&gt;&nbsp;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;import="org.apache.lucene.index.*"&nbsp;%&gt;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;import="org.apache.lucene.document.*"&nbsp;%&gt;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;import="lucene.*"&nbsp;%&gt;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;contentType="text/html;&nbsp;charset=GBK"&nbsp;%&gt;&nbsp; <br />
&lt;%&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;start&nbsp;=&nbsp;System.currentTimeMillis();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;aa=getServletContext().getRealPath("/")+"index";&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexWriter&nbsp;writer&nbsp;=&nbsp;new&nbsp;IndexWriter(aa,&nbsp;new&nbsp;StandardAnalyzer(),&nbsp;true);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();&nbsp;</font></p>
<font color="#333333">&nbsp;String&nbsp;url&nbsp;=&nbsp;"jdbc:odbc:driver={Microsoft&nbsp;Access&nbsp;Driver&nbsp;(*.mdb)}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;DBQ=d:""Tomcat&nbsp;5.0""webapps""zz3zcwbwebhome""WEB-INF""cwb.mdb";&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;DriverManager.getConnection(url);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;stmt&nbsp;=&nbsp;conn.createStatement();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;stmt.executeQuery(&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"select&nbsp;Article_id,Article_name,Article_intro&nbsp;from&nbsp;Article");&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(rs.next())&nbsp;{&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.addDocument(mydocument.Document(rs.getString("Article_id"),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;rs.getString("Article_name"),rs.getString("Article_intro")));&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.close();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stmt.close();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close();&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("索引创建完毕");&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.optimize();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.close();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.print(System.currentTimeMillis()&nbsp;-&nbsp;start);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&nbsp;total&nbsp;milliseconds");&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&nbsp;出错了&nbsp;"&nbsp;+&nbsp;e.getClass()&nbsp;+&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;""n&nbsp;错误信息为:&nbsp;"&nbsp;+&nbsp;e.getMessage());&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br />
&nbsp;%&gt;&nbsp; <br />
<br />
用于显示查询结果的aftsearch.jsp&nbsp; <br />
&lt;%@&nbsp;page&nbsp;import="org.apache.lucene.search.*"&nbsp;%&gt;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;import="org.apache.lucene.document.*"&nbsp;%&gt;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;import="lucene.*"&nbsp;%&gt;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;import&nbsp;=&nbsp;"org.apache.lucene.analysis.standard.*"&nbsp;%&gt;&nbsp;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;import="org.apache.lucene.queryParser.QueryParser"&nbsp;%&gt;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;contentType="text/html;&nbsp;charset=GBK"&nbsp;%&gt;&nbsp; <br />
&lt;%&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;keyword=request.getParameter("keyword");&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyword=new&nbsp;String(keyword.getBytes("ISO8859_1"));&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(keyword);&nbsp; <br />
&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;aa=getServletContext().getRealPath("/")+"index";&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Searcher&nbsp;searcher&nbsp;=&nbsp;new&nbsp;IndexSearcher(aa);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;=&nbsp;QueryParser.parse(keyword,&nbsp;"Article_name",&nbsp;new&nbsp;StandardAnalyzer());&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("正在查找:&nbsp;"&nbsp;+&nbsp;query.toString("Article_name")+"&lt;br&gt;");&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hits&nbsp;hits&nbsp;=&nbsp;searcher.search(query);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(hits.length()&nbsp;+&nbsp;"&nbsp;total&nbsp;matching&nbsp;documents");&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.text.NumberFormat&nbsp;format&nbsp;=&nbsp;java.text.NumberFormat.getNumberInstance();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;hits.length();&nbsp;i++)&nbsp;{&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开始输出查询结果&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;=&nbsp;hits.doc(i);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(doc.get("Article_id"));&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("准确度为："&nbsp;+&nbsp;format.format(hits.score(i)&nbsp;*&nbsp;100.0)&nbsp;+&nbsp;"%");&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(doc.get("Article_name")+"&lt;br&gt;");&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;out.println(doc.get("Article_intro"));&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;}catch&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&nbsp;出错了&nbsp;"&nbsp;+&nbsp;e.getClass()&nbsp;+""n&nbsp;错误信息为:&nbsp;"&nbsp;+&nbsp;e.getMessage());&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br />
%&gt;&nbsp; <br />
<br />
辅助类：&nbsp; <br />
package&nbsp;lucene;&nbsp; <br />
import&nbsp;org.apache.lucene.document.Document;&nbsp; <br />
import&nbsp;org.apache.lucene.document.Field;&nbsp; <br />
import&nbsp;org.apache.lucene.document.DateField;&nbsp; <br />
<br />
public&nbsp;class&nbsp;mydocument&nbsp;{&nbsp; <br />
public&nbsp;static&nbsp;Document&nbsp;Document(String&nbsp;Article_id,String&nbsp;Article_name,String&nbsp;Article_intro){&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;=&nbsp;new&nbsp;Document();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Keyword("Article_id",&nbsp;Article_id));&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Text("Article_name",&nbsp;Article_name));&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Text("Article_intro",&nbsp;Article_intro));&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;doc;&nbsp; <br />
&nbsp;&nbsp;}&nbsp; <br />
&nbsp;&nbsp;public&nbsp;mydocument()&nbsp;{&nbsp; <br />
&nbsp;&nbsp;}&nbsp; <br />
} <br />
<br />
</font><font style="font-weight: bold;" size="4">用lucene为数据库搜索建立增量索引</font><font color="#333333"><br />
</font>
<p>用&nbsp;lucene&nbsp;建立索引不可能每次都重新开始建立,而是按照新增加的记录,一次次的递增<br />
建立索引的IndexWriter类,有三个参数&nbsp;<br />
</p>
<div><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /><span style="color: #000000;">IndexWriter&nbsp;writer&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IndexWriter(path,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StandardAnalyzer(),isEmpty);</span></div>
<span style="font-size: 10pt;"><br />
其中第三个参数是bool型的,指定它可以确定是增量索引,还是重建索引.<br />
对于从数据库中读取的记录,譬如要为文章建立索引,我们可以记录文章的id号,然后下次再次建立索引的时候读取存下的id号,从此id后往下继续增加索引,逻辑如下.<br />
<br />
建立增量索引,主要代码如下<br />
</span>
<div><span style="font-size: 10pt;"><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;createIndex(String&nbsp;path)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;myStatement&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;articleId</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">0</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">读取文件,获得文章id号码,这里只存最后一篇索引的文章id</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileReader&nbsp;fr&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileReader(</span><span style="color: #000000;">"</span><span style="color: #000000;">**.txt</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;br&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BufferedReader(fr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;articleId</span><span style="color: #000000;">=</span><span style="color: #000000;">br.readLine();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(articleId</span><span style="color: #000000;">==</span><span style="color: #0000ff;">null</span><span style="color: #000000;">||</span><span style="color: #000000;">articleId</span><span style="color: #000000;">==</span><span style="color: #000000;">""</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;articleId</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">0</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;br.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fr.close();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">error343!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">sql语句,根据id读取下面的内容</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sqlText&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #000000;">"</span><span style="color: #000000;">*****</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">articleId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStatement&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;conn.createStatement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;myStatement.executeQuery(sqlText);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">写索引</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(rs.next())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Document();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Keyword(</span><span style="color: #000000;">"</span><span style="color: #000000;">**</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;DateAdded));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Keyword(</span><span style="color: #000000;">"</span><span style="color: #000000;">**</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;articleid));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">**</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;URL));&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">**</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Content));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">**</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Title));&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.addDocument(doc);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(IOException&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">将我索引的最后一篇文章的id写入文件</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileWriter&nbsp;fw&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileWriter(</span><span style="color: #000000;">"</span><span style="color: #000000;">**.txt</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;out&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PrintWriter(fw);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fw.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ind.Close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">ok.end</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(SQLException&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">数据库关闭操作</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
然后控制是都建立增量索引的时候根据能否都到id值来设置IndexWriter的第三个参数为true&nbsp;或者是false<br />
<br />
<div>&nbsp;<span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isEmpty&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;FileReader&nbsp;fr&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileReader(</span><span style="color: #000000;">"</span><span style="color: #000000;">**.txt</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;br&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BufferedReader(fr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(br.readLine()</span><span style="color: #000000;">!=</span>&nbsp;<span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isEmpty&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;br.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fr.close();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;writer&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IndexWriter(Directory,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StandardAnalyzer(),isEmpty);</span></div>
</div>
<img src ="http://www.blogjava.net/nkjava/aggbug/257582.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-03-03 15:57 <a href="http://www.blogjava.net/nkjava/archive/2009/03/03/257582.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Lucene索引查询分页实例</title><link>http://www.blogjava.net/nkjava/archive/2009/03/03/257581.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Tue, 03 Mar 2009 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/03/03/257581.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/257581.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/03/03/257581.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/257581.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/257581.html</trackback:ping><description><![CDATA[<p>一、输入关键字的lucene.html<br />
&lt;html&gt;<br />
&lt;body&gt;<br />
&lt;form name="form1" method="post" action="search.jsp"&gt;<br />
&nbsp;&nbsp;&nbsp;请输入关键字：&lt;input type="text" name="keyword"&gt;<br />
&nbsp;&nbsp;&lt;input type="submit" name="Submit" value="提交"&gt;<br />
&lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>&nbsp;二、进行搜索和显示结果的search.jsp &lt;%@ page contentType="text/html; charset=gb2312" %&gt;<br />
&lt;%@ page import="java.util.*" %&gt;<br />
&lt;%@ page import="java.text.SimpleDateFormat" %&gt;<br />
&lt;%@ page import = "org.apache.lucene.analysis.standard.StandardAnalyzer" %&gt; <br />
&lt;%@ page import="org.apache.lucene.index.IndexReader" %&gt;<br />
&lt;%@ page import="org.apache.lucene.document.Document" %&gt;<br />
&lt;%@ page import="org.apache.lucene.search.IndexSearcher" %&gt; <br />
&lt;%@ page import="org.apache.lucene.search.Hits" %&gt; <br />
&lt;%@ page import="org.apache.lucene.search.Query" %&gt; <br />
&lt;%@ page import="page.Pagination" %&gt; &lt;%@ page import="org.apache.lucene.queryParser.QueryParser" %&gt; <br />
&lt;%@ page import ="org.apache.lucene.analysis.Analyzer" %&gt;<br />
&lt;% <br />
</p>
<pre>  String queryString = request.getParameter("keyword");  <br />
<br />
if (queryString == null||queryString.length()==0){<br />
out.println("搜索关键字不能为空");<br />
<br />
}else{<br />
queryString=new String(queryString.getBytes("ISO8859_1"));<br />
String indexPath=getServletContext().getRealPath("/")+"index";    <br />
boolean error = false;    <br />
Document doc;            <br />
<br />
IndexSearcher searcher = null;         <br />
Query query = null;                    <br />
Hits hits = null;                      <br />
<br />
try {<br />
searcher = new IndexSearcher(IndexReader.open(indexPath));<br />
} catch (Exception e) {                         <br />
out.print("没有找到索引文件！");<br />
out.print(e.getMessage());   <br />
error = true;                                <br />
}<br />
if (error == false) {                                          <br />
Analyzer analyzer = new StandardAnalyzer();<br />
try {<br />
query = QueryParser.parse(queryString, "Article_name", analyzer);  <br />
} catch (Exception e) {                         <br />
out.print(e.getMessage());<br />
error = true;                                 <br />
<br />
}<br />
}<br />
if (error == false &amp;&amp; searcher != null) {                     <br />
<br />
hits = searcher.search(query);                        <br />
if (hits.length() == 0) { <br />
out.print("<font color="red">对不起！没有找到你所需要的资源.</font> ");<br />
error = true;                                        <br />
}<br />
}<br />
if (error == false &amp;&amp; searcher != null) {   <br />
out.print("<font color="red">搜索关键字：</font>"+ queryString+ "");  <br />
//Pagination类是网上下载的，需要传递一个向量，你可以改,这样就不用做二遍事  <br />
Vector list=new Vector();<br />
for(int i=0;i&lt; hits.length();i++){<br />
doc = hits.doc(i);     <br />
list.add(doc);<br />
}    <br />
<br />
out.print("<font color="red">找到的资源</font>");<br />
Pagination pagination = null;<br />
String pageNumber = request.getParameter("pageNumber");<br />
<br />
int showItemNumber = 10;<br />
if (pageNumber == null) {<br />
pageNumber = "1";<br />
}<br />
String HTML = "";<br />
if (list != null &amp;&amp; list.size() &gt; 0) {<br />
pagination = new Pagination(); <br />
pagination.setPageNumber(Integer.parseInt(pageNumber));<br />
pagination.setShowItemNumber(showItemNumber);<br />
pagination.setVisitPageURL("search.jsp?keyword="+queryString);<br />
list =(Vector) pagination.interceptListByStarItemNumber(list);<br />
for(int i=0;i&lt; list.size();i++)<br />
{<br />
doc =(Document) list.get(i);     <br />
String A_id=doc.get("Article_id");               <br />
String doctitle = doc.get("Article_name");            <br />
String url = doc.get("File_name")+"?id="+A_id;                   <br />
<br />
out.print("&lt; a href='http://127.0.0.1:8080/cwbwebhome/"+url+"'&gt;(★) "+doctitle+"");<br />
}<br />
HTML = pagination.buildHTML("600");<br />
out.print(HTML);<br />
}<br />
}       <br />
<br />
}</pre>
<img src ="http://www.blogjava.net/nkjava/aggbug/257581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-03-03 15:56 <a href="http://www.blogjava.net/nkjava/archive/2009/03/03/257581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene基本使用介绍</title><link>http://www.blogjava.net/nkjava/archive/2009/03/03/257504.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Tue, 03 Mar 2009 03:35:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/03/03/257504.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/257504.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/03/03/257504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/257504.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/257504.html</trackback:ping><description><![CDATA[<div>
<p>本文的
目的不在于对Lucene的概念和设计这些进行介绍，仅在于介绍怎么样去使用Lucene来达到自己想要的几种常见的全文检索的需求，如果想深入了解
Lucene的话本文不会带给你什么收获的。看完本文后想更深入的了解Lucene请访问：http://lucene.apache.org</p>
</div>
<p><strong><span style="font-size: 14pt; line-height: 150%;">一.&nbsp;</span></strong><strong><span style="font-size: 14pt; line-height: 150%; font-family: 宋体;">概述</span></strong><br />
</p>
<p style="margin: 0cm 0cm 0pt 21pt; line-height: 150%;" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体;">随着系统信息的越来越多，怎么样从这些信息海洋中捞起自己想要的那一根针就变得非常重要了，全文检索是通常用于解决此类问题的方案，而</span><span style="line-height: 150%;">Lucene</span><span style="line-height: 150%; font-family: 宋体;">则为实现全文检索的工具，任何应用都可通过嵌入它来实现全文检索。</span></p>
<br />
<p style="margin: 0cm 0cm 0pt 21.25pt; text-indent: -21.25pt; line-height: 150%;" class="MsoNormal"><strong><span style="font-size: 14pt; line-height: 150%;">二.&nbsp;</span></strong><strong><span style="font-size: 14pt; line-height: 150%; font-family: 宋体;">环境搭建</span></strong></p>
<br />
<p style="margin: 0cm 0cm 0pt 21pt; line-height: 150%;" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体;">从</span><span style="line-height: 150%;">lucene.apache.org</span><span style="line-height: 150%; font-family: 宋体;">上下载最新版本的</span><span style="line-height: 150%;">lucene.jar</span><span style="line-height: 150%; font-family: 宋体;">，将此</span><span style="line-height: 150%;">jar</span><span style="line-height: 150%; font-family: 宋体;">作为项目的</span><span style="line-height: 150%;">build path</span><span style="line-height: 150%; font-family: 宋体;">，那么在项目中就可以直接使用</span><span style="line-height: 150%;">lucene</span><span style="line-height: 150%; font-family: 宋体;">了。</span></p>
<br />
<p style="margin: 0cm 0cm 0pt 21.25pt; text-indent: -21.25pt; line-height: 150%;" class="MsoNormal"><strong><span style="font-size: 14pt; line-height: 150%;">三.&nbsp;</span></strong><strong><span style="font-size: 14pt; line-height: 150%; font-family: 宋体;">使用说明</span></strong></p>
<br />
<p style="margin: 0cm 0cm 0pt 1cm; text-indent: -1cm; line-height: 150%;" class="MsoNormal"><strong><span style="font-size: 12pt; line-height: 150%;">3.1.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">基本概念</span></strong></p>
<br />
<p style="margin: 0cm 0cm 0pt 1cm; line-height: 150%;" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体;">这里介绍的主要为在使用中经常碰到一些概念，以大家都比较熟悉的数据库来进行类比的讲解，使用</span><span style="line-height: 150%;">Lucene</span><span style="line-height: 150%; font-family: 宋体;">进行全文检索的过程有点类似数据库的这个过程，</span><span style="line-height: 150%;">table---</span><span style="line-height: 150%; font-family: Wingdings;">&#224;</span><span style="line-height: 150%; font-family: 宋体;">查询相应的字段或查询条件</span><span style="line-height: 150%;">----</span><span style="line-height: 150%; font-family: Wingdings;">&#224;</span><span style="line-height: 150%; font-family: 宋体;">返回相应的记录，首先是</span><strong><span style="color: blue; line-height: 150%;">IndexWriter</span></strong><span style="line-height: 150%; font-family: 宋体;">，通过它建立相应的索引表，相当于数据库中的</span><span style="line-height: 150%;">table</span><span style="line-height: 150%; font-family: 宋体;">，在构建此索引表时需指定的为该索引表采用何种方式进行构建，也就是说对于其中的记录的字段以什么方式来进行格式的划分，这个在</span><span style="line-height: 150%;">Lucene</span><span style="line-height: 150%; font-family: 宋体;">中称为</span><strong><span style="color: blue; line-height: 150%;">Analyzer</span></strong><span style="line-height: 150%; font-family: 宋体;">，</span><span style="line-height: 150%;">Lucene</span><span style="line-height: 150%; font-family: 宋体;">提供了几种环境下使用的</span><span style="line-height: 150%;">Analyzer</span><span style="line-height: 150%; font-family: 宋体;">：</span><span style="line-height: 150%;">SimpleAnalyzer</span><span style="line-height: 150%; font-family: 宋体;">、</span><span style="line-height: 150%;">StandardAnalyzer</span><span style="line-height: 150%; font-family: 宋体;">、</span><span style="line-height: 150%;">GermanAnalyzer</span><span style="line-height: 150%; font-family: 宋体;">等，其中</span><strong><span style="color: blue; line-height: 150%;">StandardAnalyzer</span></strong><span style="line-height: 150%; font-family: 宋体;">是经常使用的，因为它提供了对于中文的支持，在表建好后我们就需要往里面插入用于索引的记录，在</span><span style="line-height: 150%;">Lucene</span><span style="line-height: 150%; font-family: 宋体;">中这个称为</span><strong><span style="color: blue; line-height: 150%;">Document</span></strong><span style="line-height: 150%; font-family: 宋体;">，有点类似数据库中</span><span style="line-height: 150%;">table</span><span style="line-height: 150%; font-family: 宋体;">的一行记录，记录中的字段的添加方法，在</span><span style="line-height: 150%;">Lucene</span><span style="line-height: 150%; font-family: 宋体;">中称为</span><strong><span style="color: blue; line-height: 150%;">Field</span></strong><span style="line-height: 150%; font-family: 宋体;">，这个和数据库中基本一样，对于</span><span style="line-height: 150%;">Field Lucene</span><span style="line-height: 150%; font-family: 宋体;">分为可被索引的，可切分的，不可被切分的，不可被索引的几种组合类型，通过这几个元素基本上就可以建立起索引了。在查询时经常碰到的为另外几个概念，首先是</span><strong><span style="color: blue; line-height: 150%;">Query</span></strong><span style="line-height: 150%; font-family: 宋体;">，</span><span style="line-height: 150%;">Lucene</span><span style="line-height: 150%; font-family: 宋体;">提供了几种经常可以用到的</span><span style="line-height: 150%;">Query</span><span style="line-height: 150%; font-family: 宋体;">：</span><span style="line-height: 150%;">TermQuery</span><span style="line-height: 150%; font-family: 宋体;">、</span><span style="line-height: 150%;">MultiTermQuery</span><span style="line-height: 150%; font-family: 宋体;">、</span><span style="line-height: 150%;">BooleanQuery</span><span style="line-height: 150%; font-family: 宋体;">、</span><span style="line-height: 150%;">WildcardQuery</span><span style="line-height: 150%; font-family: 宋体;">、</span><span style="line-height: 150%;">PhraseQuery</span><span style="line-height: 150%; font-family: 宋体;">、</span><span style="line-height: 150%;">PrefixQuery</span><span style="line-height: 150%; font-family: 宋体;">、</span><span style="line-height: 150%;">PhrasePrefixQuery</span><span style="line-height: 150%; font-family: 宋体;">、</span><span style="line-height: 150%;">FuzzyQuery</span><span style="line-height: 150%; font-family: 宋体;">、</span><span style="line-height: 150%;">RangeQuery</span><span style="line-height: 150%; font-family: 宋体;">、</span><span style="line-height: 150%;">SpanQuery</span><span style="line-height: 150%; font-family: 宋体;">，</span><span style="line-height: 150%;">Query</span><span style="line-height: 150%; font-family: 宋体;">其实也就是指对于需要查询的字段采用什么样的方式进行查询，如模糊查询、语义查询、短语查询、范围查询、组合查询等，还有就是</span><strong><span style="color: blue; line-height: 150%;">QueryParser</span></strong><span style="line-height: 150%; font-family: 宋体;">，</span><span style="line-height: 150%;">QueryParser</span><span style="line-height: 150%; font-family: 宋体;">可用于创建不同的</span><span style="line-height: 150%;">Query</span><span style="line-height: 150%; font-family: 宋体;">，还有一个</span><span style="line-height: 150%;">MultiFieldQueryParser</span><span style="line-height: 150%; font-family: 宋体;">支持对于多个字段进行同一关键字的查询，</span><strong><span style="color: blue; line-height: 150%;">IndexSearcher</span></strong><span style="line-height: 150%; font-family: 宋体;">概念指的为需要对何目录下的索引文件进行何种方式的分析的查询，有点象对数据库的哪种索引表进行查询并按一定方式进行记录中字段的分解查询的概念，通过</span><span style="line-height: 150%;">IndexSearcher</span><span style="line-height: 150%; font-family: 宋体;">以及</span><span style="line-height: 150%;">Query</span><span style="line-height: 150%; font-family: 宋体;">即可查询出需要的结果，</span><span style="line-height: 150%;">Lucene</span><span style="line-height: 150%; font-family: 宋体;">返回的为</span><strong><span style="color: blue; line-height: 150%;">Hits</span></strong><span style="line-height: 150%;">.</span><span style="line-height: 150%; font-family: 宋体;">通过遍历</span><span style="line-height: 150%;">Hits</span><span style="line-height: 150%; font-family: 宋体;">可获取返回的结果的</span><span style="line-height: 150%;">Document</span><span style="line-height: 150%; font-family: 宋体;">，通过</span><span style="line-height: 150%;">Document</span><span style="line-height: 150%; font-family: 宋体;">则可获取</span><span style="line-height: 150%;">Field</span><span style="line-height: 150%; font-family: 宋体;">中的相关信息了。</span></p>
<br />
<p style="margin: 0cm 0cm 0pt 1cm; line-height: 150%;" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体;">通过对于上面在建立索引和全文检索的基本概念的介绍希望能让你对</span><span style="line-height: 150%;">Lucene</span><span style="line-height: 150%; font-family: 宋体;">建立一定的了解。</span></p>
<br />
<p style="margin: 0cm 0cm 0pt 1cm; text-indent: -1cm; line-height: 150%;" class="MsoNormal"><strong><span style="font-size: 12pt; line-height: 150%;">3.2.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">全文检索需求的实现</span></strong></p>
<br />
<p style="margin: 0cm 0cm 0pt 1cm; line-height: 150%;" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体;">索引建立部分的代码：</span></p>
<br />
<br />
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;"><br />
<div><strong><img src="../../Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; Codehighlighter1_63_889_Open_Text.style.display='none'; Codehighlighter1_63_889_Closed_Image.style.display='inline'; Codehighlighter1_63_889_Closed_Text.style.display='inline';" id="Codehighlighter1_63_889_Open_Image" alt="" align="top" /><img src="../../Images/OutliningIndicators/ContractedBlock.gif" onclick="this.style.display='none'; Codehighlighter1_63_889_Closed_Text.style.display='none'; Codehighlighter1_63_889_Open_Image.style.display='inline'; Codehighlighter1_63_889_Open_Text.style.display='inline';" style="display: none;" id="Codehighlighter1_63_889_Closed_Image" alt="" align="top" /><span style="color: #0000ff;">private</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;createIndex(String&nbsp;indexFilePath)&nbsp;throws&nbsp;Exception</span><span id="Codehighlighter1_63_889_Open_Text"><span style="color: #000000;">{<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexWriter&nbsp;iwriter</span><span style="color: #000000;">=</span><span style="color: #000000;">getWriter(indexFilePath);<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Document();<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Keyword(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">jerry</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">sender</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">bluedavy@gmail.com</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">receiver</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">google@gmail.com</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">title</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">用于索引的标题</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.UnIndexed(</span><span style="color: #000000;">"</span><span style="color: #000000;">content</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">不建立索引的内容</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc2</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Document();<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc2.add(Field.Keyword(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">jerry.lin</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc2.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">sender</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">bluedavy@hotmail.com</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc2.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">receiver</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">msn@hotmail.com</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc2.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">title</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">用于索引的第二个标题</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc2.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">content</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">建立索引的内容</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iwriter.addDocument(doc);<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iwriter.addDocument(doc2);<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iwriter.optimize();<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iwriter.close();<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; Codehighlighter1_970_1196_Open_Text.style.display='none'; Codehighlighter1_970_1196_Closed_Image.style.display='inline'; Codehighlighter1_970_1196_Closed_Text.style.display='inline';" id="Codehighlighter1_970_1196_Open_Image" alt="" align="top" /><img src="../../Images/OutliningIndicators/ContractedBlock.gif" onclick="this.style.display='none'; Codehighlighter1_970_1196_Closed_Text.style.display='none'; Codehighlighter1_970_1196_Open_Image.style.display='inline'; Codehighlighter1_970_1196_Open_Text.style.display='inline';" style="display: none;" id="Codehighlighter1_970_1196_Closed_Image" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;IndexWriter&nbsp;getWriter(String&nbsp;indexFilePath)&nbsp;throws&nbsp;Exception</span><span id="Codehighlighter1_970_1196_Open_Text"><span style="color: #000000;">{<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;append</span><span style="color: #000000;">=</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;File(indexFilePath</span><span style="color: #000000;">+</span><span style="color: #000000;">File.separator</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">segments</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(file.exists())<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;append</span><span style="color: #000000;">=</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;&nbsp;<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IndexWriter(indexFilePath,analyzer,append);<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /></span></strong></div>
<br />
</div>
<br />
<p style="margin: 0cm 0cm 0pt 35.45pt; text-indent: -35.45pt; line-height: 150%;" class="MsoNormal"><strong>3.2.1.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong><span style="line-height: 150%; font-family: 宋体;">对于某字段的关键字的模糊查询</span></strong></p>
<br />
<br />
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;"><br />
<div><strong><img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #000000;">Query&nbsp;query</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;WildcardQuery(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Term(</span><span style="color: #000000;">"</span><span style="color: #000000;">sender</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">*davy*</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Searcher&nbsp;searcher</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IndexSearcher(indexFilePath);<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hits&nbsp;hits</span><span style="color: #000000;">=</span><span style="color: #000000;">searcher.search(query);<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; Codehighlighter1_223_292_Open_Text.style.display='none'; Codehighlighter1_223_292_Closed_Image.style.display='inline'; Codehighlighter1_223_292_Closed_Text.style.display='inline';" id="Codehighlighter1_223_292_Open_Image" alt="" align="top" /><img src="../../Images/OutliningIndicators/ContractedBlock.gif" onclick="this.style.display='none'; Codehighlighter1_223_292_Closed_Text.style.display='none'; Codehighlighter1_223_292_Open_Image.style.display='inline'; Codehighlighter1_223_292_Open_Text.style.display='inline';" style="display: none;" id="Codehighlighter1_223_292_Closed_Image" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;hits.length();&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;</span><span id="Codehighlighter1_223_292_Open_Text"><span style="color: #000000;">{<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</span><span style="color: #0000ff;">out</span><span style="color: #000000;">.println(hits.doc(i).</span><span style="color: #0000ff;">get</span><span style="color: #000000;">(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /></span></strong></div>
<br />
</div>
<br />
<p style="margin: 0cm 0cm 0pt 35.45pt; text-indent: -35.45pt; line-height: 150%;" class="MsoNormal"><strong>3.2.2.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong><span style="line-height: 150%; font-family: 宋体;">对于某字段的关键字的语义查询</span></strong></p>
<br />
<br />
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;"><br />
<div><strong><img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #000000;">Query&nbsp;query</span><span style="color: #000000;">=</span><span style="color: #000000;">QueryParser.parse(</span><span style="color: #000000;">"</span><span style="color: #000000;">索引</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">title</span><span style="color: #000000;">"</span><span style="color: #000000;">,analyzer);<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Searcher&nbsp;searcher</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IndexSearcher(indexFilePath);<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hits&nbsp;hits</span><span style="color: #000000;">=</span><span style="color: #000000;">searcher.search(query);<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; Codehighlighter1_217_286_Open_Text.style.display='none'; Codehighlighter1_217_286_Closed_Image.style.display='inline'; Codehighlighter1_217_286_Closed_Text.style.display='inline';" id="Codehighlighter1_217_286_Open_Image" alt="" align="top" /><img src="../../Images/OutliningIndicators/ContractedBlock.gif" onclick="this.style.display='none'; Codehighlighter1_217_286_Closed_Text.style.display='none'; Codehighlighter1_217_286_Open_Image.style.display='inline'; Codehighlighter1_217_286_Open_Text.style.display='inline';" style="display: none;" id="Codehighlighter1_217_286_Closed_Image" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;hits.length();&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;</span><span id="Codehighlighter1_217_286_Open_Text"><span style="color: #000000;">{<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</span><span style="color: #0000ff;">out</span><span style="color: #000000;">.println(hits.doc(i).</span><span style="color: #0000ff;">get</span><span style="color: #000000;">(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /></span></strong></div>
<br />
</div>
<br />
<p style="margin: 0cm 0cm 0pt 35.45pt; text-indent: -35.45pt; line-height: 150%;" class="MsoNormal"><strong>3.2.3.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong><span style="line-height: 150%; font-family: 宋体;">对于多字段的关键字的查询</span></strong></p>
<br />
<br />
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;"><br />
<div><strong><img src="../../Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; Codehighlighter1_57_75_Open_Text.style.display='none'; Codehighlighter1_57_75_Closed_Image.style.display='inline'; Codehighlighter1_57_75_Closed_Text.style.display='inline';" id="Codehighlighter1_57_75_Open_Image" alt="" align="top" /><img src="../../Images/OutliningIndicators/ContractedBlock.gif" onclick="this.style.display='none'; Codehighlighter1_57_75_Closed_Text.style.display='none'; Codehighlighter1_57_75_Open_Image.style.display='inline'; Codehighlighter1_57_75_Open_Text.style.display='inline';" style="display: none;" id="Codehighlighter1_57_75_Closed_Image" alt="" align="top" /><span style="color: #000000;">Query&nbsp;query</span><span style="color: #000000;">=</span><span style="color: #000000;">MultiFieldQueryParser.parse(</span><span style="color: #000000;">"</span><span style="color: #000000;">索引</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;String[]</span><span id="Codehighlighter1_57_75_Open_Text"><span style="color: #000000;">{</span><span style="color: #000000;">"</span><span style="color: #000000;">title</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">content</span><span style="color: #000000;">"</span><span style="color: #000000;">}</span></span><span style="color: #000000;">,analyzer);<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Searcher&nbsp;searcher</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IndexSearcher(indexFilePath);<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hits&nbsp;hits</span><span style="color: #000000;">=</span><span style="color: #000000;">searcher.search(query);<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; Codehighlighter1_251_320_Open_Text.style.display='none'; Codehighlighter1_251_320_Closed_Image.style.display='inline'; Codehighlighter1_251_320_Closed_Text.style.display='inline';" id="Codehighlighter1_251_320_Open_Image" alt="" align="top" /><img src="../../Images/OutliningIndicators/ContractedBlock.gif" onclick="this.style.display='none'; Codehighlighter1_251_320_Closed_Text.style.display='none'; Codehighlighter1_251_320_Open_Image.style.display='inline'; Codehighlighter1_251_320_Open_Text.style.display='inline';" style="display: none;" id="Codehighlighter1_251_320_Closed_Image" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;hits.length();&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;</span><span id="Codehighlighter1_251_320_Open_Text"><span style="color: #000000;">{<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</span><span style="color: #0000ff;">out</span><span style="color: #000000;">.println(hits.doc(i).</span><span style="color: #0000ff;">get</span><span style="color: #000000;">(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /></span></strong></div>
<br />
</div>
<br />
<p style="margin: 0cm 0cm 0pt 35.45pt; text-indent: -35.45pt; line-height: 150%;" class="MsoNormal"><strong>3.2.4.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong><span style="line-height: 150%; font-family: 宋体;">复合查询</span></strong><strong><span style="line-height: 150%;">(</span></strong><strong><span style="line-height: 150%; font-family: 宋体;">多种查询条件的综合查询</span></strong><strong><span style="line-height: 150%;">)</span></strong></p>
<br />
<br />
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;"><br />
<div><strong><img src="../../Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; Codehighlighter1_57_75_Open_Text.style.display='none'; Codehighlighter1_57_75_Closed_Image.style.display='inline'; Codehighlighter1_57_75_Closed_Text.style.display='inline';" id="Codehighlighter1_57_75_Open_Image" alt="" align="top" /><img src="../../Images/OutliningIndicators/ContractedBlock.gif" onclick="this.style.display='none'; Codehighlighter1_57_75_Closed_Text.style.display='none'; Codehighlighter1_57_75_Open_Image.style.display='inline'; Codehighlighter1_57_75_Open_Text.style.display='inline';" style="display: none;" id="Codehighlighter1_57_75_Closed_Image" alt="" align="top" /><span style="color: #000000;">Query&nbsp;query</span><span style="color: #000000;">=</span><span style="color: #000000;">MultiFieldQueryParser.parse(</span><span style="color: #000000;">"</span><span style="color: #000000;">索引</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;String[]</span><span id="Codehighlighter1_57_75_Open_Text"><span style="color: #000000;">{</span><span style="color: #000000;">"</span><span style="color: #000000;">title</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">content</span><span style="color: #000000;">"</span><span style="color: #000000;">}</span></span><span style="color: #000000;">,analyzer);<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;mquery</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;WildcardQuery(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Term(</span><span style="color: #000000;">"</span><span style="color: #000000;">sender</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">bluedavy*</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TermQuery&nbsp;tquery</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TermQuery(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Term(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">jerry</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BooleanQuery&nbsp;bquery</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BooleanQuery();<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bquery.add(query,</span><span style="color: #0000ff;">true</span><span style="color: #000000;">,</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bquery.add(mquery,</span><span style="color: #0000ff;">true</span><span style="color: #000000;">,</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bquery.add(tquery,</span><span style="color: #0000ff;">true</span><span style="color: #000000;">,</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Searcher&nbsp;searcher</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IndexSearcher(indexFilePath);<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hits&nbsp;hits</span><span style="color: #000000;">=</span><span style="color: #000000;">searcher.search(bquery);<br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; Codehighlighter1_570_639_Open_Text.style.display='none'; Codehighlighter1_570_639_Closed_Image.style.display='inline'; Codehighlighter1_570_639_Closed_Text.style.display='inline';" id="Codehighlighter1_570_639_Open_Image" alt="" align="top" /><img src="../../Images/OutliningIndicators/ContractedBlock.gif" onclick="this.style.display='none'; Codehighlighter1_570_639_Closed_Text.style.display='none'; Codehighlighter1_570_639_Open_Image.style.display='inline'; Codehighlighter1_570_639_Open_Text.style.display='inline';" style="display: none;" id="Codehighlighter1_570_639_Closed_Image" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;hits.length();&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;</span><span id="Codehighlighter1_570_639_Open_Text"><span style="color: #000000;">{<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</span><span style="color: #0000ff;">out</span><span style="color: #000000;">.println(hits.doc(i).</span><span style="color: #0000ff;">get</span><span style="color: #000000;">(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /></span></strong></div>
<br />
</div>
<br />
<p style="margin: 0cm 0cm 0pt 21.25pt; text-indent: -21.25pt; line-height: 150%;" class="MsoNormal"><strong>四.&nbsp;</strong><strong><span style="font-size: 14pt; line-height: 150%; font-family: 宋体;">总结</span></strong></p>
<br />
<p style="margin: 0cm 0cm 0pt 21.25pt; line-height: 150%;" class="MsoNormal"><span style="line-height: 150%; font-family: 宋体;">相信大家通过上面的说明能知道</span><span style="line-height: 150%;">Lucene</span><span style="line-height: 150%; font-family: 宋体;">的一个基本的使用方法，在全文检索时建议大家先采用语义时的搜索，先搜索出有意义的内容，之后再进行模糊之类的搜索，</span><span style="line-height: 150%;">^_^</span><span style="line-height: 150%; font-family: 宋体;">，这个还是需要根据搜索的需求才能定了，</span><span style="line-height: 150%;">Lucene</span><span style="line-height: 150%; font-family: 宋体;">还提供了很多其他更好用的方法，这个就等待大家在使用的过程中自己去进一步的摸索了，比如对于</span><span style="line-height: 150%;">Lucene</span><span style="line-height: 150%; font-family: 宋体;">本身提供的</span><span style="line-height: 150%;">Query</span><span style="line-height: 150%; font-family: 宋体;">的更熟练的掌握，对于</span><span style="line-height: 150%;">Filter</span><span style="line-height: 150%; font-family: 宋体;">、</span><span style="line-height: 150%;">Sorter</span><span style="line-height: 150%; font-family: 宋体;">的使用，自己扩展实现</span><span style="line-height: 150%;">Analyzer</span><span style="line-height: 150%; font-family: 宋体;">，自己实现</span><span style="line-height: 150%;">Query</span><span style="line-height: 150%; font-family: 宋体;">等等，甚至可以去了解一些关于搜索引擎的技术</span><span style="line-height: 150%;">(</span><span style="line-height: 150%; font-family: 宋体;">切词、索引排序</span><span style="line-height: 150%;"> etc)</span><span style="line-height: 150%; font-family: 宋体;">等等。(来源：BlueDavy之技术Blog)</span></p>
<img src ="http://www.blogjava.net/nkjava/aggbug/257504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-03-03 11:35 <a href="http://www.blogjava.net/nkjava/archive/2009/03/03/257504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为lucene加入简单中文分词</title><link>http://www.blogjava.net/nkjava/archive/2009/03/03/257502.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Tue, 03 Mar 2009 03:34:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/03/03/257502.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/257502.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/03/03/257502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/257502.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/257502.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;">&nbsp; 看到很多人做lucene的应用时候都要面临中文分词怎么加的问题，下面介绍一个简单的中文词库，这个词库附带相应的算法，数据结构学过的人看懂没什么问题，只要简单的构造一个对象，就可以分词了，对于不是太大的应用来说，还是相当可行的，<a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">点击下载</a></span>
<div id="more" class="asset-more">
<div>
<p><span style="font-size: 10pt;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该分词库使用很简单，先初试化该类 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ChineseSegmenter seg = ChineseSegmenter.getGBSegmenter();<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;然后调用seg.segmentLine("要分词的中文段", " ")//第二个参数为分词之间以什么间隔<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </a></span><span style="font-size: 10pt;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">譬如</a></span></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #000000;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">&nbsp;</a></span><span style="color: #0000ff;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">public</a></span><span style="color: #000000;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">&nbsp;</a></span><span style="color: #0000ff;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">static</a></span><span style="color: #000000;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">&nbsp;</a></span><span style="color: #0000ff;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">void</a></span><span style="color: #000000;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;Exception&nbsp;</a></span><span id="Codehighlighter1_57_188_Open_Text"><span style="color: #000000;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ChineseSegmenter&nbsp;seg&nbsp;</a></span><span style="color: #000000;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">=</a></span><span style="color: #000000;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">&nbsp;ChineseSegmenter.getGBSegmenter();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</a></span><span style="color: #0000ff;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">out</a></span><span style="color: #000000;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">.println(seg.segmentLine(</a></span><span style="color: #000000;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">"</a></span><span style="color: #000000;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">儿童节日</a></span><span style="color: #000000;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">"</a></span><span style="color: #000000;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">,&nbsp;</a></span><span style="color: #000000;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">"</a></span><span style="color: #000000;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">&nbsp;</a></span><span style="color: #000000;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">"</a></span><span style="color: #000000;"><a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;}</a></span></span></div>
<a href="http://maxwolf.cnblogs.com/Files/maxwolf/ChineseSegmenter.rar">&nbsp;&nbsp;&nbsp; <span style="font-size: 10pt;">输出为儿童 节日 儿童节&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; 下面简要说以下如何加到搜索代码里，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lucene 建立索引的代码引入的analysis分词法为 WhitespaceAnalyzer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import org.apache.lucene.analysis.WhitespaceAnalyzer;<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #000000;">&nbsp;&nbsp;IndexWriter&nbsp;writer&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IndexWriter(Directory,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;WhitespaceAnalyzer(),</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;AddDocument(String&nbsp;Title&nbsp;,&nbsp;String&nbsp;Content&nbsp;,&nbsp;..)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Document();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ChineseSegmenter&nbsp;cs</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ChineseSegmenter.getGBSegmenter();&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">初始化该类</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">content</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;cs.segmentLine(Content,&nbsp;</span><span style="color: #000000;">"</span>&nbsp;<span style="color: #000000;">"</span><span style="color: #000000;">)));&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;将分好的词写进索引&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">title</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;cs.segmentLine(Title,&nbsp;</span><span style="color: #000000;">"</span>&nbsp;<span style="color: #000000;">"</span><span style="color: #000000;">)));<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.addDocument(doc);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(IOException&nbsp;e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</span><span style="color: #0000ff;">out</span><span style="color: #000000;">.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">wrong</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
</span></a></div>
</div>
<img src ="http://www.blogjava.net/nkjava/aggbug/257502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-03-03 11:34 <a href="http://www.blogjava.net/nkjava/archive/2009/03/03/257502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Lucene检索数据库</title><link>http://www.blogjava.net/nkjava/archive/2009/03/03/257500.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Tue, 03 Mar 2009 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/03/03/257500.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/257500.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/03/03/257500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/257500.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/257500.html</trackback:ping><description><![CDATA[<div>
1.写一段传统的JDBC程序，讲每条的用户信息从数据库读取出来<br />
2.针对每条用户记录，建立一个lucene document <br />
Document doc = new Document();<br />
并根据你的需要，将用户信息的各个字段对应luncene document中的field 进行添加，如：       <br />
doc.add(new Field("NAME","USERNAME",Field.Store.YES,Field.Index.UN_TOKENIZED));<br />
然后将该条doc加入到索引中， 如： luceneWriter.addDocument(doc);<br />
这样就建立了lucene的索引库<br />
3.编写对索引库的搜索程序（看lucene文档），通过对lucene的索引库的查找，你可以快速找到对应记录的ID<br />
4.通过ID到数据库中查找相关记录
</div>
<div><font style="font-weight: bold;" size="4">用Lucene索引数据库</font><br />
<br />
Lucene，作为一种全文搜索的辅助工具，为我们进行条件搜索，无论是像Google,Baidu之类的搜索引
擎，还是论坛中的搜索功能，还是其它C/S架构的搜索，都带来了极大的便利和比较高的效率。本文主要是利用Lucene对MS Sql Server
2000进行建立索引，然后进行全文索引。至于数据库的内容，可以是网页的内容，还是其它的。本文中数据库的内容是图书馆管理系统中的某个作者表－
Authors表。 </div>
<p>　　因为考虑到篇幅的问题，所以该文不会讲的很详细，也不可能讲的很深。</p>
<p>　　本文以这样的结构进行：</p>
<p>　　1.介绍数据库中Authors表的结构</p>
<p>　　2.为数据库建立索引</p>
<p>　　3.为数据库建立查询功能</p>
<p>　　4.在web界面下进行查询并显示结果</p>
<p>　　1．介绍数据库中Authors表的结构</p>
<p>字段名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字段类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字段含义</p>
<p>Au_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Varchar(11)&nbsp;&nbsp;&nbsp; 作者号<br />
Au_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Varchar(60)&nbsp;&nbsp;&nbsp;&nbsp; 作者名<br />
Phone&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Char(12)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 电话号码<br />
Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Varchar(40)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 地址<br />
City&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Varchar(20)&nbsp;&nbsp;&nbsp;&nbsp; 城市<br />
State&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Char(2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 省份<br />
Zip&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Char(5)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 邮编<br />
contract&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bit(1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 外键（关系不大）<br />
<br />
表中的部分内容：&nbsp;</p>
<p>　　2．为数据库建立索引</p>
<p>　　首先建立一个类TestLucene.java。这个类就是对数据库进行建立索引，编写查询条件等。</p>
<p>　　当然，最开始就是建立数据库连接。连接代码这里就省略了。^_^</p>
<p>　　接着，新建一个方法getResutl(String),它返回的是数据库表Authors的内容。具体代码如下：</p>
<p>&nbsp;&nbsp;&nbsp; public ResultSet getResult(String sql){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement stmt = conn.createStatement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs = stmt.executeQuery(sql);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rs;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(SQLException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
然后，为数据库建立索引。</p>
<p>
首先要定义一个IndexWriter（），它是将索引写进Lucene自己的数据库中，它存放的位置是有你自己定义的。在定义IndexWriter
是需要指定它的分析器。Lucene自己自带有几个分析器，例如：StandarAnalyzer(),SimpleAnalyzer(),
StopAnalyzer()等。它作用是对文本进行分析，判断如何进行切词。<br />
接着，要定义一个Document。Document相当于二维表中一行数据一样。Document里包含的是Field字段，Field相当于数据库中一列，也就是一个属性，一个字段。<br />
最后应该对IndexWriter进行优化，方法很简单，就是writer.optimize().<br />
具体代码如下：<br />
<br />
&nbsp; public void Index(ResultSet rs){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IndexWriter writer = new IndexWriter("d:/index/", getAnalyzer(), true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(rs.next()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document doc=new Document();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.Keyword("id",rs.getString("au_id")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.Text("name",rs.getString("au_name")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.UnIndexed("address",rs.getString("address")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.UnIndexed("phone",rs.getString("phone")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.Text("City",rs.getString("city")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.addDocument(doc);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.optimize();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(IOException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(SQLException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; public Analyzer getAnalyzer(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new StandardAnalyzer();<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
3．为数据库建立查询功能</p>
<p>　　在类TestLucene中建立一个新的方法searcher(String)，它返回的是一个搜索的结构集，相当于数据库中的ResultSet一样。它代的参数是你要查询的内容。这里，我把要查询的字段写死了。你可以在添加一个参数表示要查询的字段。<br />
这里主要有两个对象IndexSearcher和Query。IndexSearcher是找到索引数据库，Query是处理搜索，它包含了三个参数：查询内容，查询字段，分析器。<br />
具体代码如下：<br />
<br />
&nbsp; public Hits seacher(String queryString){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hits hits=null;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IndexSearcher is = new IndexSearcher("D:/index/");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query query=QueryParser.parse(queryString,"City",getAnalyzer());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hits=is.search(query);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return hits;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
4．在web界面下进行查询并显示结果</p>
<p>　　这里建立一个Jsp页面TestLucene.jsp进行搜索。</p>
<p>　　在TestLucene.jsp页面中首先引入类</p>
<p><br />
&lt;%@ page import="lucenetest.LucentTest"%&gt;<br />
&lt;%@ page import="org.apache.lucene.search.*,org.apache.lucene.document.*" %&gt; <br />
</p>
<p>　　然后定义一个LuceneTest对象，获取查询结果集：<br />
<br />
&nbsp; LucentTest lucent=new LucentTest();<br />
&nbsp; Hits hits=lucent.seacher(request.getParameter("queryString"));<br />
<br />
定义一个Form，建立一个查询环境：<br />
<br />
&lt;form action="TestLucene.jsp"&gt;<br />
&nbsp; &lt;input&nbsp; type="text" name="queryString"/&gt;<br />
&nbsp; &lt;input type="submit" value="搜索"/&gt;<br />
&lt;/form&gt;<br />
<br />
显示查询结果：<br />
<br />
&lt;table&gt;<br />
&nbsp; &lt;%if(hits!=null){%&gt;<br />
&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;作者号&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;作者名&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;地址&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;电话号码&lt;/td&gt;<br />
&nbsp; &lt;/tr&gt; </p>
<p>&nbsp;&lt;% for(int i=0;i&lt;hits.length();i++){<br />
&nbsp;&nbsp;&nbsp; Document doc=hits.doc(i);<br />
&nbsp;&nbsp; %&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%=doc.get("id") %&gt;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%=doc.get("name") %&gt;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%=doc.get("address") %&gt;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%=doc.get("phone") %&gt;&lt;/td&gt;<br />
&nbsp; &lt;/tr&gt;<br />
&nbsp;&lt;% }}%&gt;<br />
&lt;/table&gt;<br />
</p>
<p style="font-weight: bold;" class="cnt"><font size="4">用Lucene-1.3-final为网站数据库建立索引</font></p>
<p><font color="#333333">下是看了lnboy写的《用lucene建立大富翁论坛的全文检索》后写的测试代码。<br />
&nbsp; <br />
为数据库cwb.mdb建立全文索引的indexdb.jsp&nbsp;<br />
<br />
&lt;%@&nbsp;page&nbsp;import&nbsp;="org.apache.lucene.analysis.standard.*"&nbsp;%&gt;&nbsp;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;import="org.apache.lucene.index.*"&nbsp;%&gt;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;import="org.apache.lucene.document.*"&nbsp;%&gt;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;import="lucene.*"&nbsp;%&gt;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;contentType="text/html;&nbsp;charset=GBK"&nbsp;%&gt;&nbsp; <br />
&lt;%&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;start&nbsp;=&nbsp;System.currentTimeMillis();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;aa=getServletContext().getRealPath("/")+"index";&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexWriter&nbsp;writer&nbsp;=&nbsp;new&nbsp;IndexWriter(aa,&nbsp;new&nbsp;StandardAnalyzer(),&nbsp;true);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();&nbsp;</font></p>
<font color="#333333">&nbsp;String&nbsp;url&nbsp;=&nbsp;"jdbc:odbc:driver={Microsoft&nbsp;Access&nbsp;Driver&nbsp;(*.mdb)}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;DBQ=d:""Tomcat&nbsp;5.0""webapps""zz3zcwbwebhome""WEB-INF""cwb.mdb";&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;DriverManager.getConnection(url);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;stmt&nbsp;=&nbsp;conn.createStatement();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;stmt.executeQuery(&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"select&nbsp;Article_id,Article_name,Article_intro&nbsp;from&nbsp;Article");&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(rs.next())&nbsp;{&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.addDocument(mydocument.Document(rs.getString("Article_id"),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;rs.getString("Article_name"),rs.getString("Article_intro")));&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.close();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stmt.close();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close();&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("索引创建完毕");&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.optimize();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.close();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.print(System.currentTimeMillis()&nbsp;-&nbsp;start);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&nbsp;total&nbsp;milliseconds");&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&nbsp;出错了&nbsp;"&nbsp;+&nbsp;e.getClass()&nbsp;+&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;""n&nbsp;错误信息为:&nbsp;"&nbsp;+&nbsp;e.getMessage());&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br />
&nbsp;%&gt;&nbsp; <br />
<br />
用于显示查询结果的aftsearch.jsp&nbsp; <br />
&lt;%@&nbsp;page&nbsp;import="org.apache.lucene.search.*"&nbsp;%&gt;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;import="org.apache.lucene.document.*"&nbsp;%&gt;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;import="lucene.*"&nbsp;%&gt;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;import&nbsp;=&nbsp;"org.apache.lucene.analysis.standard.*"&nbsp;%&gt;&nbsp;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;import="org.apache.lucene.queryParser.QueryParser"&nbsp;%&gt;&nbsp; <br />
&lt;%@&nbsp;page&nbsp;contentType="text/html;&nbsp;charset=GBK"&nbsp;%&gt;&nbsp; <br />
&lt;%&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;keyword=request.getParameter("keyword");&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyword=new&nbsp;String(keyword.getBytes("ISO8859_1"));&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(keyword);&nbsp; <br />
&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;aa=getServletContext().getRealPath("/")+"index";&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Searcher&nbsp;searcher&nbsp;=&nbsp;new&nbsp;IndexSearcher(aa);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;=&nbsp;QueryParser.parse(keyword,&nbsp;"Article_name",&nbsp;new&nbsp;StandardAnalyzer());&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("正在查找:&nbsp;"&nbsp;+&nbsp;query.toString("Article_name")+"&lt;br&gt;");&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hits&nbsp;hits&nbsp;=&nbsp;searcher.search(query);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(hits.length()&nbsp;+&nbsp;"&nbsp;total&nbsp;matching&nbsp;documents");&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.text.NumberFormat&nbsp;format&nbsp;=&nbsp;java.text.NumberFormat.getNumberInstance();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;hits.length();&nbsp;i++)&nbsp;{&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开始输出查询结果&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;=&nbsp;hits.doc(i);&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(doc.get("Article_id"));&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("准确度为："&nbsp;+&nbsp;format.format(hits.score(i)&nbsp;*&nbsp;100.0)&nbsp;+&nbsp;"%");&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(doc.get("Article_name")+"&lt;br&gt;");&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;out.println(doc.get("Article_intro"));&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;}catch&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println("&nbsp;出错了&nbsp;"&nbsp;+&nbsp;e.getClass()&nbsp;+""n&nbsp;错误信息为:&nbsp;"&nbsp;+&nbsp;e.getMessage());&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br />
%&gt;&nbsp; <br />
<br />
辅助类：&nbsp; <br />
package&nbsp;lucene;&nbsp; <br />
import&nbsp;org.apache.lucene.document.Document;&nbsp; <br />
import&nbsp;org.apache.lucene.document.Field;&nbsp; <br />
import&nbsp;org.apache.lucene.document.DateField;&nbsp; <br />
<br />
public&nbsp;class&nbsp;mydocument&nbsp;{&nbsp; <br />
public&nbsp;static&nbsp;Document&nbsp;Document(String&nbsp;Article_id,String&nbsp;Article_name,String&nbsp;Article_intro){&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;=&nbsp;new&nbsp;Document();&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Keyword("Article_id",&nbsp;Article_id));&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Text("Article_name",&nbsp;Article_name));&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Text("Article_intro",&nbsp;Article_intro));&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;doc;&nbsp; <br />
&nbsp;&nbsp;}&nbsp; <br />
&nbsp;&nbsp;public&nbsp;mydocument()&nbsp;{&nbsp; <br />
&nbsp;&nbsp;}&nbsp; <br />
} <br />
<br />
</font><font style="font-weight: bold;" size="4">用lucene为数据库搜索建立增量索引</font><font color="#333333"><br />
</font>
<p style="font-size: 10pt;">用&nbsp;lucene&nbsp;建立索引不可能每次都重新开始建立,而是按照新增加的记录,一次次的递增<br />
建立索引的IndexWriter类,有三个参数&nbsp;<br />
</p>
<div><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #000000;">IndexWriter&nbsp;writer&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IndexWriter(path,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StandardAnalyzer(),isEmpty);</span></div>
<span style="font-size: 10pt;"><br />
其中第三个参数是bool型的,指定它可以确定是增量索引,还是重建索引.<br />
对于从数据库中读取的记录,譬如要为文章建立索引,我们可以记录文章的id号,然后下次再次建立索引的时候读取存下的id号,从此id后往下继续增加索引,逻辑如下.<br />
<br />
建立增量索引,主要代码如下<br />
</span>
<div><span style="font-size: 10pt;"><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;createIndex(String&nbsp;path)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;myStatement&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;articleId</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">0</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">读取文件,获得文章id号码,这里只存最后一篇索引的文章id</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileReader&nbsp;fr&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileReader(</span><span style="color: #000000;">"</span><span style="color: #000000;">**.txt</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;br&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BufferedReader(fr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;articleId</span><span style="color: #000000;">=</span><span style="color: #000000;">br.readLine();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(articleId</span><span style="color: #000000;">==</span><span style="color: #0000ff;">null</span><span style="color: #000000;">||</span><span style="color: #000000;">articleId</span><span style="color: #000000;">==</span><span style="color: #000000;">""</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;articleId</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">0</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;br.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fr.close();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">error343!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">sql语句,根据id读取下面的内容</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sqlText&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #000000;">"</span><span style="color: #000000;">*****</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">articleId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStatement&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;conn.createStatement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;myStatement.executeQuery(sqlText);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">写索引</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(rs.next())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Document();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Keyword(</span><span style="color: #000000;">"</span><span style="color: #000000;">**</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;DateAdded));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Keyword(</span><span style="color: #000000;">"</span><span style="color: #000000;">**</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;articleid));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">**</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;URL));&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">**</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Content));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">**</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Title));&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.addDocument(doc);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(IOException&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">将我索引的最后一篇文章的id写入文件</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileWriter&nbsp;fw&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileWriter(</span><span style="color: #000000;">"</span><span style="color: #000000;">**.txt</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;out&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PrintWriter(fw);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fw.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ind.Close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">ok.end</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(SQLException&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">数据库关闭操作</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
然后控制是都建立增量索引的时候根据能否都到id值来设置IndexWriter的第三个参数为true&nbsp;或者是false<br />
<br />
&nbsp;<span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isEmpty&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;FileReader&nbsp;fr&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileReader(</span><span style="color: #000000;">"</span><span style="color: #000000;">**.txt</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;br&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BufferedReader(fr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(br.readLine()</span><span style="color: #000000;">!=</span>&nbsp;<span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isEmpty&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;br.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fr.close();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}</span>
<img src ="http://www.blogjava.net/nkjava/aggbug/257500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-03-03 11:33 <a href="http://www.blogjava.net/nkjava/archive/2009/03/03/257500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene全文检索实践</title><link>http://www.blogjava.net/nkjava/archive/2009/03/03/257498.html</link><dc:creator>草原上的骆驼</dc:creator><author>草原上的骆驼</author><pubDate>Tue, 03 Mar 2009 03:31:00 GMT</pubDate><guid>http://www.blogjava.net/nkjava/archive/2009/03/03/257498.html</guid><wfw:comment>http://www.blogjava.net/nkjava/comments/257498.html</wfw:comment><comments>http://www.blogjava.net/nkjava/archive/2009/03/03/257498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nkjava/comments/commentRss/257498.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nkjava/services/trackbacks/257498.html</trackback:ping><description><![CDATA[<div> Lucene 是 Apache 的一个子项目，是一个全文检索的搜索引擎库。其提供了简单实用的
API，通过这些 API，可以自行编写对文件（TEXT／XML／HTML等）、目录、数据库的全文检索程序。 </div>
<div id="more" class="asset-more">
<p align="left"><span xml:lang="EN-US">Features</span>：<span xml:lang="EN-US"><br />
* Very fast indexing, minimal RAM required<br />
* Index compression to 30% of original text<br />
* Indexes text and HTML, document classes available for XML, PDF and RTF<br />
* Search supports phrase and Boolean queries, plus, minus and quote marks, and parentheses<br />
* Allows single and multiple character wildcards anywhere in the search words, fuzzy search, proximity<br />
* Will search for punctuation such as + or <br />
* Field searches for title, author, etc., and date-range searching<br />
* Supports most European languages<br />
* Option to store and display full text of indexed documents<br />
* Search results in relevance order<br />
* APIs for file format conversion, languages and user interfaces</span></p>
<span>
<p align="left"><br />
</p>
<p align="left">实践任务：<span xml:lang="EN-US"><br />
1) </span>编写<span xml:lang="EN-US"> Java </span>程序<span xml:lang="EN-US"> MyIndexer.java</span>，使用<span xml:lang="EN-US"> JDBC </span>取出<span xml:lang="EN-US"> MySQL </span>数据表内容（以某一论坛数据做测试），然后通过<span xml:lang="EN-US"> org.apache.lucene.index.IndexWriter </span>创建索引。<span xml:lang="EN-US"><br />
2) </span>编写<span xml:lang="EN-US"> Java </span>程序<span xml:lang="EN-US"> MySearcher.java</span>，通过<span xml:lang="EN-US"> org.apache.lucene.search.IndexSearcher </span>等查询索引。<span xml:lang="EN-US"><br />
3) </span>实现支持中文查询及检索关键字高亮显示。<span xml:lang="EN-US"><br />
4) </span>通过 <span xml:lang="EN-US"><a href="http://info96.k12studio.com/%7Enio/phpdoc-zh/ref.java.html" target="_blank"><strong>PHP / Java Integration</strong></a> </span>实现对<span xml:lang="EN-US"> MySearch.java </span>的调用。<span xml:lang="EN-US"> <br />
5) </span>实现对 <span xml:lang="EN-US"><a href="http://info96.k12studio.com/%7Enio/phpdoc-zh/" target="_blank"><strong>PHP </strong><strong><span xml:lang="EN-US"><span xml:lang="EN-US">手册（简体中文）</span></span></strong></a> </span>的全文检索。 </p>
<p align="left"><span xml:lang="EN-US">Java </span>的程序基本编写完成，实现了对中文的支持。下一步是将其放到<span xml:lang="EN-US"> WEB </span>上运行，首先想到的是使用<span xml:lang="EN-US"> JSP</span>，安装了<span xml:lang="EN-US"><a href="http://jakarta.apache.org/" target="_blank"><strong>Apache Tomcat/4.1.24</strong></a></span>，默认的发布端口是<span xml:lang="EN-US"> 8080</span>。现在面临的一个问题是：<span xml:lang="EN-US"><a href="http://httpd.apache.org/" target="_blank"><strong>Apache httpd</strong></a> </span>的端口是<span xml:lang="EN-US"> 80</span>，并且我的机器对外只能通过<span xml:lang="EN-US"> 80 </span>端口进行访问，如果将<span xml:lang="EN-US"> Tomcat </span>的发布端口改成<span xml:lang="EN-US"> 80 </span>的话，<span xml:lang="EN-US">httpd </span>就没法对外了，而其上的<span xml:lang="EN-US"> PHP </span>程序也将无法在<span xml:lang="EN-US"> 80 </span>端口运行。<span xml:lang="EN-US"><br />
<br />
</span>对于这个问题，我想到两种方案：<span xml:lang="EN-US"><br />
1</span>、使用 <span xml:lang="EN-US"><a href="http://info96.k12studio.com/%7Enio/phpdoc-zh/ref.java.html" target="_blank"><strong>PHP </strong><strong><span xml:lang="EN-US"><span xml:lang="EN-US">直接调用</span></span></strong><strong> Java</strong></a></span>。需要做的工作是使用<span xml:lang="EN-US"> --with-java </span>重新编译<span xml:lang="EN-US"> PHP</span>；<span xml:lang="EN-US"><br />
2</span>、使用 <span xml:lang="EN-US"><a href="http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jk2/index.html" target="_blank"><strong>mod_jk</strong></a> </span>做桥接的方式，将<span xml:lang="EN-US"> servlet </span>引擎结合到<span xml:lang="EN-US"> httpd </span>中。需要做的工作是编译 <span xml:lang="EN-US"><a href="http://apache.linuxforum.net/dist/jakarta/tomcat-connectors/jk/jakarta-tomcat-connectors-jk-1.2-src-current.tar.gz" target="_blank"><strong>jakarta-tomcat-connectors-jk-1.2.5-src</strong></a></span>，生成<span xml:lang="EN-US"> mod_jk.so </span>给<span xml:lang="EN-US"> httpd </span>使用，然后按照 <span xml:lang="EN-US"><a href="http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jk2/jk/aphowto.html" target="_blank"><strong>Howto </strong><strong><span xml:lang="EN-US"><span xml:lang="EN-US">文档</span></span></strong></a> </span>进行<span xml:lang="EN-US"> Tomcat</span>、<span xml:lang="EN-US">httpd </span>的配置。<span xml:lang="EN-US"><br />
<br />
</span>对于第一个方案的尝试：使用 <span xml:lang="EN-US"><a href="http://info96.k12studio.com/%7Enio/phpdoc-zh/ref.java.html" target="_blank"><strong>PHP </strong><strong><span xml:lang="EN-US"><span xml:lang="EN-US">直接调用</span></span></strong><strong> Java</strong></a><br />
<br />
</span><strong>环境</strong><span xml:lang="EN-US"><br />
* PHP 4.3.6 prefix=/usr<br />
* Apache 1.3.27 prefix=/usr/local/apache<br />
* j2sdk1.4.1_01 prefix=/usr/local/jdk<br />
<br />
</span><strong>配置步骤</strong><span xml:lang="EN-US"><br />
1) </span>安装<span xml:lang="EN-US"> JDK</span>，这个就不多说了，<span xml:lang="EN-US"><span xml:lang="EN-US"><span xml:lang="EN-US">到</span></span> GOOGLE <span xml:lang="EN-US"><span xml:lang="EN-US">可以搜索出这方面的大量文章</span></span></span>。<span xml:lang="EN-US"><br />
<br />
2) </span>重新编译<span xml:lang="EN-US"> PHP</span>，我的<span xml:lang="EN-US"> PHP </span>版本是<span xml:lang="EN-US"> 4.3.6</span>：</p>
<div>
<p align="left"><span xml:lang="EN-US">cd php-4.3.6</span></p>
<p align="left"><span xml:lang="EN-US">./configure --with-java=/usr/local/jdk</span></p>
<p align="left"><span xml:lang="EN-US">make</span></p>
<p align="left"><span xml:lang="EN-US">make install</span></p>
</div>
<p align="left"><span xml:lang="EN-US"><br />
</span>完成之后，会在<span xml:lang="EN-US"> PHP </span>的<span xml:lang="EN-US"> lib </span>下（我的是在<span xml:lang="EN-US"> /usr/lib/php</span>）有个<span xml:lang="EN-US"> php_java.jar</span>，同时在扩展动态库存放的目录下（我的是在<span xml:lang="EN-US"> /usr/lib/php/20020429</span>）有个<span xml:lang="EN-US"> java.so </span>文件。到这一步需要注意一个问题，有些<span xml:lang="EN-US"> PHP </span>版本生成的是<span xml:lang="EN-US"> libphp_java.so </span>文件，<span xml:lang="EN-US">extension </span>的加载只认<span xml:lang="EN-US"> libphp_java.so</span>，直接加载<span xml:lang="EN-US"> java.so </span>可能会出现如下错误：</p>
<div>
<p align="left"><span xml:lang="EN-US">PHP Fatal error: Unable to load Java Library /usr/local/jdk/jre/lib/i386/libjava.so, error: libjvm.so:</span></p>
<p align="left"><span xml:lang="EN-US">cannot open shared object file: No such file or directory in /home/nio/public_html/java.php on line 2</span></p>
</div>
<p align="left"><span xml:lang="EN-US"><br />
</span>所以如果生成的是<span xml:lang="EN-US"> java.so</span>，需要创建一个符号连接：</p>
<div>
<p align="left"><span xml:lang="EN-US">ln -s java.so libphp_java.so</span></p>
</div>
<p align="left"><span xml:lang="EN-US"><br />
<br />
3) </span>修改<span xml:lang="EN-US"> Apache Service </span>启动文件（我的这个文件为<span xml:lang="EN-US"> /etc/init.d/httpd</span>），在这个文件中加入：</p>
<div>
<p align="left"><span xml:lang="EN-US">export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/jdk/jre/lib/i386/server:/usr/local/jdk/jre/lib/i386</span></p>
</div>
<p align="left"><span xml:lang="EN-US"><br />
</span>正如你所看到的，我的<span xml:lang="EN-US"> JDK </span>装在<span xml:lang="EN-US"> /usr/local/jdk </span>目录下，如果你的不是在此目录，请做相应改动（下同）。<span xml:lang="EN-US"><br />
<br />
4) </span>修改<span xml:lang="EN-US"> PHP </span>配置文件<span xml:lang="EN-US"> php.ini</span>，找到<span xml:lang="EN-US"> [Java] </span>部分进行修改：</p>
<div>
<p align="left"><span xml:lang="EN-US">[Java]</span></p>
<p align="left"><span xml:lang="EN-US">java.class.path = /usr/lib/php/php_java.jar</span></p>
<p align="left"><span xml:lang="EN-US">java.home = /usr/local/jdk</span></p>
<p align="left"><span xml:lang="EN-US">;java.library = </span></p>
<p align="left"><span xml:lang="EN-US">;java.library.path =</span></p>
<p align="left"><span xml:lang="EN-US">extension_dir=/usr/lib/php/20020429/</span></p>
<p align="left"><span xml:lang="EN-US">extension=java.so</span></p>
</div>
<p align="left"><span xml:lang="EN-US"><br />
</span>我将<span xml:lang="EN-US"> java.library </span>及<span xml:lang="EN-US"> java.library.path </span>都注释掉了，<span xml:lang="EN-US">PHP </span>会自动认为<span xml:lang="EN-US"> java.library=/usr/local/jdk/jre/lib/i386/libjava.so</span>。<span xml:lang="EN-US"><br />
<br />
5) </span>重新启动<span xml:lang="EN-US"> Apache httpd </span>服务：</p>
<div>
<p align="left"><span xml:lang="EN-US">service httpd restart</span></p>
</div>
<p align="left"><span xml:lang="EN-US"><br />
<br />
</span><strong>测试</strong><span xml:lang="EN-US"><br />
<a href="http://www.infor96.com/%7Enio/java.php"><strong><span xml:lang="EN-US"><span xml:lang="EN-US">测试脚本</span></span></strong><strong> java.php</strong></a> </span>源代码：</p>
<div>
<p align="left"><span xml:lang="EN-US">getProperty('java.version').'&lt;br /&gt;';</span></p>
<p align="left"><span xml:lang="EN-US">print 'Java vendor=' . $system-&gt;getProperty('java.vendor').'&lt;br /&gt;';</span></p>
<p align="left"><span xml:lang="EN-US">print 'OS=' . $system-&gt;getProperty('os.name') . ' ' .</span></p>
<p align="left"><span xml:lang="EN-US">$system-&gt;getProperty('os.version') . ' on ' .</span></p>
<p align="left"><span xml:lang="EN-US">$system-&gt;getProperty('os.arch') . '&lt;br /&gt;';</span></p>
<p align="left"><span xml:lang="EN-US">&gt;</span></p>
</div>
<span>
<p align="left"><br />
<br />
<strong>总结</strong><span xml:lang="EN-US"><br />
</span>安装配置还算简单，但是在<span xml:lang="EN-US"> PHP </span>运行<span xml:lang="EN-US"> Java </span>的速度感觉较慢，所以下定决心开始实践第二个方案。 </p>
<p align="left">今天总算有些空闲时间，正好说说第二种方案：使用 <span xml:lang="EN-US"><a href="http://jakarta.apache.org/tomcat/tomcat-4.1-doc/jk2/index.html" target="_blank"><strong>mod_jk</strong></a> </span>做桥接的方式，将<span xml:lang="EN-US"> servlet </span>引擎结合到<span xml:lang="EN-US"> httpd </span>中。<span xml:lang="EN-US"><br />
<br />
</span><strong>环境</strong><span xml:lang="EN-US"><br />
* PHP 4.3.6 prefix=/usr<br />
* Apache 1.3.27 prefix=/usr/local/apache<br />
* j2sdk1.4.1_01 prefix=/usr/local/jdk<br />
* jakarta-tomcat-4.1.24 prefix=/usr/local/tomcat<br />
* </span>另外需要下载 <span xml:lang="EN-US"><a href="http://apache.linuxforum.net/dist/jakarta/tomcat-connectors/jk/jakarta-tomcat-connectors-jk-1.2-src-current.tar.gz" target="_blank"><strong>jakarta-tomcat-connectors-jk-1.2.5-src.tar.gz</strong></a><br />
<br />
</span><strong>配置步骤</strong><span xml:lang="EN-US"><br />
1) </span>安装<span xml:lang="EN-US"> JDK </span>与<span xml:lang="EN-US"> Tomcat</span>，这些安装步骤就不多说了。<span xml:lang="EN-US"><br />
<br />
2) </span>编译<span xml:lang="EN-US"> jakarta-tomcat-connectors-jk-1.2.5-src</span>，生成<span xml:lang="EN-US"> mod_jk.so</span>，并将其复制到<span xml:lang="EN-US"> apache </span>的<span xml:lang="EN-US"> modules </span>存放目录：</p>
<div>
<p align="left"><span xml:lang="EN-US">tar xzf jakarta-tomcat-connectors-jk-1.2.5-src.tar.gz</span></p>
<p align="left"><span xml:lang="EN-US">cd jakarta-tomcat-connectors-jk-1.2.5-src/jk/native</span></p>
<p align="left"><span xml:lang="EN-US">./configure --with-apxs=/usr/local/apache/bin/apxs</span></p>
<p align="left"><span xml:lang="EN-US">make</span></p>
<p align="left"><span xml:lang="EN-US">cp apache-1.3/mod_jk.so /usr/local/apache/libexec</span></p>
</div>
<p align="left"><span xml:lang="EN-US"><br />
<br />
3) </span>编辑<span xml:lang="EN-US"> Apache </span>配置文件<span xml:lang="EN-US"> /usr/local/apache/conf/httpd.conf</span>，加入：</p>
<div>
<p align="left"><span xml:lang="EN-US">LoadModule jk_module libexec/mod_jk.so</span></p>
<p align="left"><span xml:lang="EN-US">AddModule mod_jk.c</span></p>
</div>
<p align="left"><span xml:lang="EN-US"><br />
</span>这个<span xml:lang="EN-US"> LoadModule </span>语句最好放在其他<span xml:lang="EN-US"> LoadModule </span>语句后边。<span xml:lang="EN-US"><br />
</span>同时在配置文件后边加入：</p>
<div>
<p align="left"><span xml:lang="EN-US"># workers.properties </span>文件所在路径，后边将对此文件进行讲解</p>
<p align="left"><span xml:lang="EN-US">JkWorkersFile /usr/local/apache/conf/workers.properties</span></p>
<p align="left"><span xml:lang="EN-US"># jk </span>的日志文件存放路径</p>
<p align="left"><span xml:lang="EN-US">JkLogFile /usr/local/apache/log/mod_jk.log</span></p>
<p align="left"><span xml:lang="EN-US"># </span>设置<span xml:lang="EN-US"> jk </span>的日志级别<span xml:lang="EN-US"> [debug/error/info]</span></p>
<p align="left"><span xml:lang="EN-US">JkLogLevel info</span></p>
<p align="left"><span xml:lang="EN-US"># </span>选择日志时间格式</p>
<p align="left"><span xml:lang="EN-US">JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "</span></p>
<p align="left"><span xml:lang="EN-US"># JkOptions </span>选项设置</p>
<p align="left"><span xml:lang="EN-US">JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories</span></p>
<p align="left"><span xml:lang="EN-US"># JkRequestLogFormat </span>设置日志的请求格式</p>
<p align="left"><span xml:lang="EN-US">JkRequestLogFormat "%w %V %T"</span></p>
<p align="left"><span xml:lang="EN-US"># </span>映射<span xml:lang="EN-US"> /examples/* </span>到<span xml:lang="EN-US"> worker1</span>，<span xml:lang="EN-US">worker1 </span>在<span xml:lang="EN-US"> workers.properties </span>文件中定义</p>
<p align="left"><span xml:lang="EN-US">JkMount /examples/* worker1</span></p>
</div>
<p align="left"><span xml:lang="EN-US"><br />
<br />
4) </span>在<span xml:lang="EN-US"> /usr/local/apache/conf/ </span>目录下创建<span xml:lang="EN-US"> workers.properties </span>文件，其内容如下：</p>
<div>
<p align="left"><span xml:lang="EN-US"># </span>定义使用<span xml:lang="EN-US"> ajp13 </span>的<span xml:lang="EN-US"> worker1</span></p>
<p align="left"><span xml:lang="EN-US">worker.list=worker1</span></p>
<p align="left"><span xml:lang="EN-US"># </span>设置<span xml:lang="EN-US"> worker1 </span>的属性（<span xml:lang="EN-US">ajp13</span>）</p>
<p align="left"><span xml:lang="EN-US">worker.worker1.type=ajp13</span></p>
<p align="left"><span xml:lang="EN-US">worker.worker1.host=localhost</span></p>
<p align="left"><span xml:lang="EN-US">worker.worker1.port=8009</span></p>
<p align="left"><span xml:lang="EN-US">worker.worker1.lbfactor=50</span></p>
<p align="left"><span xml:lang="EN-US">worker.worker1.cachesize=10</span></p>
<p align="left"><span xml:lang="EN-US">worker.worker1.cache_timeout=600</span></p>
<p align="left"><span xml:lang="EN-US">worker.worker1.socket_keepalive=1</span></p>
<p align="left"><span xml:lang="EN-US">worker.worker1.socket_timeout=300</span></p>
</div>
<p align="left"><span xml:lang="EN-US"><br />
<br />
5) </span>好了，启动<span xml:lang="EN-US"> Tomcat</span>，重启一下<span xml:lang="EN-US"> Apache HTTPD Server</span>，访问：<span xml:lang="EN-US">http://localhost/examples/index.jsp</span>，看看结果如何，和 <span xml:lang="EN-US"><a href="http://localhost:8080/examples/index.jsp" target="_blank"><strong>http://localhost:8080/examples/index.jsp</strong></a> </span>是一样的。<span xml:lang="EN-US"><br />
<br />
</span>提示：如果不想让别人通过<span xml:lang="EN-US"> 8080 </span>端口访问到你的<span xml:lang="EN-US"> Tomcat</span>，可以将<span xml:lang="EN-US"> /usr/lcoal/tomcat/conf/server.xml </span>配置文件中的如下代码加上注释：</p>
<div>
<p align="left"><span xml:lang="EN-US">&lt;!--</span></p>
<p align="left"><span xml:lang="EN-US">&lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector"</span></p>
<p align="left"><span xml:lang="EN-US">port="8080" minProcessors="5" maxProcessors="75"</span></p>
<p align="left"><span xml:lang="EN-US">enableLookups="false" redirectPort="8443"</span></p>
<p align="left"><span xml:lang="EN-US">acceptCount="100" debug="0" connectionTimeout="20000"</span></p>
<p align="left"><span xml:lang="EN-US">useURIValidationHack="false" disableUploadTimeout="true" /&gt;</span></p>
<p align="left"><span xml:lang="EN-US">--&gt;</span></p>
</div>
<span>
<p align="left"><br />
然后重新启动<span xml:lang="EN-US"> Tomcat </span>即可。<span xml:lang="EN-US"><br />
<br />
</span><strong>总结</strong><span xml:lang="EN-US"><br />
</span>此方案安装配置稍微复杂些，但执行效率要比第一种方案要好很多。所以决定使用这种方案来完成我的<span xml:lang="EN-US"> Lucene </span>全文检索实践任务。</p>
<p align="left"><span xml:lang="EN-US">对于 Lucene 的初步研究已经过去一段时间，自己感觉还不是很深入，但由于时间的关系，一直也没再拿起。应网友的要求，将自己实践中写的一些代码贴出来，希望能对大家有用。程序没有做进一步的优化，只是很简单的实现功能而已，仅供参考。<br />
<br />
在实践中，我以将 PHP 中文手册中的 HTML 文件生成索引，然后通过一个 JSP 对其进行全文检索。 <br />
生成索引的 Java 代码：</span></p>
<div>
<p align="left"><span xml:lang="EN-US">/**</span></p>
<p align="left"><span xml:lang="EN-US">* PHPDocIndexer.java</span></p>
<p align="left"><span xml:lang="EN-US">* 用于对 PHPDoc 的 HTML 页面生成索引文件。</span></p>
<p align="left"><span xml:lang="EN-US">*/</span></p>
<p align="left"><span xml:lang="EN-US">import java.io.File;</span></p>
<p align="left"><span xml:lang="EN-US">import java.io.FileReader;</span></p>
<p align="left"><span xml:lang="EN-US">import java.io.BufferedReader;</span></p>
<p align="left"><span xml:lang="EN-US">import java.io.IOException;</span></p>
<p align="left"><span xml:lang="EN-US">import java.util.Date;</span></p>
<p align="left"><span xml:lang="EN-US">import java.text.DateFormat;</span></p>
<p align="left"><span xml:lang="EN-US">import java.lang.*;</span></p>
<p align="left"><span xml:lang="EN-US">import org.apache.lucene.analysis.cjk.CJKAnalyzer;</span></p>
<p align="left"><span xml:lang="EN-US">import org.apache.lucene.index.IndexWriter;</span></p>
<p align="left"><span xml:lang="EN-US">import org.apache.lucene.document.Document;</span></p>
<p align="left"><span xml:lang="EN-US">import org.apache.lucene.document.Field;</span></p>
<p align="left"><span xml:lang="EN-US">import org.apache.lucene.document.DateField;</span></p>
<p align="left"><span xml:lang="EN-US">class PHPDocIndexer</span></p>
<p align="left"><span xml:lang="EN-US">{</span></p>
<p align="left"><span xml:lang="EN-US">public static void main(String[] args) throws ClassNotFoundException, IOException</span></p>
<p align="left"><span xml:lang="EN-US">{</span></p>
<p align="left"><span xml:lang="EN-US">try {</span></p>
<p align="left"><span xml:lang="EN-US">Date start = new Date();</span></p>
<p align="left"><span xml:lang="EN-US">IndexWriter writer = new IndexWriter("/home/nio/indexes-phpdoc", new CJKAnalyzer(), true); //索引保存目录，必须存在</span></p>
<p align="left"><span xml:lang="EN-US">indexDocs(writer, new File("/home/nio/phpdoc-zh")); //HTML 文件保存目录</span></p>
<p align="left"><span xml:lang="EN-US">System.out.println("Optimizing ....");</span></p>
<p align="left"><span xml:lang="EN-US">writer.optimize();</span></p>
<p align="left"><span xml:lang="EN-US">writer.close();</span></p>
<p align="left"><span xml:lang="EN-US">Date end = new Date();</span></p>
<p align="left"><span xml:lang="EN-US">System.out.print("Total time: ");</span></p>
<p align="left"><span xml:lang="EN-US">System.out.println(end.getTime() - start.getTime());</span></p>
<p align="left"><span xml:lang="EN-US">} catch (Exception e) {</span></p>
<p align="left"><span xml:lang="EN-US">System.out.println("Class " + e.getClass() + " throws error!/n errmsg: " + e.getMessage());</span></p>
<p align="left"><span xml:lang="EN-US">} //end try</span></p>
<p align="left"><span xml:lang="EN-US">} //end main</span></p>
<p align="left"><span xml:lang="EN-US">public static void indexDocs(IndexWriter writer, File file) throws Exception </span></p>
<p align="left"><span xml:lang="EN-US">{</span></p>
<p align="left"><span xml:lang="EN-US">if (file.isDirectory()) {</span></p>
<p align="left"><span xml:lang="EN-US">String[] files = file.list();</span></p>
<p align="left"><span xml:lang="EN-US">for (int i = 0; i &lt; files.length; i++) {</span></p>
<p align="left"><span xml:lang="EN-US">indexDocs(writer, new File(file, files[i]));</span></p>
<p align="left"><span xml:lang="EN-US">} //end for</span></p>
<p align="left"><span xml:lang="EN-US">} else if (file.getPath().endsWith(".html")) { //只对 HTML 文件做索引 </span></p>
<p align="left"><span xml:lang="EN-US">System.out.print("Add file:" + file + " ....");</span></p>
<p align="left"><span xml:lang="EN-US">// Add html file ....</span></p>
<p align="left"><span xml:lang="EN-US">Document doc = new Document();</span></p>
<p align="left"><span xml:lang="EN-US">doc.add(Field.UnIndexed("file", file.getName())); //索引文件名</span></p>
<p align="left"><span xml:lang="EN-US">doc.add(Field.UnIndexed("modified", DateFormat.getDateTimeInstance().format(new Date(file.lastModified())))); //索引最后修改时间</span></p>
<p align="left"><span xml:lang="EN-US">String title = "";</span></p>
<p align="left"><span xml:lang="EN-US">String content = "";</span></p>
<p align="left"><span xml:lang="EN-US">String status = "start";</span></p>
<p align="left"><span xml:lang="EN-US">FileReader fReader = new FileReader(file);</span></p>
<p align="left"><span xml:lang="EN-US">BufferedReader bReader = new BufferedReader(fReader);</span></p>
<p align="left"><span xml:lang="EN-US">String line = bReader.readLine();</span></p>
<p align="left"><span xml:lang="EN-US">while (line != null) { </span></p>
<p align="left"><span xml:lang="EN-US">content += line;</span></p>
<p align="left"><span xml:lang="EN-US">//截取 HTML 标题 &lt;title&gt;</span></p>
<p align="left"><span xml:lang="EN-US">if ("start" == status &amp;&amp; line.equalsIgnoreCase("&gt;&lt;TITLE")) {</span></p>
<p align="left"><span xml:lang="EN-US">status = "match";</span></p>
<p align="left"><span xml:lang="EN-US">} else if ("match" == status) {</span></p>
<p align="left"><span xml:lang="EN-US">title = line.substring(1, line.length() - 7);</span></p>
<p align="left"><span xml:lang="EN-US">doc.add(Field.Text("title", title)); //索引标题</span></p>
<p align="left"><span xml:lang="EN-US">status = "end";</span></p>
<p align="left"><span xml:lang="EN-US">} //end if</span></p>
<p align="left"><span xml:lang="EN-US">line = bReader.readLine();</span></p>
<p align="left"><span xml:lang="EN-US">} //end while</span></p>
<p align="left"><span xml:lang="EN-US">bReader.close();</span></p>
<p align="left"><span xml:lang="EN-US">fReader.close();</span></p>
<p align="left"><span xml:lang="EN-US">doc.add(Field.Text("content", content.replaceAll("&lt;[^&lt;&gt;]+&gt;", ""))); //索引内容</span></p>
<p align="left"><span xml:lang="EN-US">writer.addDocument(doc);</span></p>
<p align="left"><span xml:lang="EN-US">System.out.println(" [OK]");</span></p>
<p align="left"><span xml:lang="EN-US">} //end if</span></p>
<p align="left"><span xml:lang="EN-US">}</span></p>
<p align="left"><span xml:lang="EN-US">} //end class</span></p>
</div>
<p align="left"><span xml:lang="EN-US"><br />
<br />
索引生成完之后，就需要一个检索页面，下边是搜索页面（search.jsp）的代码：</span></p>
<div>
<p align="left"><span xml:lang="EN-US">&lt;%@ page
language="java" import="javax.servlet.*, javax.servlet.http.*,
java.io.*, java.util.Date, java.util.ArrayList, java.util.regex.*,
org.apache.lucene.analysis.*, org.apache.lucene.document.*,
org.apache.lucene.index.*, org.apache.lucene.search.*,
org.apache.lucene.queryParser.*, org.apache.lucene.analysis.Token,
org.apache.lucene.analysis.TokenStream,
org.apache.lucene.analysis.cjk.CJKAnalyzer,
org.apache.lucene.analysis.cjk.CJKTokenizer,
com.chedong.weblucene.search.WebLuceneHighlighter" %&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;%@ page contentType="text/html;charset=GB2312" %&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"</span></p>
<p align="left"><span xml:lang="EN-US">"http://www.w3.org/TR/html4/strict.dtd"&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;html&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;head&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312" /&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;title&gt;PHPDoc - PHP 简体中文手册全文检索&lt;/title&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;base target="main"&gt;&lt;!-- 由于使用了 Frame，所以指定 target 到 main 窗口显示 --&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;style&gt;</span></p>
<p align="left"><span xml:lang="EN-US">body {background-color: white; margin: 4px}</span></p>
<p align="left"><span xml:lang="EN-US">body, input, div {font-family: Tahoma; font-size: 9pt}</span></p>
<p align="left"><span xml:lang="EN-US">body, div {line-height: 18px}</span></p>
<p align="left"><span xml:lang="EN-US">u {color: red}</span></p>
<p align="left"><span xml:lang="EN-US">b {color: navy}</span></p>
<p align="left"><span xml:lang="EN-US">form {padding: 0px; margin: 0px}</span></p>
<p align="left"><span xml:lang="EN-US">.txt {border: 1px solid black}</span></p>
<p align="left"><span xml:lang="EN-US">.f {padding: 4px;
margin-bottom: 16px; background-color: #E5ECF9; border-top: 1px solid
#3366CC; border-bottom: 1px solid #3366CC; text-align: center;}</span></p>
<p align="left"><span xml:lang="EN-US">.d, .o {padding-left: 16px}</span></p>
<p align="left"><span xml:lang="EN-US">.d {color: gray}</span></p>
<p align="left"><span xml:lang="EN-US">.o {color: green}</span></p>
<p align="left"><span xml:lang="EN-US">.o a {color: #7777CC}</span></p>
<p align="left"><span xml:lang="EN-US">&lt;/style&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;script language="JavaScript"&gt;</span></p>
<p align="left"><span xml:lang="EN-US">function gotoPage(i)</span></p>
<p align="left"><span xml:lang="EN-US">{</span></p>
<p align="left"><span xml:lang="EN-US">document.frm.page.value = i;</span></p>
<p align="left"><span xml:lang="EN-US">document.frm.submit();</span></p>
<p align="left"><span xml:lang="EN-US">} //end function</span></p>
<p align="left"><span xml:lang="EN-US">&lt;/script&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;/head&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;body&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;%</span></p>
<p align="left"><span xml:lang="EN-US">String keyVal = null;</span></p>
<p align="left"><span xml:lang="EN-US">String pageVal = null;</span></p>
<p align="left"><span xml:lang="EN-US">int offset = 0;</span></p>
<p align="left"><span xml:lang="EN-US">int curPage = 0;</span></p>
<p align="left"><span xml:lang="EN-US">int pages;</span></p>
<p align="left"><span xml:lang="EN-US">final int ROWS = 50;</span></p>
<p align="left"><span xml:lang="EN-US">//获取 GET 参数</span></p>
<p align="left"><span xml:lang="EN-US">try {</span></p>
<p align="left"><span xml:lang="EN-US">byte[] keyValByte = request.getParameter("key").getBytes("ISO8859_1"); //查找关键字</span></p>
<p align="left"><span xml:lang="EN-US">keyVal = new String(keyValByte);</span></p>
<p align="left"><span xml:lang="EN-US">pageVal = request.getParameter("page"); //页码</span></p>
<p align="left"><span xml:lang="EN-US">} catch (Exception e) {</span></p>
<p align="left"><span xml:lang="EN-US">//do nothing;</span></p>
<p align="left"><span xml:lang="EN-US">}</span></p>
<p align="left"><span xml:lang="EN-US">if (keyVal == null)</span></p>
<p align="left"><span xml:lang="EN-US">keyVal = new String("");</span></p>
<p align="left"><span xml:lang="EN-US">%&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;div class="f"&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;form name="frm" action="./index.jsp" method="GET" onsubmit="this.page.value='0';return true;" target="_self"&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;input type="text" name="key" class="txt" size="40" value="&lt;%=keyVal%&gt;" /&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;input type="hidden" name="page" value="&lt;%=pageVal%&gt;" /&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;input type="submit" value="搜 索" /&gt;&lt;br /&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;font color="green"&gt;提示：可使用多个关键字（使用空格隔开）提高搜索的准确率。&lt;/font&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;/form&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;script language="JavaScript"&gt;</span></p>
<p align="left"><span xml:lang="EN-US">document.frm.key.focus();</span></p>
<p align="left"><span xml:lang="EN-US">&lt;/script&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;/div&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;%</span></p>
<p align="left"><span xml:lang="EN-US">if (keyVal != null &amp;&amp; keyVal.length() &gt; 0) {</span></p>
<p align="left"><span xml:lang="EN-US">try {</span></p>
<p align="left"><span xml:lang="EN-US">curPage = Integer.parseInt(pageVal); //将当前页转换成整数</span></p>
<p align="left"><span xml:lang="EN-US">} catch (Exception e) {</span></p>
<p align="left"><span xml:lang="EN-US">//do nothing;</span></p>
<p align="left"><span xml:lang="EN-US">} //end try</span></p>
<p align="left"><span xml:lang="EN-US">try {</span></p>
<p align="left"><span xml:lang="EN-US">Date startTime = new Date();</span></p>
<p align="left"><span xml:lang="EN-US">keyVal = keyVal.toLowerCase().replaceAll("(or|and)", "").trim().replaceAll("//s+", " AND ");</span></p>
<p align="left"><span xml:lang="EN-US">Searcher searcher = new IndexSearcher("/home/nio/indexes-phpdoc"); //索引目录</span></p>
<p align="left"><span xml:lang="EN-US">Analyzer analyzer = new CJKAnalyzer();</span></p>
<p align="left"><span xml:lang="EN-US">String[] fields = {"title", "content"}; </span></p>
<p align="left"><span xml:lang="EN-US">Query query = MultiFieldQueryParser.parse(keyVal, fields, analyzer);</span></p>
<p align="left"><span xml:lang="EN-US">Hits hits = searcher.search(query);</span></p>
<p align="left"><span xml:lang="EN-US">StringReader in = new StringReader(keyVal);</span></p>
<p align="left"><span xml:lang="EN-US">TokenStream tokenStream = analyzer.tokenStream("", in);</span></p>
<p align="left"><span xml:lang="EN-US">ArrayList al = new ArrayList();</span></p>
<p align="left"><span xml:lang="EN-US">for (Token token = tokenStream.next(); token != null; token = tokenStream.next()) {</span></p>
<p align="left"><span xml:lang="EN-US">al.add(token.termText());</span></p>
<p align="left"><span xml:lang="EN-US">} //end for</span></p>
<p align="left"><span xml:lang="EN-US">//总页数</span></p>
<p align="left"><span xml:lang="EN-US">pages = (new Integer(hits.length()).doubleValue() % ROWS != 0) (hits.length() / ROWS) + 1 : (hits.length() / ROWS);</span></p>
<p align="left"><span xml:lang="EN-US">//当前页码</span></p>
<p align="left"><span xml:lang="EN-US">if (curPage &lt; 1)</span></p>
<p align="left"><span xml:lang="EN-US">curPage = 1;</span></p>
<p align="left"><span xml:lang="EN-US">else if (curPage &gt; pages)</span></p>
<p align="left"><span xml:lang="EN-US">curPage = pages;</span></p>
<p align="left"><span xml:lang="EN-US">//起始、终止下标</span></p>
<p align="left"><span xml:lang="EN-US">offset = (curPage - 1) * ROWS;</span></p>
<p align="left"><span xml:lang="EN-US">int end = Math.min(hits.length(), offset + ROWS);</span></p>
<p align="left"><span xml:lang="EN-US">//循环输出查询结果</span></p>
<p align="left"><span xml:lang="EN-US">WebLuceneHighlighter hl = new WebLuceneHighlighter(al);</span></p>
<p align="left"><span xml:lang="EN-US">for (int i = offset; i &lt; end; i++) {</span></p>
<p align="left"><span xml:lang="EN-US">Document doc = hits.doc(i);</span></p>
<p align="left"><span xml:lang="EN-US">%&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;div
class="t"&gt;&lt;a
href="/~nio/phpdoc-zh/&lt;%=doc.get("file")%&gt;"&gt;&lt;%=hl.highLight(doc.get("title"))%&gt;&lt;/a&gt;&lt;/div&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;div class="d"&gt;&lt;%=hl.highLight(doc.get("content").replaceAll("/n", " "), 100)%&gt; &#8230;&#8230;&lt;/div&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;div class="o"&gt;</span></p>
<p align="left"><span xml:lang="EN-US">/~nio/phpdoc-zh/&lt;%=doc.get("file")%&gt;</span></p>
<p align="left"><span xml:lang="EN-US">-</span></p>
<p align="left"><span xml:lang="EN-US">&lt;%=doc.get("modified")%&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;/div&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;br /&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;%</span></p>
<p align="left"><span xml:lang="EN-US">} //end for</span></p>
<p align="left"><span xml:lang="EN-US">searcher.close();</span></p>
<p align="left"><span xml:lang="EN-US">Date endTime = new Date();</span></p>
<p align="left"><span xml:lang="EN-US">%&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;div class="f"&gt;</span></p>
<p align="left"><span xml:lang="EN-US">检 索总共耗时
&lt;b&gt;&lt;%=((endTime.getTime() - startTime.getTime()) /
1000.0)%&gt;&lt;/b&gt; 秒，约有 &lt;b&gt;&lt;%=hits.length()%&gt;&lt;/b&gt;
项符合条件的记录，共 &lt;b&gt;&lt;%=pages%&gt;&lt;/b&gt; 页</span></p>
<p align="left"><span xml:lang="EN-US">&lt;%</span></p>
<p align="left"><span xml:lang="EN-US">if (curPage &gt; 1 &amp;&amp; pages &gt; 1) {</span></p>
<p align="left"><span xml:lang="EN-US">%&gt;</span></p>
<p align="left"><span xml:lang="EN-US">|&lt;a href="javascript:gotoPage(&lt;%=(curPage-1)%&gt;);" target="_self"&gt;上一页&lt;/a&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;%</span></p>
<p align="left"><span xml:lang="EN-US">} //end if</span></p>
<p align="left"><span xml:lang="EN-US">if (curPage &lt; pages &amp;&amp; pages &gt; 1) {</span></p>
<p align="left"><span xml:lang="EN-US">%&gt;</span></p>
<p align="left"><span xml:lang="EN-US">|&lt;a href="javascript:gotoPage(&lt;%=(curPage+1)%&gt;)" target="_self"&gt;下一页&lt;/a&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;%</span></p>
<p align="left"><span xml:lang="EN-US">} //end if</span></p>
<p align="left"><span xml:lang="EN-US">} catch (Exception e) {</span></p>
<p align="left"><span xml:lang="EN-US">%&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;!-- &lt;%=e.getClass()%&gt; 导致错误：&lt;%=e.getMessage()%&gt; --&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;%</span></p>
<p align="left"><span xml:lang="EN-US">} //end if</span></p>
<p align="left"><span xml:lang="EN-US">} //end if</span></p>
<p align="left"><span xml:lang="EN-US">%&gt; </span></p>
<p align="left"><span xml:lang="EN-US">&lt;/body&gt;</span></p>
<p align="left"><span xml:lang="EN-US">&lt;/html&gt;</span></p>
</div>
</span></span></span>
</div>
<img src ="http://www.blogjava.net/nkjava/aggbug/257498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nkjava/" target="_blank">草原上的骆驼</a> 2009-03-03 11:31 <a href="http://www.blogjava.net/nkjava/archive/2009/03/03/257498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>