Lucene에서 indexWriter.updateDocument는
Term에 해당하는 document를 바로 update하는 것이 아니고
delete 후 insert 로직으로 작동합니다.
즉, id=2인 document를 update 하려고 했을때, 인덱스에 id=2인 document가 없다면
업데이트를 하려고했던 document가 insert가 됩니다.
간단한 테스트케이스를 보시면..
처음에 id=1인 문서를 색인하고(addDocument) 그 이후에 id=1인 term query로 update를 합니다.
update 후 id=1로 검색을 한 결과를 보면 아래와 같이
Assert.assertTrue(topDocs.totalHits == 1);
Assert.assertEquals("document 1 update", indexSearcher.doc(topDocs.scoreDocs[0].doc).get("title"));
update된 문서를 보실 수 있습니다.
그 이후에 id=2인 document를 id=2인 term query로 update를 하게 되면 기존 인덱스에는 id=2인 term으로 검색되어 나오는 document가 없기 때문에, id=2인 document가 insert가 됩니다.
id=2로 검색을 해보면 아래와 같은 결과를 얻습니다.
Assert.assertTrue(topDocs.totalHits == 1);
Assert.assertEquals("document 2 update", indexSearcher.doc(topDocs.scoreDocs[0].doc).get("title"));
그리고 당연히 전체 document 개수는 2개가 되어있겠죠.
topDocs = indexSearcher.search(new MatchAllDocsQuery(), 10);
Assert.assertTrue(topDocs.totalHits == 2);