• 2007-01-30

    (转)Lucene 索引数据库

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://zhutong7758.blogbus.com/logs/4407019.html

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

      因为考虑到篇幅的问题,所以该文不会讲的很详细,也不可能讲的很深。

      本文以这样的结构进行:

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

      2.为数据库建立索引

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

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

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

    字段名称         字段类型         字段含义

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


    表中的部分内容:
     

      2.为数据库建立索引

      首先建立一个类TestLucene.java。这个类就是对数据库进行建立索引,编写查询条件等。

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

      接着,新建一个方法getResutl(String),它返回的是数据库表Authors的内容。具体代码如下:


        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;
        }
     


      然后,为数据库建立索引。

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


      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();
        }

     


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

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


      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;
        }
     


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

      这里建立一个Jsp页面TestLucene.jsp进行搜索。

      在TestLucene.jsp页面中首先引入类


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


      然后定义一个LuceneTest对象,获取查询结果集:


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


      定义一个Form,建立一个查询环境:


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


      显示查询结果:


    <table>
      <%if(hits!=null){%>
      <tr>
        <td>作者号</td>
        <td>作者名</td>
        <td>地址</td>
        <td>电话号码</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>


    历史上的今天:


    收藏到:Del.icio.us




    评论

  • 这个例子又完整版的吗,给俺发一份被,谢谢
  • 写的能不能在具体下,呵呵
    例如
    建立数据库连接。