Lucene 2.4 입문 총화

1. Lucene 을 이용 하여 검색엔진 을 구축 하 는 일반적인 과정:
   각종 문서 의 문자 화 - > 문자 데 이 터 를 단어 로 나 눕 니 다. > 색인 만 들 기 - > 검색 (검색 필드, 검색 방식 을 선택 하고 검색 을 수행 합 니 다).
2. Lucene 파일 시스템 설명:
   %LUCENE_HOME% \ contrib \: Lucene 확장 팩 은 다양한 언어 에 대한 단어 도구, 밝 은 디 스 플레이, Ant, xml 파일 분석 등 을 포함 합 니 다.다른 목록 은 군말 없 이 명료 하 다.
3. Lucene 주요 패키지 구조:
  
|__org. apache. lucene. document: 색인 구 조 를 구성 하 는 문서 와 필드, 색인 구 조 는 데이터베이스 에 있 는 표 와 유사 하기 때문에 색인 구조 에서 Document 은 한 줄 을 대표 하고 Field 대표 필드, 가방 안에 FieldSelector 인터페이스 와 그 실현 클래스 를 정의 하여 색인 을 읽 을 때 어떤 필드 가 읽 히 는 지 설명 합 니 다.
  
|__org. apache. lucene. analysis: 각종 문 서 를 문자열 로 바 꾸 는 데 사용 되 는 일련의 도 구 를 정의 합 니 다. 주로 단어 기, 필터, 밝 은 디 스 플레이 에서 자주 사용 되 는 태그 (Token) 를 포함 합 니 다.Lucene 은 이 가방 아래 standard 패 키 지 를 정 의 했 습 니 다. 그 중에서 영문 문자 에 대한 표지 단어 기 Standard Analyzer 를 정 의 했 고 다른 언어 종류의 단어 기 는% LUCENE 에 있 습 니 다.HOME% \ contrib \ analychers 에서 정의 합 니 다 (Lucene 의 확장 패키지).필 터 는 색인 을 만 들 때 규칙 에 따라 문서 의 일부 정 보 를 걸 러 내 는 데 사 용 됩 니 다. 예 를 들 어 영어 의 a, an, is 등 입 니 다.
  
|__org. apache. lucene. index: 색인 을 유지 하고 접근 하 는 데 사 용 됩 니 다. 예 를 들 어 IndexWriter 는 문 서 를 구성 하고 색인 파일 에 기록 하 는 데 사 용 됩 니 다.IndexReader 는 색인 파일 을 읽 는 데 사 용 됩 니 다.Index Modifier 는 색인 파일 을 수정 하 는 데 사 용 됩 니 다.색인 과 색인 구조 에 대한 유지보수 클래스 도 정의 했다.
  
|__org. apache. lucene. query Parser: 이 가방 은 자바 CC (
자세히 소개 하 다 자동 으로 생 성 됩 니 다.상용 클래스 는 Query Parser 입 니 다. 기능 은 단어 기 (색인 파일 을 만 들 때 사용 하 는 단어 기 와 같 아야 함) 를 이용 하여 검색 키 워드 를 분석 하고 분석 하여 Query 대상 을 만 드 는 것 입 니 다. 이 대상 은 Searcher 클래스 인 스 턴 스 에 맡 겨 조회 합 니 다.
  
|__org. apache. lucene. search: 조회 및 조회 결과 에 대한 작업 을 수행 합 니 다.주로 Query 에서 검색 어 를 정의 하 는 데 사용 합 니 다.Indexsearcher 에서 조 회 를 실행 합 니 다.TopScoreCollector 는 조회 결 과 를 받 기 위해 조회 파 라 메 터 를 입력 합 니 다.
4. 각종 문서 의 문자 화:
   1) PDF - -- PDFBox,
http://sourceforge.net/projects/pdfbox/ PDFBox 라 이브 러 리 를 다운로드 하고 압축 을 풀 고 외부 와 lib 의 jar 패 키 지 를 응용 프로그램 / lib 에 복사 합 니 다.
   2) WORD - - POI 의 구성 요소 패키지, textmining, [url] 에서http://mirrors.ibiblio.org/pub/mirrors/maven2/org/textmining/tm-   extractors / 0.4 / [/ url] tm - extractors - 0.4. zip 다운로드
   3) EXCEL - -- JExcel,
http://www.andykhan.com/jexcelapi/ 다운로드
   4) XML - -- DOM4J,
http://www.dom4j.org/ 다운로드
   5) HTML --- HTML Parser,
http://htmlparser.sourceforge.net/ 다운로드 하려 면 filter builder. jar, htmlparser. jar, htmllexer. jar, thumbelina. jar 가 필요 합 니 다.
   6) Lius, 각종 문서 에서 텍스트 정 보 를 추출 하 는 데 사 용 됩 니 다. PPT 문서 에 대해 서 만 영어 로 만 해석 할 수 있 습 니 다.
5. 색인 만 들 기:
  

final String IDNEX_PATH = "D:/Temp/lucene/index";//      
Analyzer analyzer = new PaodingAnalyzer();
//                 ,true      
IndexWriter writer = new IndexWriter(IDNEX_PATH, analyzer,true,
	IndexWriter.MaxFieldLength.UNLIMITED);
		
//    ,     
Document doc = new Document();
Field field = new Field("content", "Hello World~",Field.Store.YES,				    
        Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS);
doc.add(field);
		
writer.addDocument(doc);//        
writer.optimize();//    
writer.close();//    ,       ,          

  
필드 정의:
       Field. store. YES: 필드 값 저장 (단어 없 는 필드 값)
       Field. store. NO: 저장 하지 않 습 니 다. 저장 은 색인 과 관계 가 없습니다.
       Field. store. COMPRESS: 압축 저장 소, 긴 텍스트 나 바 이 너 리 에 사용 되 지만 성능 이 손 상 됩 니 다.
       Field. Index. ANALYZED: 단어 별 색인 만 들 기
       Field.Index.ANALYZED_NO_NORMS: 단 어 를 나 누 어 색인 을 만 듭 니 다. 그러나 Field 의 값 은 보통 처럼 저장 되 지 않 고 하나의 byte 만 가 져 와 서 저장 공간 을 절약 합 니 다.
       Field.Index.NOT_ANALYZED: 단 어 를 가리 지 않 고 색인
       Field.Index.NOT_ANALYZED_NO_NORMS: 단 어 를 가리 지 않 고 색인 을 만 들 고 Field 의 값 을 byte 로 저장 합 니 다.
       TermVector 는 문서 의 항목 (하나의 Document 와 Field 에서 위치 추적) 과 현재 문서 에 나타 난 횟수 를 표시 합 니 다.
       Field. TermVector. YES: 각 문서 (Document) 에 이 필드 를 저장 하 는 TermVector
       Field. TermVector. NO: TermVector 를 저장 하지 않 음
       Field.TermVector.WITH_POSITIONS: 저장 위치
       Field.TermVector.WITH_OFFSETS: 저장 오프셋
       Field.TermVector.WITH_POSITIONS_OFFSETS: 저장 위치 와 오프셋
6. 검색
		
final String field = "content";//            
StandardAnalyzer analyzer = new StandardAnalyzer();
QueryParser parser = new QueryParser(field, analyzer);//     
IndexReader reader = IndexReader.open("D:\\Temp\\lucene\\index");//      
		
//    
IndexSearcher searcher = new IndexSearcher(reader);
TopDocCollector topCollector = new TopDocCollector(100);//       ,    100     
BufferedReader in = new BufferedReader(new                
     InputStreamReader(System.in,"UTF-8"));
String line = in.readLine();//       
Query query = parser.parse(line);//            ,  Query  
searcher.search(query, topCollector);//      

ScoreDoc[] scoreDocs = topCollector.topDocs().scoreDocs;//              
System.out.println("Found " + scoreDocs.length + " results in:");
//     ,      ,              
for(ScoreDoc scoreDoc : scoreDocs){
	Document doc = searcher.doc(scoreDoc.doc);
	System.out.println("Path:\t" + doc.get("path"));
}

7. 다 중 조건 조회:
   저 희 는 실제 응용 프로그램 에서 서로 다른 색인 파일, 필드 를 검색 합 니 다. 서로 다른 색인 파일 에 대한 조 회 는 주로 여러 개의 Searcher 를 정의 한 다음 에 MulitSearcher 에 집합 하여 MultiSearcher (실현 클래스) 의 인 스 턴 스 를 이용 하여 검색 작업 을 수행 합 니 다.필드 별 색인 은 필드 의 배열 을 정의 한 다음 Query Parser 를 이용 하여 배열 을 해석 합 니 다.
  
1) 다 중 인덱스 파일 검색:
      방법 1: 이 검색 결 과 는 같은 정보 가 있 을 수 있 습 니 다. 예 를 들 어 같은 정 보 를 여러 디 렉 터 리 에서 색인 하면 검색 결과 에 같은 정보 가 여러 번 나타 납 니 다.
       

IndexSearcher searcher1 = new IndexSearcher(INDEX_PATH1);
IndexSearcher searcher2 = new IndexSearcher(INDEX_PATH2);
IndexSearcher[] searchers = {searcher1,searcher2};
MultiSearcher multisearcher = new MultiSearcher(searchers);
TopDocs multitopdocs = multisearcher.Search(query, null, 1000);

      방법 2: 이 검색 은 검색 후의 결 과 를 합 쳐 중복 되 는 정 보 를 제거 하 는 것 입 니 다.
       
          
IndexSearcher searcher1 = new IndexSearcher(INDEX_PATH1);
IndexSearcher searcher2 = new IndexSearcher(INDEX_PATH2);
IndexSearcher[] searchers = {searcher1,searcher2};
ParallelMultiSearcher parallelmultisearcher = new ParallelMultiSearcher(searchers);
TopDocs paralleltopdocs = parallelmultisearcher.Search(query, null, 1000);

   
2) 다 중 필드 검색:
       방법 1: booleanQuery 를 이용 하여 여러 개의 Query 를 추가 합 니 다. 각 Query 는 검색 키워드 와 그 중의 한 필드 에 대응 하 는 Query 를 추가 합 니 다.
        

final String[] field_list = {"pk_dept","deptname","depttype","deptduty","addr","tel"};
String keyword = "Sales";
BooleanQuery boolQuery = new BooleanQuery();
for(String field : field_list){
	QueryParser parser = new QueryParser(field,new PaodingAnalyzer());
	Query query = parser.parse(keyword);
	//boolQuery     query,
	//  BooleanClause.Occur.SHOULD:       query      ,     field   
	//  BooleanClause.Occur.SHOULD:       query      ,     field   
	boolQuery.add(query,BooleanClause.Occur.SHOULD);
}
searcher.search(boolQuery, topCollector);

        방법 2: MultiFieldQuery Parser 를 이용 하여 검색 키 워드 를 여러 필드 에 연결 합 니 다.
         

final String[] field_list = {"pk_dept","deptname","depttype","deptduty","addr","tel"};
String keyword = "Sales";
QueryParser multi_parser = new MultiFieldQueryParser(field_list,new PaodingAnalyzer());
Query query = multi_parser.parse(keyword);
searcher.search(query,topCollector);

좋은 웹페이지 즐겨찾기