??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久亚洲Av片无码v,亚洲熟妇无码八V在线播放,最新亚洲春色Av无码专区 http://m.tkk7.com/nkjava/category/38040.html|n瀚的草原Q方向最为重要,希望此blog能向大漠驼铃一Pl我方向和指引?/description>zh-cnTue, 03 Mar 2009 08:21:30 GMTTue, 03 Mar 2009 08:21:30 GMT60Lucene 索引数据?http://m.tkk7.com/nkjava/archive/2009/03/03/257586.html草原上的骆驼草原上的骆驼Tue, 03 Mar 2009 08:01:00 GMThttp://m.tkk7.com/nkjava/archive/2009/03/03/257586.htmlhttp://m.tkk7.com/nkjava/comments/257586.htmlhttp://m.tkk7.com/nkjava/archive/2009/03/03/257586.html#Feedback0http://m.tkk7.com/nkjava/comments/commentRss/257586.htmlhttp://m.tkk7.com/nkjava/services/trackbacks/257586.html  因ؓ考虑到篇q的问题Q所以该文不会讲的很详细Q也不可能讲的很深?/p>

  本文以这Ll构q行Q?/p>

  1.介绍数据库中Authors表的l构

  2.为数据库建立索引

  3.为数据库建立查询功能

  4.在web界面下进行查询ƈ昄l果

  1Q介l数据库中Authors表的l构

字段名称         字段cd         字段含义

Au_id                Varchar(11)    作者号
Au_name        Varchar(60)     作者名
Phone             Char(12)           电话L
Address          Varchar(40)      地址
City                   Varchar(20)     城市
State                Char(2)             省䆾
Zip                    Char(5)             邮编
contract            Bit(1)                外键Q关pM大)


表中的部分内容:
 

  2Qؓ数据库徏立烦?/p>

  首先建立一个类TestLucene.java。这个类是Ҏ据库q行建立索引Q编写查询条件等?/p>

  当然Q最开始就是徏立数据库q接。连接代码这里就省略了。^_^

  接着Q新Z个方法getResutl(String),它返回的是数据库表Authors的内宏V具体代码如下:


    public ResultSet getResult(String sql){
      try{
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        return rs;
      }
      catch(SQLException e){
        System.out.println(e);
      }
      return null;
    }
 


然后Qؓ数据库徏立烦引?/p>

  首先要定义一个IndexWriterQ)Q它是将索引写进Lucene自己的数据库中,它存攄位置是有你自己定义的。在定义 IndexWriter是需要指定它的分析器。Lucene自己自带有几个分析器Q例 如:StandarAnalyzer(),SimpleAnalyzer(),StopAnalyzer(){。它作用是对文本q行分析Q判断如何进行切 词?br /> 接着Q要定义一个Document。Document相当于二l表中一行数据一栗Document里包含的是Field字段QField相当于数据库中一列,也就是一个属性,一个字Dc?br /> 最后应该对IndexWriterq行优化Q方法很单,是writer.optimize().
具体代码如下Q?/p>


  public void Index(ResultSet rs){
      try{
        IndexWriter writer = new IndexWriter("d:/index/", getAnalyzer(), true);
        while(rs.next()){
            Document doc=new Document();
            doc.add(Field.Keyword("id",rs.getString("au_id")));
            doc.add(Field.Text("name",rs.getString("au_name")));
            doc.add(Field.UnIndexed("address",rs.getString("address")));
            doc.add(Field.UnIndexed("phone",rs.getString("phone")));
            doc.add(Field.Text("City",rs.getString("city")));
            writer.addDocument(doc);
          }
        writer.optimize();
        writer.close();
      }
      catch(IOException e){
        System.out.println(e);
      }
      catch(SQLException e){
        System.out.println(e);
      }
    }

    public Analyzer getAnalyzer(){
      return new StandardAnalyzer();
    }


3Qؓ数据库徏立查询功?/p>

  在类TestLucene中徏立一个新的方法searcher(String)Q它q回的是一个搜索的l构集,相当于数据库中的ResultSet一栗它代的参数是你要查询的内容。这里,我把要查询的字段写死了。你可以在添加一个参数表C查询的字Dc?br /> q里主要有两个对象IndexSearcher和Query。IndexSearcher是找到烦引数据库QQuery是处理搜索,它包含了三个参数Q查询内容,查询字段Q分析器?br /> 具体代码如下Q?/p>


  public Hits seacher(String queryString){
      Hits hits=null;;
      try{
        IndexSearcher is = new IndexSearcher("D:/index/");
        Query query=QueryParser.parse(queryString,"City",getAnalyzer());
        hits=is.search(query);
      }catch(Exception e){
        System.out.print(e);
      }
      return hits;
    }
 


4Q在web界面下进行查询ƈ昄l果

  q里建立一个Jsp面TestLucene.jspq行搜烦?/p>

  在TestLucene.jsp面中首先引入类


<%@ page import="lucenetest.LucentTest"%>
<%@ page import="org.apache.lucene.search.*,org.apache.lucene.document.*" %>
 


然后定义一个LuceneTest对象Q获取查询结果集Q?/p>


  LucentTest lucent=new LucentTest();
  Hits hits=lucent.seacher(request.getParameter("queryString"));
 


定义一个FormQ徏立一个查询环境:


<form action="TestLucene.jsp">
  <input  type="text" name="queryString"/>
  <input type="submit" value="搜烦"/>
</form>
 


昄查询l果Q?/p>


<table>
  <%if(hits!=null){%>
  <tr>
    <td>作者号</td>
    <td>作者名</td>
    <td>地址</td>
    <td>电话L</td>
  </tr>

 <% for(int i=0;i<hits.length();i++){
    Document doc=hits.doc(i);
   %>
    <tr>
    <td><%=doc.get("id") %></td>
    <td><%=doc.get("name") %></td>
    <td><%=doc.get("address") %></td>
    <td><%=doc.get("phone") %></td>
  </tr>
 <% }}%>
</table>



]]>
用Lucene索引数据?/title><link>http://m.tkk7.com/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://m.tkk7.com/nkjava/archive/2009/03/03/257582.html</guid><wfw:comment>http://m.tkk7.com/nkjava/comments/257582.html</wfw:comment><comments>http://m.tkk7.com/nkjava/archive/2009/03/03/257582.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/nkjava/comments/commentRss/257582.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/nkjava/services/trackbacks/257582.html</trackback:ping><description><![CDATA[(?http://www.wujianrong.com/archives/2007/03/lucene_7.html<br />  1.写一D传l的JDBCE序Q讲每条的用户信息从数据库读取出?br /> 2.针对每条用户记录Q徏立一个lucene document <br /> Document doc = new Document();<br /> q根据你的需要,用户信息的各个字段对应luncene document中的field q行dQ如Q?<br /> doc.add(new Field("NAME","USERNAME",Field.Store.YES,Field.Index.UN_TOKENIZED));<br /> 然后该条doc加入到烦引中Q?如: luceneWriter.addDocument(doc);<br /> q样徏立了lucene的烦引库<br /> 3.~写对烦引库的搜索程序(看lucene文档Q,通过对lucene的烦引库的查找,你可以快速找到对应记录的ID<br /> 4.通过ID到数据库中查扄兌? <div> <div><font style="font-weight: bold;" size="4">用Lucene索引数据?/font><br /> <br /> LuceneQ作ZU全文搜索的辅助工具Qؓ我们q行条g搜烦Q无论是像Google,Baidu之类的搜索引擎,q是论坛中的搜烦功能Q还是其? C/S架构的搜索,都带来了极大的便利和比较高的效率。本文主要是利用Lucene对MS Sql Server 2000q行建立索引Q然后进行全文烦引。至于数据库的内容,可以是网늚内容Q还是其它的。本文中数据库的内容是图书馆理pȝ中的某个作者表Q? Authors表?</div> <p>  因ؓ考虑到篇q的问题Q所以该文不会讲的很详细Q也不可能讲的很深?/p> <p>  本文以这Ll构q行Q?/p> <p>  1.介绍数据库中Authors表的l构</p> <p>  2.为数据库建立索引</p> <p>  3.为数据库建立查询功能</p> <p>  4.在web界面下进行查询ƈ昄l果</p> <p>  1Q介l数据库中Authors表的l构</p> <p>字段名称         字段cd         字段含义</p> <p>Au_id                Varchar(11)    作者号<br /> Au_name        Varchar(60)     作者名<br /> Phone             Char(12)           电话L<br /> Address          Varchar(40)      地址<br /> City                   Varchar(20)     城市<br /> State                Char(2)             省䆾<br /> Zip                    Char(5)             邮编<br /> contract            Bit(1)                外键Q关pM大)<br /> <br /> 表中的部分内容: </p> <p>  2Qؓ数据库徏立烦?/p> <p>  首先建立一个类TestLucene.java。这个类是Ҏ据库q行建立索引Q编写查询条件等?/p> <p>  当然Q最开始就是徏立数据库q接。连接代码这里就省略了。^_^</p> <p>  接着Q新Z个方法getResutl(String),它返回的是数据库表Authors的内宏V具体代码如下:</p> <p>    public ResultSet getResult(String sql){<br />       try{<br />         Statement stmt = conn.createStatement();<br />         ResultSet rs = stmt.executeQuery(sql);<br />         return rs;<br />       }<br />       catch(SQLException e){<br />         System.out.println(e);<br />       }<br />       return null;<br />     }<br /> <br /> 然后Qؓ数据库徏立烦引?/p> <p>  首先要定义一个IndexWriterQ)Q它是将索引写进Lucene自己的数据库中,它存攄位置是有你自己定义的。在定义 IndexWriter 是需要指定它的分析器。Lucene自己自带有几个分析器Q例如:StandarAnalyzer(),SimpleAnalyzer(), StopAnalyzer(){。它作用是对文本q行分析Q判断如何进行切词?br /> 接着Q要定义一个Document。Document相当于二l表中一行数据一栗Document里包含的是Field字段QField相当于数据库中一列,也就是一个属性,一个字Dc?br /> 最后应该对IndexWriterq行优化Q方法很单,是writer.optimize().<br /> 具体代码如下Q?br /> <br />   public void Index(ResultSet rs){<br />       try{<br />         IndexWriter writer = new IndexWriter("d:/index/", getAnalyzer(), true);<br />         while(rs.next()){<br />             Document doc=new Document();<br />             doc.add(Field.Keyword("id",rs.getString("au_id")));<br />             doc.add(Field.Text("name",rs.getString("au_name")));<br />             doc.add(Field.UnIndexed("address",rs.getString("address")));<br />             doc.add(Field.UnIndexed("phone",rs.getString("phone")));<br />             doc.add(Field.Text("City",rs.getString("city")));<br />             writer.addDocument(doc);<br />           }<br />         writer.optimize();<br />         writer.close();<br />       }<br />       catch(IOException e){<br />         System.out.println(e);<br />       }<br />       catch(SQLException e){<br />         System.out.println(e);<br />       }<br />     } </p> <p>    public Analyzer getAnalyzer(){<br />       return new StandardAnalyzer();<br />     }<br /> <br /> 3Qؓ数据库徏立查询功?/p> <p>  在类TestLucene中徏立一个新的方法searcher(String)Q它q回的是一个搜索的l构集,相当于数据库中的ResultSet一栗它代的参数是你要查询的内容。这里,我把要查询的字段写死了。你可以在添加一个参数表C查询的字Dc?br /> q里主要有两个对象IndexSearcher和Query。IndexSearcher是找到烦引数据库QQuery是处理搜索,它包含了三个参数Q查询内容,查询字段Q分析器?br /> 具体代码如下Q?br /> <br />   public Hits seacher(String queryString){<br />       Hits hits=null;;<br />       try{<br />         IndexSearcher is = new IndexSearcher("D:/index/");<br />         Query query=QueryParser.parse(queryString,"City",getAnalyzer());<br />         hits=is.search(query);<br />       }catch(Exception e){<br />         System.out.print(e);<br />       }<br />       return hits;<br />     }<br /> <br /> 4Q在web界面下进行查询ƈ昄l果</p> <p>  q里建立一个Jsp面TestLucene.jspq行搜烦?/p> <p>  在TestLucene.jsp面中首先引入类</p> <p><br /> <%@ page import="lucenetest.LucentTest"%><br /> <%@ page import="org.apache.lucene.search.*,org.apache.lucene.document.*" %> <br /> </p> <p>  然后定义一个LuceneTest对象Q获取查询结果集Q?br /> <br />   LucentTest lucent=new LucentTest();<br />   Hits hits=lucent.seacher(request.getParameter("queryString"));<br /> <br /> 定义一个FormQ徏立一个查询环境:<br /> <br /> <form action="TestLucene.jsp"><br />   <input  type="text" name="queryString"/><br />   <input type="submit" value="搜烦"/><br /> </form><br /> <br /> 昄查询l果Q?br /> <br /> <table><br />   <%if(hits!=null){%><br />   <tr><br />     <td>作者号</td><br />     <td>作者名</td><br />     <td>地址</td><br />     <td>电话L</td><br />   </tr> </p> <p> <% for(int i=0;i<hits.length();i++){<br />     Document doc=hits.doc(i);<br />    %><br />     <tr><br />     <td><%=doc.get("id") %></td><br />     <td><%=doc.get("name") %></td><br />     <td><%=doc.get("address") %></td><br />     <td><%=doc.get("phone") %></td><br />   </tr><br />  <% }}%><br /> </table><br /> </p> <p><font size="4">用Lucene-1.3-final为网站数据库建立索引</font></p> <p><font color="#333333">下是看了lnboy写的《用lucene建立大富论坛的全文索》后写的试代码?br />   <br /> 为数据库cwb.mdb建立全文索引的indexdb.jsp <br /> <br /> <%@ page import ="org.apache.lucene.analysis.standard.*" %>   <br /> <%@ page import="org.apache.lucene.index.*" %>  <br /> <%@ page import="org.apache.lucene.document.*" %>  <br /> <%@ page import="lucene.*" %>  <br /> <%@ page contentType="text/html; charset=GBK" %>  <br /> <%  <br />       long start = System.currentTimeMillis();  <br />       String aa=getServletContext().getRealPath("/")+"index";     <br />       IndexWriter writer = new IndexWriter(aa, new StandardAnalyzer(), true);  <br />     try {  <br />       Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance(); </font></p> <font color="#333333"> String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)}<br />        ;DBQ=d:""Tomcat 5.0""webapps""zz3zcwbwebhome""WEB-INF""cwb.mdb";  <br />       Connection conn = DriverManager.getConnection(url);  <br />       Statement stmt = conn.createStatement();  <br />       ResultSet rs = stmt.executeQuery(  <br />           "select Article_id,Article_name,Article_intro from Article");  <br />       while (rs.next()) {  <br />              writer.addDocument(mydocument.Document(rs.getString("Article_id"),<br />                 rs.getString("Article_name"),rs.getString("Article_intro")));  <br />       }  <br />       rs.close();  <br />       stmt.close();  <br />       conn.close();  <br />    <br />       out.println("索引创徏完毕");     <br />       writer.optimize();  <br />       writer.close();  <br />       out.print(System.currentTimeMillis() - start);  <br />       out.println(" total milliseconds");  <br /> <br />     }  <br />     catch (Exception e) {  <br />       out.println(" 出错?nbsp;" + e.getClass() +  <br />                          ""n 错误信息? " + e.getMessage());  <br />     }  <br />  %>  <br /> <br /> 用于昄查询l果的aftsearch.jsp  <br /> <%@ page import="org.apache.lucene.search.*" %>  <br /> <%@ page import="org.apache.lucene.document.*" %>  <br /> <%@ page import="lucene.*" %>  <br /> <%@ page import = "org.apache.lucene.analysis.standard.*" %>   <br /> <%@ page import="org.apache.lucene.queryParser.QueryParser" %>  <br /> <%@ page contentType="text/html; charset=GBK" %>  <br /> <%  <br />     String keyword=request.getParameter("keyword");  <br />      keyword=new String(keyword.getBytes("ISO8859_1"));   <br />       out.println(keyword);  <br />    try {  <br />        String aa=getServletContext().getRealPath("/")+"index";     <br />       Searcher searcher = new IndexSearcher(aa);  <br />       Query query = QueryParser.parse(keyword, "Article_name", new StandardAnalyzer());  <br />       <br />       out.println("正在查找: " + query.toString("Article_name")+"<br>");  <br />       Hits hits = searcher.search(query);  <br />       System.out.println(hits.length() + " total matching documents");  <br />       java.text.NumberFormat format = java.text.NumberFormat.getNumberInstance();  <br />       for (int i = 0; i < hits.length(); i++) {  <br />         //开始输出查询结?nbsp; <br />         Document doc = hits.doc(i);  <br />         out.println(doc.get("Article_id"));  <br />         out.println("准确度ؓQ? + format.format(hits.score(i) * 100.0) + "%");  <br />         out.println(doc.get("Article_name")+"<br>");  <br />        // out.println(doc.get("Article_intro"));  <br />       }  <br />     }catch (Exception e) {  <br />       out.println(" 出错?nbsp;" + e.getClass() +""n 错误信息? " + e.getMessage());  <br />     }  <br /> %>  <br /> <br /> 辅助c:  <br /> package lucene;  <br /> import org.apache.lucene.document.Document;  <br /> import org.apache.lucene.document.Field;  <br /> import org.apache.lucene.document.DateField;  <br /> <br /> public class mydocument {  <br /> public static Document Document(String Article_id,String Article_name,String Article_intro){  <br />      Document doc = new Document();  <br />       doc.add(Field.Keyword("Article_id", Article_id));  <br />       doc.add(Field.Text("Article_name", Article_name));  <br />       doc.add(Field.Text("Article_intro", Article_intro));  <br />       return doc;  <br />   }  <br />   public mydocument() {  <br />   }  <br /> } <br /> <br /> </font><font style="font-weight: bold;" size="4">用lucene为数据库搜烦建立增量索引</font><font color="#333333"><br /> </font> <p>?nbsp;lucene 建立索引不可能每ơ都重新开始徏?而是按照新增加的记录,一ơ次的递增<br /> 建立索引的IndexWriterc?有三个参?nbsp;<br /> </p> <div><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /><span style="color: #000000;">IndexWriter writer </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> IndexWriter(path, </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> StandardAnalyzer(),isEmpty);</span></div> <span style="font-size: 10pt;"><br /> 其中W三个参数是bool型的,指定它可以确定是增量索引,q是重徏索引.<br /> 对于从数据库中读取的记录,譬如要ؓ文章建立索引,我们可以记录文章的id?然后下次再次建立索引的时候读取存下的id?从此id后往下l增加烦?逻辑如下.<br /> <br /> 建立增量索引,主要代码如下<br /> </span> <div><span style="font-size: 10pt;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> createIndex(String path)<br /> {<br />      Statement myStatement </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />      String 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 />      </span><span style="color: #008000;">//</span><span style="color: #008000;">d文g,获得文章idL,q里只存最后一烦引的文章id</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">    </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> { <br />         FileReader fr </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> FileReader(</span><span style="color: #000000;">"</span><span style="color: #000000;">**.txt</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />         BufferedReader br </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> BufferedReader(fr);                 <br />         articleId</span><span style="color: #000000;">=</span><span style="color: #000000;">br.readLine();<br />         </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 />         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 />         br.close();<br />         fr.close(); <br />       } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (IOException e) { <br />         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 />         e.printStackTrace();<br />       }<br />     </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br />         </span><span style="color: #008000;">//</span><span style="color: #008000;">sql语句,Ҏidd下面的内?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        String sqlText </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;">articleId;<br />         myStatement </span><span style="color: #000000;">=</span><span style="color: #000000;"> conn.createStatement();<br />         ResultSet rs </span><span style="color: #000000;">=</span><span style="color: #000000;"> myStatement.executeQuery(sqlText);<br />        </span><span style="color: #008000;">//</span><span style="color: #008000;">写烦?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (rs.next()) {<br />          Document doc </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Document();<br />          doc.add(Field.Keyword(</span><span style="color: #000000;">"</span><span style="color: #000000;">**</span><span style="color: #000000;">"</span><span style="color: #000000;">, DateAdded));<br />          doc.add(Field.Keyword(</span><span style="color: #000000;">"</span><span style="color: #000000;">**</span><span style="color: #000000;">"</span><span style="color: #000000;">, articleid));<br />          doc.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">**</span><span style="color: #000000;">"</span><span style="color: #000000;">, URL));    <br />          doc.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">**</span><span style="color: #000000;">"</span><span style="color: #000000;">, Content));<br />          doc.add(Field.Text(</span><span style="color: #000000;">"</span><span style="color: #000000;">**</span><span style="color: #000000;">"</span><span style="color: #000000;">, Title));    <br />          </span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />             writer.addDocument(doc);<br />           }<br />           </span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(IOException e){<br />             e.printStackTrace();<br />          }<br />            </span><span style="color: #008000;">//</span><span style="color: #008000;">我索引的最后一文章的id写入文g</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">          </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> { <br />            FileWriter fw </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> FileWriter(</span><span style="color: #000000;">"</span><span style="color: #000000;">**.txt</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />            PrintWriter out </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> PrintWriter(fw);    <br />            out.close();<br />            fw.close();<br />            } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (IOException e) { <br />              e.printStackTrace();<br />            }<br />          }<br />             ind.Close();<br />             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 />          }<br />          </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (SQLException e){<br />             e.printStackTrace();<br />         }<br />         </span><span style="color: #0000ff;">finally</span><span style="color: #000000;"> {<br />             </span><span style="color: #008000;">//</span><span style="color: #008000;">数据库关闭操?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        }        <br />     }</span></span></div> <br /> 然后控制是都建立增量索引的时候根据能否都到id值来讄IndexWriter的第三个参数为true 或者是false<br /> <br /> <div> <span style="color: #0000ff;">boolean</span><span style="color: #000000;"> isEmpty </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />  </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> { <br />     FileReader fr </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> FileReader(</span><span style="color: #000000;">"</span><span style="color: #000000;">**.txt</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />     BufferedReader br </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> BufferedReader(fr);                 <br />     </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(br.readLine()</span><span style="color: #000000;">!=</span> <span style="color: #0000ff;">null</span><span style="color: #000000;">) {<br />         isEmpty </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />      }<br />      br.close();<br />      fr.close(); <br />     } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (IOException e) { <br />        e.printStackTrace();<br />   }<br />             <br />   writer </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> IndexWriter(Directory, </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> StandardAnalyzer(),isEmpty);</span></div> </div> <img src ="http://m.tkk7.com/nkjava/aggbug/257582.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/nkjava/" target="_blank">草原上的骆驼</a> 2009-03-03 15:57 <a href="http://m.tkk7.com/nkjava/archive/2009/03/03/257582.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Lucene索引查询分页实例http://m.tkk7.com/nkjava/archive/2009/03/03/257581.html草原上的骆驼草原上的骆驼Tue, 03 Mar 2009 07:56:00 GMThttp://m.tkk7.com/nkjava/archive/2009/03/03/257581.htmlhttp://m.tkk7.com/nkjava/comments/257581.htmlhttp://m.tkk7.com/nkjava/archive/2009/03/03/257581.html#Feedback0http://m.tkk7.com/nkjava/comments/commentRss/257581.htmlhttp://m.tkk7.com/nkjava/services/trackbacks/257581.html一、输入关键字的lucene.html
<html>
<body>
<form name="form1" method="post" action="search.jsp">
   误入关键字Q?lt;input type="text" name="keyword">
  <input type="submit" name="Submit" value="提交">
</form>
</body>
</html>

 二、进行搜索和昄l果的search.jsp <%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="java.util.*" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import = "org.apache.lucene.analysis.standard.StandardAnalyzer" %>
<%@ page import="org.apache.lucene.index.IndexReader" %>
<%@ page import="org.apache.lucene.document.Document" %>
<%@ page import="org.apache.lucene.search.IndexSearcher" %>
<%@ page import="org.apache.lucene.search.Hits" %>
<%@ page import="org.apache.lucene.search.Query" %>
<%@ page import="page.Pagination" %> <%@ page import="org.apache.lucene.queryParser.QueryParser" %>
<%@ page import ="org.apache.lucene.analysis.Analyzer" %>
<%

  String queryString = request.getParameter("keyword");  

if (queryString == null||queryString.length()==0){
out.println("搜烦关键字不能ؓI?);

}else{
queryString=new String(queryString.getBytes("ISO8859_1"));
String indexPath=getServletContext().getRealPath("/")+"index";
boolean error = false;
Document doc;

IndexSearcher searcher = null;
Query query = null;
Hits hits = null;

try {
searcher = new IndexSearcher(IndexReader.open(indexPath));
} catch (Exception e) {
out.print("没有扑ֈ索引文gQ?);
out.print(e.getMessage());
error = true;
}
if (error == false) {
Analyzer analyzer = new StandardAnalyzer();
try {
query = QueryParser.parse(queryString, "Article_name", analyzer);
} catch (Exception e) {
out.print(e.getMessage());
error = true;

}
}
if (error == false && searcher != null) {

hits = searcher.search(query);
if (hits.length() == 0) {
out.print("对不P没有扑ֈ你所需要的资源. ");
error = true;
}
}
if (error == false && searcher != null) {
out.print("搜烦关键字:"+ queryString+ "");
//PaginationcL|上下蝲的,需要传递一个向量,你可以改,q样׃用做二遍?
Vector list=new Vector();
for(int i=0;i< hits.length();i++){
doc = hits.doc(i);
list.add(doc);
}

out.print("扑ֈ的资?/font>");
Pagination pagination = null;
String pageNumber = request.getParameter("pageNumber");

int showItemNumber = 10;
if (pageNumber == null) {
pageNumber = "1";
}
String HTML = "";
if (list != null && list.size() > 0) {
pagination = new Pagination();
pagination.setPageNumber(Integer.parseInt(pageNumber));
pagination.setShowItemNumber(showItemNumber);
pagination.setVisitPageURL("search.jsp?keyword="+queryString);
list =(Vector) pagination.interceptListByStarItemNumber(list);
for(int i=0;i< list.size();i++)
{
doc =(Document) list.get(i);
String A_id=doc.get("Article_id");
String doctitle = doc.get("Article_name");
String url = doc.get("File_name")+"?id="+A_id;

out.print("< a +doctitle+"");
}
HTML = pagination.buildHTML("600");
out.print(HTML);
}
}

}


]]>
Lucene基本使用介绍http://m.tkk7.com/nkjava/archive/2009/03/03/257504.html草原上的骆驼草原上的骆驼Tue, 03 Mar 2009 03:35:00 GMThttp://m.tkk7.com/nkjava/archive/2009/03/03/257504.htmlhttp://m.tkk7.com/nkjava/comments/257504.htmlhttp://m.tkk7.com/nkjava/archive/2009/03/03/257504.html#Feedback0http://m.tkk7.com/nkjava/comments/commentRss/257504.htmlhttp://m.tkk7.com/nkjava/services/trackbacks/257504.html

本文? 目的不在于对Lucene的概念和设计q些q行介绍Q仅在于介绍怎么样去使用Lucene来达到自己想要的几种常见的全文检索的需求,如果x入了? Lucene的话本文不会带给你什么收L。看完本文后x深入的了解Lucene误问:http://lucene.apache.org

一. 概述

随着pȝ信息的越来越多,怎么样从q些信息h中捞赯己想要的那一栚w变得非帔R要了Q全文检索是通常用于解决此类问题的方案,?/span>Lucene则ؓ实现全文索的工具QQ何应用都可通过嵌入它来实现全文索?/span>


环境搭徏


?/span>lucene.apache.org上下载最新版本的lucene.jarQ将?/span>jar作ؓ目?/span>build pathQ那么在目中就可以直接使用lucene了?/span>


使用说明


3.1.       基本概念


q里介绍的主要ؓ在用中l常到一些概念,以大安比较熟悉的数据库来进行类比的讲解Q?/span>Luceneq行全文索的q程有点cM数据库的q个q程Q?/span>table---à查询相应的字D|查询条g----àq回相应的记录,首先?/span>IndexWriterQ通过它徏立相应的索引表,相当于数据库中的tableQ在构徏此烦引表旉指定的ؓ该烦引表采用何种方式q行构徏Q也是说对于其中的记录的字D以什么方式来q行格式的划分,q个?/span>Lucene中称?/span>AnalyzerQ?/span>Lucene提供了几U环境下使用?/span>AnalyzerQ?/span>SimpleAnalyzer?/span>StandardAnalyzer?/span>GermanAnalyzer{,其中StandardAnalyzer是经怋用的Q因为它提供了对于中文的支持Q在表徏好后我们需要往里面插入用于索引的记录,?/span>Lucene中这个称?/span>DocumentQ有点类似数据库?/span>table的一行记录,记录中的字段的添加方法,?/span>Lucene中称?/span>FieldQ这个和数据库中基本一P对于Field Lucene分ؓ可被索引的,可切分的Q不可被切分的,不可被烦引的几种l合cdQ通过q几个元素基本上可以徏立v索引了。在查询时经常碰到的为另外几个概念,首先?/span>QueryQ?/span>Lucene提供了几U经常可以用到的QueryQ?/span>TermQuery?/span>MultiTermQuery?/span>BooleanQuery?/span>WildcardQuery?/span>PhraseQuery?/span>PrefixQuery?/span>PhrasePrefixQuery?/span>FuzzyQuery?/span>RangeQuery?/span>SpanQueryQ?/span>Query其实也就是指对于需要查询的字段采用什么样的方式进行查询,如模p查询、语义查询、短语查询、范围查询、组合查询等Q还有就?/span>QueryParserQ?/span>QueryParser可用于创Z同的QueryQ还有一?/span>MultiFieldQueryParser支持对于多个字段q行同一关键字的查询Q?/span>IndexSearcher概念指的为需要对何目录下的烦引文件进行何U方式的分析的查询,有点象对数据库的哪种索引表进行查询ƈ按一定方式进行记录中字段的分解查询的概念Q通过IndexSearcher以及Query卛_查询出需要的l果Q?/span>Luceneq回的ؓHits.通过遍历Hits可获取返回的l果?/span>DocumentQ通过Document则可获取Field中的相关信息了?/span>


通过对于上面在徏立烦引和全文索的基本概念的介l希望能让你?/span>Lucene建立一定的了解?/span>


3.2.       全文索需求的实现


索引建立部分的代码:




private void createIndex(String indexFilePath) throws Exception{

        IndexWriter iwriter
=getWriter(indexFilePath);

        Document doc
=new Document();

        doc.add(Field.Keyword(
"name","jerry"));

        doc.add(Field.Text(
"sender","bluedavy@gmail.com"));

        doc.add(Field.Text(
"receiver","google@gmail.com"));

        doc.add(Field.Text(
"title","用于索引的标?/span>"));

        doc.add(Field.UnIndexed(
"content","不徏立烦引的内容"));

        Document doc2
=new Document();

        doc2.add(Field.Keyword(
"name","jerry.lin"));

        doc2.add(Field.Text(
"sender","bluedavy@hotmail.com"));

        doc2.add(Field.Text(
"receiver","msn@hotmail.com"));

        doc2.add(Field.Text(
"title","用于索引的第二个标题"));

        doc2.add(Field.Text(
"content","建立索引的内?/span>"));

        iwriter.addDocument(doc);

        iwriter.addDocument(doc2);

        iwriter.optimize();

        iwriter.close();

    }


    

    
private IndexWriter getWriter(String indexFilePath) throws Exception{

        boolean append
=true;

        File file
=new File(indexFilePath+File.separator+"segments");

        
if(file.exists())

            append
=false

        
return new IndexWriter(indexFilePath,analyzer,append);

    }




3.2.1.       对于某字D늚关键字的模糊查询




Query query=new WildcardQuery(new Term("sender","*davy*"));

        

        Searcher searcher
=new IndexSearcher(indexFilePath);

        Hits hits
=searcher.search(query);

        
for (int i = 0; i < hits.length(); i++{

            System.
out.println(hits.doc(i).get("name"));

        }




3.2.2.       对于某字D늚关键字的语义查询




Query query=QueryParser.parse("索引","title",analyzer);

        

        Searcher searcher
=new IndexSearcher(indexFilePath);

        Hits hits
=searcher.search(query);

        
for (int i = 0; i < hits.length(); i++{

            System.
out.println(hits.doc(i).get("name"));

        }




3.2.3.       对于多字D늚关键字的查询




Query query=MultiFieldQueryParser.parse("索引",new String[]{"title","content"},analyzer);

        

        Searcher searcher
=new IndexSearcher(indexFilePath);

        Hits hits
=searcher.search(query);

        
for (int i = 0; i < hits.length(); i++{

            System.
out.println(hits.doc(i).get("name"));

        }




3.2.4.       复合查询(多种查询条g的综合查?/span>)




Query query=MultiFieldQueryParser.parse("索引",new String[]{"title","content"},analyzer);

        Query mquery
=new WildcardQuery(new Term("sender","bluedavy*"));

        TermQuery tquery
=new TermQuery(new Term("name","jerry"));

        

        BooleanQuery bquery
=new BooleanQuery();

        bquery.add(query,
true,false);

        bquery.add(mquery,
true,false);

        bquery.add(tquery,
true,false);

        

        Searcher searcher
=new IndexSearcher(indexFilePath);

        Hits hits
=searcher.search(bquery);

        
for (int i = 0; i < hits.length(); i++{

            System.
out.println(hits.doc(i).get("name"));

        }




ȝ


怿大家通过上面的说明能知道Lucene的一个基本的使用ҎQ在全文索时大家先采用语义时的搜索,先搜索出有意义的内容Q之后再q行模糊之类的搜索,^_^Q这个还是需要根据搜索的需求才能定了,Luceneq提供了很多其他更好用的ҎQ这个就{待大家在用的q程中自己去q一步的摸烦了,比如对于Lucene本n提供?/span>Query的更熟练的掌握,对于Filter?/span>Sorter的用,自己扩展实现AnalyzerQ自己实?/span>Query{等Q甚臛_以去了解一些关于搜索引擎的技?/span>(切词、烦引排?/span> etc){等?来源QBlueDavy之技术Blog)



]]>
为lucene加入单中文分?/title><link>http://m.tkk7.com/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://m.tkk7.com/nkjava/archive/2009/03/03/257502.html</guid><wfw:comment>http://m.tkk7.com/nkjava/comments/257502.html</wfw:comment><comments>http://m.tkk7.com/nkjava/archive/2009/03/03/257502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/nkjava/comments/commentRss/257502.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/nkjava/services/trackbacks/257502.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;">  看到很多人做lucene的应用时候都要面临中文分词怎么加的问题Q下面介l一个简单的中文词库Q这个词库附带相应的法Q数据结构学q的人看懂没什么问题,只要单的构造一个对象,可以分词了Q对于不是太大的应用来说Q还是相当可行的Q?a >点击下蝲</a></span> <div class="okimuoc" id="more" class="asset-more"> <div> <p><span style="font-size: 10pt;"><a >      该分词库使用很简单,先初试化该类 <br />       ChineseSegmenter seg = ChineseSegmenter.getGBSegmenter();<br />       然后调用seg.segmentLine("要分词的中文D?, " ")//W二个参Cؓ分词之间以什么间?br />       </a></span><span style="font-size: 10pt;"><a >譬如</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 > </a></span><span style="color: #0000ff;"><a >public</a></span><span style="color: #000000;"><a > </a></span><span style="color: #0000ff;"><a >static</a></span><span style="color: #000000;"><a > </a></span><span style="color: #0000ff;"><a >void</a></span><span style="color: #000000;"><a > main(String[] args) throws Exception </a></span><span id="Codehighlighter1_57_188_Open_Text"><span style="color: #000000;"><a >{<br /> <br />       ChineseSegmenter seg </a></span><span style="color: #000000;"><a >=</a></span><span style="color: #000000;"><a > ChineseSegmenter.getGBSegmenter();<br />       System.</a></span><span style="color: #0000ff;"><a >out</a></span><span style="color: #000000;"><a >.println(seg.segmentLine(</a></span><span style="color: #000000;"><a </a></span><span style="color: #000000;"><a >儿童节日</a></span><span style="color: #000000;"><a </a></span><span style="color: #000000;"><a >, </a></span><span style="color: #000000;"><a </a></span><span style="color: #000000;"><a > </a></span><span style="color: #000000;"><a </a></span><span style="color: #000000;"><a >));<br />     <br />    }</a></span></span></div> <a >    <span style="font-size: 10pt;">输出为儿?节日 儿童?nbsp;  <br />      <br />      下面要说以下如何加到搜烦代码里,<br />       lucene 建立索引的代码引入的analysis分词法ؓ WhitespaceAnalyzer<br />       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;">  IndexWriter writer </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> IndexWriter(Directory, </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> WhitespaceAnalyzer(),</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br /> <br />     </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> AddDocument(String Title , String Content , ..)<br />     {<br />         Document doc </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> Document();<br />         <br />         ChineseSegmenter cs</span><span style="color: #000000;">=</span><span style="color: #000000;"> ChineseSegmenter.getGBSegmenter();    </span><span style="color: #008000;">//</span><span style="color: #008000;">初始化该c?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        <br />             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;">, cs.segmentLine(Content, </span><span style="color: #000000;">"</span> <span style="color: #000000;">"</span><span style="color: #000000;">))); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 分好的词写q烦?nbsp;</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">    <br />             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;">, cs.segmentLine(Title, </span><span style="color: #000000;">"</span> <span style="color: #000000;">"</span><span style="color: #000000;">)));<br /> <br /> <br />         </span><span style="color: #0000ff;">try</span><span style="color: #000000;"><br />         {<br />             writer.addDocument(doc);<br />         }<br />         </span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(IOException e)<br />         {<br />             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 />             e.printStackTrace();<br />         }<br />     }</span></div> </span></a></div> </div> <img src ="http://m.tkk7.com/nkjava/aggbug/257502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/nkjava/" target="_blank">草原上的骆驼</a> 2009-03-03 11:34 <a href="http://m.tkk7.com/nkjava/archive/2009/03/03/257502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Lucene索数据库http://m.tkk7.com/nkjava/archive/2009/03/03/257500.html草原上的骆驼草原上的骆驼Tue, 03 Mar 2009 03:33:00 GMThttp://m.tkk7.com/nkjava/archive/2009/03/03/257500.htmlhttp://m.tkk7.com/nkjava/comments/257500.htmlhttp://m.tkk7.com/nkjava/archive/2009/03/03/257500.html#Feedback0http://m.tkk7.com/nkjava/comments/commentRss/257500.htmlhttp://m.tkk7.com/nkjava/services/trackbacks/257500.html 1.写一D传l的JDBCE序Q讲每条的用户信息从数据库读取出?br /> 2.针对每条用户记录Q徏立一个lucene document
Document doc = new Document();
q根据你的需要,用户信息的各个字段对应luncene document中的field q行dQ如Q?
doc.add(new Field("NAME","USERNAME",Field.Store.YES,Field.Index.UN_TOKENIZED));
然后该条doc加入到烦引中Q?如: luceneWriter.addDocument(doc);
q样徏立了lucene的烦引库
3.~写对烦引库的搜索程序(看lucene文档Q,通过对lucene的烦引库的查找,你可以快速找到对应记录的ID
4.通过ID到数据库中查扄兌?
用Lucene索引数据?/font>

LuceneQ作ZU全文搜索的辅助工具Qؓ我们q行条g搜烦Q无论是像Google,Baidu之类的搜索引 擎,q是论坛中的搜烦功能Q还是其它C/S架构的搜索,都带来了极大的便利和比较高的效率。本文主要是利用Lucene对MS Sql Server 2000q行建立索引Q然后进行全文烦引。至于数据库的内容,可以是网늚内容Q还是其它的。本文中数据库的内容是图书馆理pȝ中的某个作者表Q? Authors表?

  因ؓ考虑到篇q的问题Q所以该文不会讲的很详细Q也不可能讲的很深?/p>

  本文以这Ll构q行Q?/p>

  1.介绍数据库中Authors表的l构

  2.为数据库建立索引

  3.为数据库建立查询功能

  4.在web界面下进行查询ƈ昄l果

  1Q介l数据库中Authors表的l构

字段名称         字段cd         字段含义

Au_id                Varchar(11)    作者号
Au_name        Varchar(60)     作者名
Phone             Char(12)           电话L
Address          Varchar(40)      地址
City                   Varchar(20)     城市
State                Char(2)             省䆾
Zip                    Char(5)             邮编
contract            Bit(1)                外键Q关pM大)

表中的部分内容: 

  2Qؓ数据库徏立烦?/p>

  首先建立一个类TestLucene.java。这个类是Ҏ据库q行建立索引Q编写查询条件等?/p>

  当然Q最开始就是徏立数据库q接。连接代码这里就省略了。^_^

  接着Q新Z个方法getResutl(String),它返回的是数据库表Authors的内宏V具体代码如下:

    public ResultSet getResult(String sql){
      try{
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        return rs;
      }
      catch(SQLException e){
        System.out.println(e);
      }
      return null;
    }

然后Qؓ数据库徏立烦引?/p>

首先要定义一个IndexWriterQ)Q它是将索引写进Lucene自己的数据库中,它存攄位置是有你自己定义的。在定义IndexWriter 是需要指定它的分析器。Lucene自己自带有几个分析器Q例如:StandarAnalyzer(),SimpleAnalyzer(), StopAnalyzer(){。它作用是对文本q行分析Q判断如何进行切词?br /> 接着Q要定义一个Document。Document相当于二l表中一行数据一栗Document里包含的是Field字段QField相当于数据库中一列,也就是一个属性,一个字Dc?br /> 最后应该对IndexWriterq行优化Q方法很单,是writer.optimize().
具体代码如下Q?br />
  public void Index(ResultSet rs){
      try{
        IndexWriter writer = new IndexWriter("d:/index/", getAnalyzer(), true);
        while(rs.next()){
            Document doc=new Document();
            doc.add(Field.Keyword("id",rs.getString("au_id")));
            doc.add(Field.Text("name",rs.getString("au_name")));
            doc.add(Field.UnIndexed("address",rs.getString("address")));
            doc.add(Field.UnIndexed("phone",rs.getString("phone")));
            doc.add(Field.Text("City",rs.getString("city")));
            writer.addDocument(doc);
          }
        writer.optimize();
        writer.close();
      }
      catch(IOException e){
        System.out.println(e);
      }
      catch(SQLException e){
        System.out.println(e);
      }
    }

    public Analyzer getAnalyzer(){
      return new StandardAnalyzer();
    }

3Qؓ数据库徏立查询功?/p>

  在类TestLucene中徏立一个新的方法searcher(String)Q它q回的是一个搜索的l构集,相当于数据库中的ResultSet一栗它代的参数是你要查询的内容。这里,我把要查询的字段写死了。你可以在添加一个参数表C查询的字Dc?br /> q里主要有两个对象IndexSearcher和Query。IndexSearcher是找到烦引数据库QQuery是处理搜索,它包含了三个参数Q查询内容,查询字段Q分析器?br /> 具体代码如下Q?br />
  public Hits seacher(String queryString){
      Hits hits=null;;
      try{
        IndexSearcher is = new IndexSearcher("D:/index/");
        Query query=QueryParser.parse(queryString,"City",getAnalyzer());
        hits=is.search(query);
      }catch(Exception e){
        System.out.print(e);
      }
      return hits;
    }

4Q在web界面下进行查询ƈ昄l果

  q里建立一个Jsp面TestLucene.jspq行搜烦?/p>

  在TestLucene.jsp面中首先引入类


<%@ page import="lucenetest.LucentTest"%>
<%@ page import="org.apache.lucene.search.*,org.apache.lucene.document.*" %>

  然后定义一个LuceneTest对象Q获取查询结果集Q?br />
  LucentTest lucent=new LucentTest();
  Hits hits=lucent.seacher(request.getParameter("queryString"));

定义一个FormQ徏立一个查询环境:

<form action="TestLucene.jsp">
  <input  type="text" name="queryString"/>
  <input type="submit" value="搜烦"/>
</form>

昄查询l果Q?br />
<table>
  <%if(hits!=null){%>
  <tr>
    <td>作者号</td>
    <td>作者名</td>
    <td>地址</td>
    <td>电话L</td>
  </tr>

 <% for(int i=0;i<hits.length();i++){
    Document doc=hits.doc(i);
   %>
    <tr>
    <td><%=doc.get("id") %></td>
    <td><%=doc.get("name") %></td>
    <td><%=doc.get("address") %></td>
    <td><%=doc.get("phone") %></td>
  </tr>
 <% }}%>
</table>

用Lucene-1.3-final为网站数据库建立索引

下是看了lnboy写的《用lucene建立大富论坛的全文索》后写的试代码?br />  
为数据库cwb.mdb建立全文索引的indexdb.jsp 

<%@ page import ="org.apache.lucene.analysis.standard.*" %>  
<%@ page import="org.apache.lucene.index.*" %> 
<%@ page import="org.apache.lucene.document.*" %> 
<%@ page import="lucene.*" %> 
<%@ page contentType="text/html; charset=GBK" %> 
<% 
      long start = System.currentTimeMillis(); 
      String aa=getServletContext().getRealPath("/")+"index";    
      IndexWriter writer = new IndexWriter(aa, new StandardAnalyzer(), true); 
    try { 
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance(); 

 String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)}
       ;DBQ=d:""Tomcat 5.0""webapps""zz3zcwbwebhome""WEB-INF""cwb.mdb"; 
      Connection conn = DriverManager.getConnection(url); 
      Statement stmt = conn.createStatement(); 
      ResultSet rs = stmt.executeQuery( 
          "select Article_id,Article_name,Article_intro from Article"); 
      while (rs.next()) { 
             writer.addDocument(mydocument.Document(rs.getString("Article_id"),
                rs.getString("Article_name"),rs.getString("Article_intro"))); 
      } 
      rs.close(); 
      stmt.close(); 
      conn.close(); 
  
      out.println("索引创徏完毕");    
      writer.optimize(); 
      writer.close(); 
      out.print(System.currentTimeMillis() - start); 
      out.println(" total milliseconds"); 

    } 
    catch (Exception e) { 
      out.println(" 出错?nbsp;" + e.getClass() + 
                         ""n 错误信息? " + e.getMessage()); 
    } 
 %> 

用于昄查询l果的aftsearch.jsp 
<%@ page import="org.apache.lucene.search.*" %> 
<%@ page import="org.apache.lucene.document.*" %> 
<%@ page import="lucene.*" %> 
<%@ page import = "org.apache.lucene.analysis.standard.*" %>  
<%@ page import="org.apache.lucene.queryParser.QueryParser" %> 
<%@ page contentType="text/html; charset=GBK" %> 
<% 
    String keyword=request.getParameter("keyword"); 
     keyword=new String(keyword.getBytes("ISO8859_1"));  
      out.println(keyword); 
   try { 
       String aa=getServletContext().getRealPath("/")+"index";    
      Searcher searcher = new IndexSearcher(aa); 
      Query query = QueryParser.parse(keyword, "Article_name", new StandardAnalyzer()); 
     
      out.println("正在查找: " + query.toString("Article_name")+"<br>"); 
      Hits hits = searcher.search(query); 
      System.out.println(hits.length() + " total matching documents"); 
      java.text.NumberFormat format = java.text.NumberFormat.getNumberInstance(); 
      for (int i = 0; i < hits.length(); i++) { 
        //开始输出查询结?nbsp;
        Document doc = hits.doc(i); 
        out.println(doc.get("Article_id")); 
        out.println("准确度ؓQ? + format.format(hits.score(i) * 100.0) + "%"); 
        out.println(doc.get("Article_name")+"<br>"); 
       // out.println(doc.get("Article_intro")); 
      } 
    }catch (Exception e) { 
      out.println(" 出错?nbsp;" + e.getClass() +""n 错误信息? " + e.getMessage()); 
    } 
%> 

辅助c: 
package lucene; 
import org.apache.lucene.document.Document; 
import org.apache.lucene.document.Field; 
import org.apache.lucene.document.DateField; 

public class mydocument { 
public static Document Document(String Article_id,String Article_name,String Article_intro){ 
     Document doc = new Document(); 
      doc.add(Field.Keyword("Article_id", Article_id)); 
      doc.add(Field.Text("Article_name", Article_name)); 
      doc.add(Field.Text("Article_intro", Article_intro)); 
      return doc; 
  } 
  public mydocument() { 
  } 
}

用lucene为数据库搜烦建立增量索引

?nbsp;lucene 建立索引不可能每ơ都重新开始徏?而是按照新增加的记录,一ơ次的递增
建立索引的IndexWriterc?有三个参?nbsp;

IndexWriter writer = new IndexWriter(path, new StandardAnalyzer(),isEmpty);

其中W三个参数是bool型的,指定它可以确定是增量索引,q是重徏索引.
对于从数据库中读取的记录,譬如要ؓ文章建立索引,我们可以记录文章的id?然后下次再次建立索引的时候读取存下的id?从此id后往下l增加烦?逻辑如下.

建立增量索引,主要代码如下
public void createIndex(String path)
{
     Statement myStatement 
= null;
     String articleId
="0";
     
//d文g,获得文章idL,q里只存最后一烦引的文章id
    try { 
        FileReader fr 
= new FileReader("**.txt");
        BufferedReader br 
= new BufferedReader(fr);                 
        articleId
=br.readLine();
        
if(articleId==null||articleId=="")
        articleId
="0";
        br.close();
        fr.close(); 
      } 
catch (IOException e) { 
        System.out.println(
"error343!");
        e.printStackTrace();
      }
    
try {
        
//sql语句,Ҏidd下面的内?/span>
        String sqlText = "*****"+articleId;
        myStatement 
= conn.createStatement();
        ResultSet rs 
= myStatement.executeQuery(sqlText);
       
//写烦?/span>
        while (rs.next()) {
         Document doc 
= new Document();
         doc.add(Field.Keyword(
"**", DateAdded));
         doc.add(Field.Keyword(
"**", articleid));
         doc.add(Field.Text(
"**", URL));    
         doc.add(Field.Text(
"**", Content));
         doc.add(Field.Text(
"**", Title));    
         
try{
            writer.addDocument(doc);
          }
          
catch(IOException e){
            e.printStackTrace();
         }
           
//我索引的最后一文章的id写入文g
          try { 
           FileWriter fw 
= new FileWriter("**.txt");
           PrintWriter out 
= new PrintWriter(fw);    
           out.close();
           fw.close();
           } 
catch (IOException e) { 
             e.printStackTrace();
           }
         }
            ind.Close();
            System.out.println(
"ok.end");
         }
         
catch (SQLException e){
            e.printStackTrace();
        }
        
finally {
            
//数据库关闭操?/span>
        }        
    }

然后控制是都建立增量索引的时候根据能否都到id值来讄IndexWriter的第三个参数为true 或者是false

 boolean isEmpty = true;
 
try { 
    FileReader fr 
= new FileReader("**.txt");
    BufferedReader br 
= new BufferedReader(fr);                 
    
if(br.readLine()!= null) {
        isEmpty 
= false;
     }
     br.close();
     fr.close(); 
    } 
catch (IOException e) { 
       e.printStackTrace();
  }


]]>
Lucene全文索实?/title><link>http://m.tkk7.com/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://m.tkk7.com/nkjava/archive/2009/03/03/257498.html</guid><wfw:comment>http://m.tkk7.com/nkjava/comments/257498.html</wfw:comment><comments>http://m.tkk7.com/nkjava/archive/2009/03/03/257498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/nkjava/comments/commentRss/257498.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/nkjava/services/trackbacks/257498.html</trackback:ping><description><![CDATA[<div> Lucene ?Apache 的一个子目Q是一个全文检索的搜烦引擎库。其提供了简单实用的 APIQ通过q些 APIQ可以自行编写对文gQTEXTQXMLQHTML{)、目录、数据库的全文检索程序?</div> <div class="ucg84ie" id="more" class="asset-more"> <p align="left"><span xml:lang="EN-US">Features</span>Q?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">实践dQ?span xml:lang="EN-US"><br /> 1) </span>~写<span xml:lang="EN-US"> Java </span>E序<span xml:lang="EN-US"> MyIndexer.java</span>Q?span xml:lang="EN-US"> JDBC </span>取出<span xml:lang="EN-US"> MySQL </span>数据表内容(以某一论坛数据做测试)Q然后通过<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>E序<span xml:lang="EN-US"> MySearcher.java</span>Q通过<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 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 target="_blank"><strong>PHP </strong><strong><span xml:lang="EN-US"><span xml:lang="EN-US">手册Q简体中文)</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>Q安装了<span xml:lang="EN-US"><a target="_blank"><strong>Apache Tomcat/4.1.24</strong></a></span>Q默认的发布端口?span xml:lang="EN-US"> 8080</span>。现在面临的一个问题是Q?span xml:lang="EN-US"><a target="_blank"><strong>Apache httpd</strong></a> </span>的端口是<span xml:lang="EN-US"> 80</span>Qƈ且我的机器对外只能通过<span xml:lang="EN-US"> 80 </span>端口q行讉KQ如果将<span xml:lang="EN-US"> Tomcat </span>的发布端口改?span xml:lang="EN-US"> 80 </span>的话Q?span xml:lang="EN-US">httpd </span>没法对外了Q而其上的<span xml:lang="EN-US"> PHP </span>E序也将无法?span xml:lang="EN-US"> 80 </span>端口q行?span xml:lang="EN-US"><br /> <br /> </span>对于q个问题Q我惛_两种ҎQ?span xml:lang="EN-US"><br /> 1</span>、?<span xml:lang="EN-US"><a 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>Q?span xml:lang="EN-US"><br /> 2</span>、?<span xml:lang="EN-US"><a target="_blank"><strong>mod_jk</strong></a> </span>做桥接的方式Q将<span xml:lang="EN-US"> servlet </span>引擎l合?span xml:lang="EN-US"> httpd </span>中。需要做的工作是~译 <span xml:lang="EN-US"><a target="_blank"><strong>jakarta-tomcat-connectors-jk-1.2.5-src</strong></a></span>Q生?span xml:lang="EN-US"> mod_jk.so </span>l?span xml:lang="EN-US"> httpd </span>使用Q然后按?<span xml:lang="EN-US"><a target="_blank"><strong>Howto </strong><strong><span xml:lang="EN-US"><span xml:lang="EN-US">文档</span></span></strong></a> </span>q行<span xml:lang="EN-US"> Tomcat</span>?span xml:lang="EN-US">httpd </span>的配|?span xml:lang="EN-US"><br /> <br /> </span>对于W一个方案的试Q?<span xml:lang="EN-US"><a 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>Q这个就不多说了Q?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">可以搜烦斚w的大量文?/span></span></span>?span xml:lang="EN-US"><br /> <br /> 2) </span>重新~译<span xml:lang="EN-US"> PHP</span>Q我?span xml:lang="EN-US"> PHP </span>版本?span xml:lang="EN-US"> 4.3.6</span>Q?/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>完成之后Q会?span xml:lang="EN-US"> PHP </span>?span xml:lang="EN-US"> lib </span>下(我的是在<span xml:lang="EN-US"> /usr/lib/php</span>Q有?span xml:lang="EN-US"> php_java.jar</span>Q同时在扩展动态库存放的目录下Q我的是?span xml:lang="EN-US"> /usr/lib/php/20020429</span>Q有?span xml:lang="EN-US"> java.so </span>文g。到q一步需要注意一个问题,有些<span xml:lang="EN-US"> PHP </span>版本生成的是<span xml:lang="EN-US"> libphp_java.so </span>文gQ?span xml:lang="EN-US">extension </span>的加载只?span xml:lang="EN-US"> libphp_java.so</span>Q直接加?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>Q需要创Z个符可接:</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>启动文gQ我的这个文件ؓ<span xml:lang="EN-US"> /etc/init.d/httpd</span>Q,在这个文件中加入Q?/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>目录下,如果你的不是在此目录Q请做相应改动(下同Q?span xml:lang="EN-US"><br /> <br /> 4) </span>修改<span xml:lang="EN-US"> PHP </span>配置文g<span xml:lang="EN-US"> php.ini</span>Q找?span xml:lang="EN-US"> [Java] </span>部分q行修改Q?/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>服务Q?/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 ><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').'<br />';</span></p> <p align="left"><span xml:lang="EN-US">print 'Java vendor=' . $system->getProperty('java.vendor').'<br />';</span></p> <p align="left"><span xml:lang="EN-US">print 'OS=' . $system->getProperty('os.name') . ' ' .</span></p> <p align="left"><span xml:lang="EN-US">$system->getProperty('os.version') . ' on ' .</span></p> <p align="left"><span xml:lang="EN-US">$system->getProperty('os.arch') . '<br />';</span></p> <p align="left"><span xml:lang="EN-US">></span></p> </div> <span> <p align="left"><br /> <br /> <strong>ȝ</strong><span xml:lang="EN-US"><br /> </span>安装配置q算单,但是?span xml:lang="EN-US"> PHP </span>q行<span xml:lang="EN-US"> Java </span>的速度感觉较慢Q所以下定决心开始实늬二个Ҏ?</p> <p align="left">今天ȝ有些I闲旉Q正好说说第二种ҎQ?<span xml:lang="EN-US"><a target="_blank"><strong>mod_jk</strong></a> </span>做桥接的方式Q将<span xml:lang="EN-US"> servlet </span>引擎l合?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 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>Q这些安装步骤就不多说了?span xml:lang="EN-US"><br /> <br /> 2) </span>~译<span xml:lang="EN-US"> jakarta-tomcat-connectors-jk-1.2.5-src</span>Q生?span xml:lang="EN-US"> mod_jk.so</span>Qƈ其复制?span xml:lang="EN-US"> apache </span>?span xml:lang="EN-US"> modules </span>存放目录Q?/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>配置文g<span xml:lang="EN-US"> /usr/local/apache/conf/httpd.conf</span>Q加入:</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>q个<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>文g所在\径,后边对此文件进行讲?/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>Q?span xml:lang="EN-US">worker1 </span>?span xml:lang="EN-US"> workers.properties </span>文g中定?/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>文gQ其内容如下Q?/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>Q?/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>好了Q启?span xml:lang="EN-US"> Tomcat</span>Q重启一?span xml:lang="EN-US"> Apache HTTPD Server</span>Q访问:<span xml:lang="EN-US">http://localhost/examples/index.jsp</span>Q看看结果如何,?<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>是一L?span xml:lang="EN-US"><br /> <br /> </span>提示Q如果不惌别h通过<span xml:lang="EN-US"> 8080 </span>端口讉KC?span xml:lang="EN-US"> Tomcat</span>Q可以将<span xml:lang="EN-US"> /usr/lcoal/tomcat/conf/server.xml </span>配置文g中的如下代码加上注释Q?/p> <div> <p align="left"><span xml:lang="EN-US"><!--</span></p> <p align="left"><span xml:lang="EN-US"><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" /></span></p> <p align="left"><span xml:lang="EN-US">--></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>此方案安装配|稍微复杂些Q但执行效率要比W一U方案要好很多。所以决定用这U方案来完成我的<span xml:lang="EN-US"> Lucene </span>全文索实践Q务?/p> <p align="left"><span xml:lang="EN-US">对于 Lucene 的初步研I已l过MD|_自己感觉q不是很深入Q但׃旉的关p,一直也没再拿v。应|友的要求,自己实践中写的一些代码脓出来Q希望能对大家有用。程序没有做q一步的优化Q只是很单的实现功能而已Q仅供参考?br /> <br /> 在实践中Q我以将 PHP 中文手册中的 HTML 文g生成索引Q然后通过一?JSP 对其q行全文索?<br /> 生成索引?Java 代码Q?/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 面生成索引文g?/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); //索引保存目录Q必d?/span></p> <p align="left"><span xml:lang="EN-US">indexDocs(writer, new File("/home/nio/phpdoc-zh")); //HTML 文g保存目录</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 < 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 文g做烦?</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())); //索引文g?/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 标题 <title></span></p> <p align="left"><span xml:lang="EN-US">if ("start" == status && line.equalsIgnoreCase("><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("<[^<>]+>", ""))); //索引内容</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.jspQ的代码Q?/span></p> <div> <p align="left"><span xml:lang="EN-US"><%@ 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" %></span></p> <p align="left"><span xml:lang="EN-US"><%@ page contentType="text/html;charset=GB2312" %></span></p> <p align="left"><span xml:lang="EN-US"><!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"></span></p> <p align="left"><span xml:lang="EN-US"><html></span></p> <p align="left"><span xml:lang="EN-US"><head></span></p> <p align="left"><span xml:lang="EN-US"><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /></span></p> <p align="left"><span xml:lang="EN-US"><title>PHPDoc - PHP 体中文手册全文检?lt;/title></span></p> <p align="left"><span xml:lang="EN-US"><base target="main"><!-- ׃使用?FrameQ所以指?target ?main H口昄 --></span></p> <p align="left"><span xml:lang="EN-US"><style></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"></style></span></p> <p align="left"><span xml:lang="EN-US"><script language="JavaScript"></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"></script></span></p> <p align="left"><span xml:lang="EN-US"></head></span></p> <p align="left"><span xml:lang="EN-US"><body></span></p> <p align="left"><span xml:lang="EN-US"><%</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">%></span></p> <p align="left"><span xml:lang="EN-US"><div class="f"></span></p> <p align="left"><span xml:lang="EN-US"><form name="frm" action="./index.jsp" method="GET" onsubmit="this.page.value='0';return true;" target="_self"></span></p> <p align="left"><span xml:lang="EN-US"><input type="text" name="key" class="txt" size="40" value="<%=keyVal%>" /></span></p> <p align="left"><span xml:lang="EN-US"><input type="hidden" name="page" value="<%=pageVal%>" /></span></p> <p align="left"><span xml:lang="EN-US"><input type="submit" value="?? /><br /></span></p> <p align="left"><span xml:lang="EN-US"><font color="green">提示Q可使用多个关键字(使用I格隔开Q提高搜索的准确率?lt;/font></span></p> <p align="left"><span xml:lang="EN-US"></form></span></p> <p align="left"><span xml:lang="EN-US"><script language="JavaScript"></span></p> <p align="left"><span xml:lang="EN-US">document.frm.key.focus();</span></p> <p align="left"><span xml:lang="EN-US"></script></span></p> <p align="left"><span xml:lang="EN-US"></div></span></p> <p align="left"><span xml:lang="EN-US"><%</span></p> <p align="left"><span xml:lang="EN-US">if (keyVal != null && keyVal.length() > 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("http://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 < 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 > 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">//循环输出查询l果</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 < 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">%></span></p> <p align="left"><span xml:lang="EN-US"><div class="t"><a href="/~nio/phpdoc-zh/<%=doc.get("file")%>"><%=hl.highLight(doc.get("title"))%></a></div></span></p> <p align="left"><span xml:lang="EN-US"><div class="d"><%=hl.highLight(doc.get("content").replaceAll("/n", " "), 100)%> ……</div></span></p> <p align="left"><span xml:lang="EN-US"><div class="o"></span></p> <p align="left"><span xml:lang="EN-US">/~nio/phpdoc-zh/<%=doc.get("file")%></span></p> <p align="left"><span xml:lang="EN-US">-</span></p> <p align="left"><span xml:lang="EN-US"><%=doc.get("modified")%></span></p> <p align="left"><span xml:lang="EN-US"></div></span></p> <p align="left"><span xml:lang="EN-US"><br /></span></p> <p align="left"><span xml:lang="EN-US"><%</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">%></span></p> <p align="left"><span xml:lang="EN-US"><div class="f"></span></p> <p align="left"><span xml:lang="EN-US"> 索d耗时 <b><%=((endTime.getTime() - startTime.getTime()) / 1000.0)%></b> U,U有 <b><%=hits.length()%></b> 符合条件的记录Q共 <b><%=pages%></b> ?/span></p> <p align="left"><span xml:lang="EN-US"><%</span></p> <p align="left"><span xml:lang="EN-US">if (curPage > 1 && pages > 1) {</span></p> <p align="left"><span xml:lang="EN-US">%></span></p> <p align="left"><span xml:lang="EN-US">|<a href="javascript:gotoPage(<%=(curPage-1)%>);" target="_self">上一?lt;/a></span></p> <p align="left"><span xml:lang="EN-US"><%</span></p> <p align="left"><span xml:lang="EN-US">} //end if</span></p> <p align="left"><span xml:lang="EN-US">if (curPage < pages && pages > 1) {</span></p> <p align="left"><span xml:lang="EN-US">%></span></p> <p align="left"><span xml:lang="EN-US">|<a href="javascript:gotoPage(<%=(curPage+1)%>)" target="_self">下一?lt;/a></span></p> <p align="left"><span xml:lang="EN-US"><%</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">%></span></p> <p align="left"><span xml:lang="EN-US"><!-- <%=e.getClass()%> D错误Q?lt;%=e.getMessage()%> --></span></p> <p align="left"><span xml:lang="EN-US"><%</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">%> </span></p> <p align="left"><span xml:lang="EN-US"></body></span></p> <p align="left"><span xml:lang="EN-US"></html></span></p> </div> </span></span></span> </div> <img src ="http://m.tkk7.com/nkjava/aggbug/257498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/nkjava/" target="_blank">草原上的骆驼</a> 2009-03-03 11:31 <a href="http://m.tkk7.com/nkjava/archive/2009/03/03/257498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://www330330.com" target="_blank">þþþAvר</a>| <a href="http://leeszewan.com" target="_blank">޾Ʒ</a>| <a href="http://266my.com" target="_blank">޹߾Ʒһ</a>| <a href="http://31xyz.com" target="_blank">Ʒ鶹˳վ</a>| <a href="http://djllgs.com" target="_blank">Ʒ޲һ</a>| <a href="http://33eaa.com" target="_blank">ëƬëƬַ</a>| <a href="http://99999pp.com" target="_blank">Ļ˾þ</a>| <a href="http://whknd.com" target="_blank">ѿһëƬ߹ۿƷƵ</a>| <a href="http://2h6m.com" target="_blank">jizzjizzƵѿ</a>| <a href="http://ywgj50225.com" target="_blank">avרavëƬ</a>| <a href="http://kkjk123.com" target="_blank">ӰƵѹۿ</a>| <a href="http://91tapp.com" target="_blank">һëƬ߲ŷƵ </a>| <a href="http://wkk3.com" target="_blank">޵Ӱһ</a>| <a href="http://7755ga.com" target="_blank">99ѹۿƵ</a>| <a href="http://www-741.com" target="_blank">ŷձ߹ۿ</a>| <a href="http://chinacmk.com" target="_blank">žžƵ</a>| <a href="http://16688shop.com" target="_blank">պ߹ۿƵ</a>| <a href="http://mm9d.com" target="_blank">޾ƷƷ</a>| <a href="http://yy7699.com" target="_blank">91ѹۿ</a>| <a href="http://3589006.com" target="_blank">޿һ</a>| <a href="http://yisousou.com" target="_blank">˳Ƶ߹ۿƵ</a>| <a href="http://hivzx.com" target="_blank">aҹëƬһ</a>| <a href="http://88bgbg.com" target="_blank">Ƶ߲</a>| <a href="http://wwwbu610.com" target="_blank">պa߹ۿ</a>| <a href="http://www-70074.com" target="_blank">ƷѾþþþùһ</a>| <a href="http://99999pp.com" target="_blank">һѹۿ</a>| <a href="http://liulaogendawutai.com" target="_blank">Ļ˳Ƶ</a>| <a href="http://xuexilo.com" target="_blank">վɫƵѹۿ45</a>| <a href="http://3344by.com" target="_blank">Ļþи</a>| <a href="http://miya77772.com" target="_blank">67194ֻѹۿ</a>| <a href="http://sdyzzs.com" target="_blank">jizzjizzٸ</a>| <a href="http://56ms.com" target="_blank">vaĻþò</a>| <a href="http://www-2236444.com" target="_blank">ھƷ鶹վ91鶹</a>| <a href="http://avqvod.com" target="_blank">˴WWW</a>| <a href="http://wbkk88.com" target="_blank">޾ƷAV߲</a>| <a href="http://499k.com" target="_blank">ëƬ</a>| <a href="http://www66susu.com" target="_blank">Ʒ97˳Ƶ</a>| <a href="http://ocn888.com" target="_blank">һ߹ۿ </a>| <a href="http://zjpcyh.com" target="_blank">ĻþþƷAPP</a>| <a href="http://aijiu868.com" target="_blank">ܳƵѹۿ</a>| <a href="http://nit8.com" target="_blank">޳츾߳XXXXX</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>