최근 내 프로젝트에서 나는 우리 데이터베이스에서 중복 검색을 위해 lucene을 사용했으며 완벽하게 작동하고 있습니다. 하지만 lucene 인덱스를 암호화해야하는 요구 사항이 있으며 외부 라이브러리를 사용하는 대신 lucene 자체에서 제공하는 암호화 기능을 찾아야합니다.lucene의 암호화 시설
방금 LUCENE-2228 AES 암호화 된 디렉토리를 찾고 작은 POC를 만들었습니다.
public class indexing
{
private static final byte[] KEY =
new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't',
'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' };
public static void main(String[] args) throws Exception
{
Directory INDEX_DIR = new AESDirectory(new File("index1"),KEY);
Connection conn=null;
SnowballAnalyzer analyzer=new SnowballAnalyzer(Version.LUCENE_30,"English");
try
{
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection("jdbc:mysql:///lucene", "abcd", "abcd");
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_34, analyzer);
IndexWriter writer = new IndexWriter(INDEX_DIR, config);
writer.deleteAll();
//writer.flush();
System.out.println("Indexing to directory '" + INDEX_DIR + "'...");
long starttime=System.currentTimeMillis();
indexDocs(writer, conn);
writer.optimize();
writer.close();
long endtime=System.currentTimeMillis();
long timetaken=TimeUnit.MILLISECONDS.convert(endtime - starttime,TimeUnit.MILLISECONDS);
System.out.println("Time taken to do indexing is "+timetaken+"ms");
}
catch (Exception e)
{
e.printStackTrace();
}
}
static void indexDocs(IndexWriter writer, Connection conn) throws Exception
{
//String sql = "select qid,question from tblquestions";
String sql = "select qid,question from tblquestions";
Statement stmt = conn.createStatement();
stmt.setFetchSize(Integer.MIN_VALUE);
ResultSet rs = stmt.executeQuery(sql);
Integer count = 0;
while (rs.next())
{
count ++;
Document d = new Document();
d.add(new Field("qid", rs.getString("qid"), Field.Store.YES, Field.Index.NOT_ANALYZED));
d.add(new Field("question", rs.getString("question"), Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(d);
}
System.out.println("count: " + count);
}
}
아무도 나에게이 문제를 해결하는 데 도움을 줄 수 :
java.lang.RuntimeException: File already Exists
at org.apache.lucene.util.AESWriter.<init>(AESWriter.java:117)
at org.apache.lucene.store.AESDirectory$AESIndexOutput.<init>
(AESDirectory.java:187)
at org.apache.lucene.store.AESDirectory.createOutput(AESDirectory.java:72)
at org.apache.lucene.index.SegmentInfos.finishCommit(SegmentInfos.java:939)
at org.apache.lucene.index.IndexWriter.finishCommit(IndexWriter.java:3539)
at org.apache.lucene.index.IndexWriter.commitInternal(IndexWriter.java:3529)
at org.apache.lucene.index.IndexWriter.closeInternal(IndexWriter.java:1879)
at org.apache.lucene.index.IndexWriter.close(IndexWriter.java:1822)
at org.apache.lucene.index.IndexWriter.close(IndexWriter.java:1786)
at org.apache.lucene.test.indexing.main(indexing.java:45)
것은 여기 내 코드입니다 : 문제는 내가 다시 인덱싱을 할 때이 오류가 다음 얻을 수 있다는 것입니다. 또는 lucene 색인의 암호화에 대해 알아보십시오.
어떤 lucene 버전을 사용하고 있습니까? AESDirectory를 작동 시키셨습니까? – Rocky
전체 파일 시스템을 암호화하는 것을 고려 했습니까? –
아니면 적어도 암호화 된 FS/컨테이너/오버레이를 Lucene 색인 디렉토리에 마운트 하시겠습니까? –