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 를 색인 에 추가 합 니 다. 예 를 들 어 lucene Writer. addDocument (doc);
이렇게 해서 lucene 의 색인 라 이브 러 리 를 만 들 었 습 니 다.
3. 색인 라 이브 러 리 에 대한 검색 프로그램 (lucene 문서 보기) 을 작성 합 니 다. lucene 의 색인 라 이브 러 리 를 찾 으 면 기 록 된 ID 를 빠르게 찾 을 수 있 습 니 다.
4. ID 를 통 해 데이터베이스 에서 관련 기록 찾기
Lucene 인덱스 데이터베이스 로
Lucene 은 전문 검색 의 보조 도구 로 서 Google, Baidu 와 같은 검색엔진 이 든 포럼 의 검색 기능 이 든 다른 C / S 구조의 검색 이 든 모두 매우 편리 하고 효율 적 인 검색 을 가 져 왔 습 니 다.본 고 는 주로 Lucene 을 이용 하여 MS Sql Server 2000 에 대해 색인 을 만 든 다음 에 전체 텍스트 색인 을 한다.데이터베이스 의 내용 에 대해 서 는 웹 페이지 의 내용 일 수 있 습 니까? 아니면 다른 것 일 수 있 습 니까?본 논문 에서 데이터 뱅 크 의 내용 은 도서관 관리 시스템 의 한 작가 표 - Authors 표 이다.
편폭 의 문 제 를 고려 했 기 때문에 이 글 은 상세 하 게 말 하지 않 을 뿐만 아니 라 깊이 말 할 수도 없다.
본 고 는 이러한 구조 로 진행 된다.
1. 데이터베이스 에 있 는 Authors 표 의 구 조 를 소개 합 니 다.
2. 데이터베이스 에 색인 만 들 기
3. 데이터 베 이 스 를 위 한 조회 기능 구축
4. 웹 인터페이스 에서 결 과 를 조회 하고 표시
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 (), Simple Analyzer (), StopAnalyzer () 등 이 있 습 니 다.등. 텍스트 를 분석 하고 절 사 를 어떻게 하 는 지 판단 하 는 역할 을 한다.
이 어 하나의 문 서 를 정의 해 야 합 니 다. 문 서 는 2 차원 표 의 한 줄 데이터 와 같 습 니 다. 문서 에는 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. 웹 인터페이스 에서 결 과 를 조회 하고 표시
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>


Lucene - 1.3 - final 로 사이트 데이터베이스 에 색인 만 들 기
다음은 lnboy 가 쓴 'lucene 으로 큰 부자 포럼 의 전문 검색' 을 보고 쓴 테스트 코드 입 니 다.
 
데이터베이스 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("     " + e.getClass() +  
                         "
: " + e.getMessage()); } %> 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++) { // Document doc = hits.doc(i); out.println(doc.get("Article_id")); out.println(" :" + 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(" " + e.getClass() +"
: " + e.getMessage()); } %> : 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 으로 데이터베이스 검색 에 증분 색인 만 들 기
lucene 으로 색인 을 만 드 는 것 은 매번 다시 만 들 수 없 으 며, 새로 추 가 된 기록 에 따라 한 번 씩 증가 합 니 다.
색인 을 만 드 는 IndexWriter 클래스 는 세 개의 인자 가 있 습 니 다.
IndexWriter writer = new IndexWriter(path, new StandardAnalyzer(),isEmpty);
그 중에서 세 번 째 매개 변 수 는 bool 형 입 니 다. 증분 색인 인지 재 구축 색인 인지 지정 할 수 있 습 니 다.
데이터베이스 에서 읽 은 기록, 예 를 들 어 글 에 색인 을 만 들 려 면 글 의 id 번 호 를 기록 한 다음 에 색인 을 다시 만 들 때 저 장 된 id 번 호 를 읽 을 수 있 습 니 다. 이 id 이후 에 계속 색인 을 추가 할 수 있 습 니 다. 논 리 는 다음 과 같 습 니 다.
증분 색인 을 만 듭 니 다. 주요 코드 는 다음 과 같 습 니 다.

public void createIndex(String path)
{
     Statement myStatement = null;
     String articleId="0";
     //    ,    id  ,             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  ,  id       
        String sqlText = "*****"+articleId;
        myStatement = conn.createStatement();
        ResultSet rs = myStatement.executeQuery(sqlText);
       //   
        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    
          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 {
            //       
        }        
    }

                     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();
  }
            
  writer = new IndexWriter(Directory, new StandardAnalyzer(),isEmpty);


  

좋은 웹페이지 즐겨찾기