Lucene索引数据库实践

一、Lucene索引数据库基本思路

       1、写一段传统的JDBC程序,将每条的用户信息从数据库读取出来
       2、针对每条用户记录,建立一个
lucene document 。Document doc = new Document(); 并根据你的需要,将用户信息的各个字段对应luncene document中的field 进行添加,如: doc.add(new Field("NAME","USERNAME",Field.Store.YES,Field.Index.UN_TOKENIZED));然后将该条doc加入到索引库中, 如: luceneWriter.addDocument(doc);这样就建立了lucene的索引库
       3、编写对索引库的搜索程序(看lucene文档),通过对lucene的索引库的查找,你可以快速找到对应记录的
ID
       4、通过ID到数据库中查找相关记录

二、用Lucene索引数据库示例

        Lucene,作为一种全文搜索的辅助工具,为我们进行条件搜索,无论是像Google,Baidu之类的搜索引 擎,还是论坛中的搜索功能,还是其它C/S架构的搜索,都带来了极大的便利和比较高的效率。本文主要是利用Lucene对数据库进行建立索引,然后进行全文索引。至于数据库的内容,可以是网页的内容,还是其它的。本文中数据库的内容是图书馆管理系统中的某个作者表- Authors表。考虑到篇幅的问题,所以该文不会讲的很详细,也不可能讲的很深。

1、数据库中Authors表的结构
[java]  view plain  copy
  1. 字段名称         字段类型         字段含义  
  2.   
  3. Au_id           Varchar(11)    作者号  
  4. Au_name         Varchar(60)    作者名  
  5. Phone           Char(12)       电话号码  
  6. Address         Varchar(40)    地址  
  7. City            Varchar(20)    城市  
  8. State           Char(2)        省份  
  9. Zip             Char(5)        邮编  
  10. contract        Bit(1)         外键(关系不大)  


 

2、为数据库建立索引

  首先,建立一个类TestLucene.Java。这个类就是对数据库进行建立索引,编写查询条件等。当然,最开始就是建立数据库连接。连接代码这里就省略了。接着,新建一个方法getResutl(String),它返回的是数据库表Authors的内容。具体代码如下:

[html]  view plain  copy
  1. public ResultSet getResult(String sql){  
  2.    try{  
  3.      Statement stmt = conn.createStatement();  
  4.      ResultSet rs = stmt.executeQuery(sql);  
  5.      return rs;  
  6.    }  
  7.    catch(SQLException e){  
  8.      System.out.println(e);  
  9.    }  
  10.    return null;  
  11.  }  

 

     然后,为数据库建立索引。先要定义一个IndexWriter(),它是将索引写进Lucene自己的数据库中,它存放的位置是有你自己定义的。在定义IndexWriter 是需要指定它的分析器。Lucene自己自带有几个分析器,例如:StandarAnalyzer(),SimpleAnalyzer(), StopAnalyzer()等。它作用是对文本进行分析,判断如何进行切词。接着,要定义一个Document。Document相当于二维表中一行数据一样。Document里包含的是Field字段,Field相当于数据库中一列,也就是一个属性,一个字段。最后应该对IndexWriter进行优化,方法很简单,就是writer.optimize()。具体代码如下:

 

[html]  view plain  copy
  1. public void Index(ResultSet rs){  
  2.      try{  
  3.        IndexWriter writer = new IndexWriter("d:/index/", getAnalyzer(), true);  
  4.        while(rs.next()){  
  5.            Document doc=new Document();  
  6.            doc.add(Field.Keyword("id",rs.getString("au_id")));  
  7.            doc.add(Field.Text("name",rs.getString("au_name")));  
  8.            doc.add(Field.UnIndexed("address",rs.getString("address")));  
  9.            doc.add(Field.UnIndexed("phone",rs.getString("phone")));  
  10.            doc.add(Field.Text("City",rs.getString("city")));  
  11.            writer.addDocument(doc);  
  12.          }  
  13.        writer.optimize();  
  14.        writer.close();  
  15.      }  
  16.      catch(IOException e){  
  17.        System.out.println(e);  
  18.      }  
  19.      catch(SQLException e){  
  20.        System.out.println(e);  
  21.      }  
  22.    }  
  23.   
  24.   public Analyzer getAnalyzer(){  
  25.      return new StandardAnalyzer();  
  26.    }  

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

  在类TestLucene中建立一个新的方法searcher(String),它返回的是一个搜索的结构集,相当于数据库中的ResultSet一样。它代的参数是你要查询的内容。这里,我把要查询的字段写死了。你可以在添加一个参数表示要查询的字段。
       这里主要有两个对象IndexSearcher和Query。IndexSearcher是找到索引数据库,Query是处理搜索,它包含了三个参数:查询内容,查询字段,分析器。
       具体代码如下:

[html]  view plain  copy
  1. public Hits seacher(String queryString){  
  2.      Hits hits=null;;  
  3.      try{  
  4.        IndexSearcher is = new IndexSearcher("D:/index/");  
  5.        Query query=QueryParser.parse(queryString,"City",getAnalyzer());  
  6.        hits=is.search(query);  
  7.      }catch(Exception e){  
  8.        System.out.print(e);  
  9.      }  
  10.      return hits;  
  11.    }  

 4、web界面下进行查询并显示结果

  这里建立一个Jsp页面TestLucene.jsp进行搜索。在TestLucene.jsp页面中首先引入类。

[html]  view plain  copy
  1. <%@ page import="lucenetest.LucentTest"%>  
  2. < %@ page import="org.apache.lucene.search.*,org.apache.lucene.document.*" %>  
  3. <!--然后定义一个LuceneTest对象,获取查询结果集:-->  
  4. LucentTest lucent=new LucentTest();  
  5. Hits hits=lucent.seacher(request.getParameter("queryString"));  
  6. <!--定义一个Form,建立一个查询环境:-->  
  7. <form action="TestLucene.jsp">  
  8.    <input  type="text" name="queryString"/>  
  9.    <input type="submit" value="搜索"/>  
  10. < /form>  
  11.   
  12.   显示查询结果:  
  13.   
  14. <table>  
  15.    <%if(hits!=null){%>  
  16.    <tr>  
  17.      <td>作者号</td>  
  18.      <td>作者名</td>  
  19.      <td>地址</td>  
  20.      <td>电话号码</td>  
  21.    </tr>  
  22.   
  23.  <%  for(int i=0;i<hits.length();i++){  
  24.      Document doc=hits.doc(i);  
  25.     %>  
  26.      <tr>  
  27.      <td><%=doc.get("id") %></td>  
  28.      <td><%=doc.get("name") %></td>  
  29.      <td><%=doc.get("address") %></td>  
  30.      <td><%=doc.get("phone") %></td>  
  31.    </tr>  
  32.   <% }}%>  
  33. < /table>  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值