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);
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 파일 압축 및 압축 풀기파일 의 간단 한 압축 과 압축 해 제 를 실현 하 였 다.주요 테스트 용 에는 급 하 게 쓸 수 있 는 부분 이 있 으 니 불편 한 점 이 있 으 면 아낌없이 가르쳐 주 십시오. 1. 중국어 문 제 를 해 결 했 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.