2010-07-15 6 views
0

Lucene을 사용하여 데이터베이스의 테이블을 인덱싱하려고합니다. 색인 생성을 위해 Lucene을 사용하고 필드는 저장되지 않습니다. 위에서 언급 한 표에는 5 개의 열 (사용자 ID (PK), 설명, 보고서 번호, 보고서 유형, 보고서)이 있습니다.Lucene 인덱싱 및 검색

Lucene이 히트를 발견하면 데이터베이스에서 데이터를 다시 가져 오기 위해 userid, reportnumber 및 report type의 조합을 사용하려고합니다.

테이블의 레코드 하나는 예를 들어 여러 행에 걸쳐있을 수 있습니다.

JQ123, SOMEDESCRIPTION 1, FIN, 핀 보고서의 내용
JQ123, AnotherDescription, 2, 수학, 수학 보고서의 내용
JQ123, YetAnotherDesc, 3, 수학, 다른 수학 보고서의 내용
JD456, MoreDesc , 1, STAT, 통계 보고서 내용 ...

일부 보고서 유형 예 (MATH)는 고도로 구조화 된 내용 (XML, 마지막 열에 문자열로 저장 됨)을 가지고 있으며 나중에 내용의 일부인을 문서의 일부로 채울 수 있습니다.

지금까지 모든 행에 대해 Lucene 문서를 작성하고 색인을 생성하는 전략이있었습니다. 그 뒤에있는 나의 생각은 1입니다. 간단하고 논리적으로 보입니다 (내게) 2. 특정 문서 유형에서 내용을 추출하여 필드에 입력하면 결국 필요한 것은 보고서 형식이 인지 확인하고 이러한 새 필드를 만드는 if 문입니다. 여기에 관련 코드는 다음과 같습니다

public void createDocument(){ 
Document luceneDocument=new Document(); 
luceneDocument.add(new Field("userid", userID, Field.Store.NO, Field.Index.NOT_ANALYZED)); 
luceneDocument.add(new Field("reportnumber", reportNum, Field.Store.NO, Field.Index.NOT_ANALYZED)); 
luceneDocument.add(new Field("reporttype", reportType, Field.Store.NO, Field.Index.NOT_ANALYZED)); 
luceneDocument.add(new Field("description", description, Field.Store.NO, Field.Index.ANALYZED)); 
luceneDocument.add(new Field("report", report, Field.Store.NO, Field.Index.ANALYZED)); 

if(reporttype.equalsIgnoreCase("MATH"){ 
luceneDocument.add(new Field("more fields", field content, Field.Store.NO, Field.Index.ANALYZED)); 
} 
indexwriter.add(luceneDocument) 
indexwriter.close 
}   

1 같은 기록을 어떤 방식으로 루씬의 검색 효율에 영향을 미치는 다른 문서를 가지고 있습니까? (나는 어떤 필드를 저장하지 않는 ) 루씬에서 레코드 당 하나의 문서를 가지고 비교했을 때
2이 방법은 머리를 통해 상당한 디스크 공간이겠습니까?

미리 답변 해 주셔서 감사합니다.

답변

0

먼저 색인을 설정하는 방법에 유의하십시오. 각 용어의 색인과 같이 보인다 :

[용어] [DOCID] [DOCID] ...에서 [DOCID]의 그 용어가 포함 된 문서의 ID입니다

. 귀하의 질문에 대한 답변 :

  1. 예 : MATH와 STATS는 동일한 용어를 포함하고 있으며 여기에 두 번 나열됩니다. 그래서 검색은 이론적으로 하나만보아야 할 때 두 개의 문서를 조사해야합니다. 그러나 이것은 최소한의 패널티입니다.
  2. 각 문서에 최소한 하나의 ID를 저장해야하므로 사소한 스토리지가 증가 할 것입니다. 그것은 (ID의 길이) * (행 당 문서 수)가됩니다. 다시 말하지만, 이것은 사소한 것입니다.

더 중요한 문제는 쿼리를 적절히 표준화 할 수 없다는 사실입니다. 예를 들어, 검색은 MATH 및 STATS에서 일치하는 행 1을 찾고, MATH에서만 일치하는 행 2를 찾습니다. Lucene은 두 문서가 실제로 같은 행이라는 것을 모르기 때문에 수동으로 행 # 1의 순위를 매길 필요가 있습니다.

간단히 말해서 엄청나게 엄청난 색인이 아니라면 저장 용량/성능에 대해 걱정하지 않아도됩니다. 하지만 그 질문에 점수를 매기는 방법에 대해 걱정할 것입니다.