From 2e103d3555548ccaf4b7ae14fbd679895696b2cb Mon Sep 17 00:00:00 2001 From: Martijn van Groningen Date: Wed, 31 Oct 2012 16:56:48 +0000 Subject: [PATCH] LUCENE-4513: Fixed that deleted nested docs are scored into the parent doc. git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1404248 13f79535-47bb-0310-9956-ffa450edef68 --- lucene/CHANGES.txt | 3 + .../search/join/ToParentBlockJoinQuery.java | 4 +- .../lucene/search/join/TestBlockJoin.java | 56 +++++++++++++++++++ 3 files changed, 61 insertions(+), 2 deletions(-) diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt index 9b4c149c4e1..6adc2335e36 100644 --- a/lucene/CHANGES.txt +++ b/lucene/CHANGES.txt @@ -110,6 +110,9 @@ Bug Fixes happened in the IndexWriter instance. (Ivan Vasilev via Mike McCandless) +* LUCENE-4513: Fixed that deleted nested docs are scored into the + parent doc when using ToParentBlockJoinQuery. (Martijn van Groningen) + Optimizations * LUCENE-4512: Additional memory savings for CompressingStoredFieldsIndex.MEMORY_CHUNK diff --git a/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java b/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java index d6f1bf8230b..8ce47799bd1 100644 --- a/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java +++ b/lucene/join/src/java/org/apache/lucene/search/join/ToParentBlockJoinQuery.java @@ -160,8 +160,8 @@ public class ToParentBlockJoinQuery extends Query { public Scorer scorer(AtomicReaderContext readerContext, boolean scoreDocsInOrder, boolean topScorer, Bits acceptDocs) throws IOException { - // Pass scoreDocsInOrder true, topScorer false to our sub: - final Scorer childScorer = childWeight.scorer(readerContext, true, false, null); + // Pass scoreDocsInOrder true, topScorer false to our sub and the live docs: + final Scorer childScorer = childWeight.scorer(readerContext, true, false, readerContext.reader().getLiveDocs()); if (childScorer == null) { // No matches diff --git a/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java b/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java index f2c98e7bc17..f902169630f 100644 --- a/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java +++ b/lucene/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java @@ -272,6 +272,62 @@ public class TestBlockJoin extends LuceneTestCase { dir.close(); } + public void testNestedDocScoringWithDeletes() throws Exception { + final Directory dir = newDirectory(); + final RandomIndexWriter w = new RandomIndexWriter( + random(), + dir, + newIndexWriterConfig(TEST_VERSION_CURRENT, + new MockAnalyzer(random())).setMergePolicy(NoMergePolicy.COMPOUND_FILES)); + + // Cannot assert this since we use NoMergePolicy: + w.setDoRandomForceMergeAssert(false); + + List docs = new ArrayList(); + docs.add(makeJob("java", 2007)); + docs.add(makeJob("python", 2010)); + docs.add(makeResume("Lisa", "United Kingdom")); + w.addDocuments(docs); + + docs.clear(); + docs.add(makeJob("c", 1999)); + docs.add(makeJob("ruby", 2005)); + docs.add(makeJob("java", 2006)); + docs.add(makeResume("Frank", "United States")); + w.addDocuments(docs); + + w.commit(); + IndexSearcher s = newSearcher(DirectoryReader.open(dir)); + + ToParentBlockJoinQuery q = new ToParentBlockJoinQuery( + NumericRangeQuery.newIntRange("year", 1990, 2010, true, true), + new CachingWrapperFilter(new QueryWrapperFilter(new TermQuery(new Term("docType", "resume")))), + ScoreMode.Total + ); + + TopDocs topDocs = s.search(q, 10); + assertEquals(2, topDocs.totalHits); + assertEquals(6, topDocs.scoreDocs[0].doc); + assertEquals(3.0f, topDocs.scoreDocs[0].score, 0.0f); + assertEquals(2, topDocs.scoreDocs[1].doc); + assertEquals(2.0f, topDocs.scoreDocs[1].score, 0.0f); + + s.getIndexReader().close(); + w.deleteDocuments(new Term("skill", "java")); + w.close(); + s = newSearcher(DirectoryReader.open(dir)); + + topDocs = s.search(q, 10); + assertEquals(2, topDocs.totalHits); + assertEquals(6, topDocs.scoreDocs[0].doc); + assertEquals(2.0f, topDocs.scoreDocs[0].score, 0.0f); + assertEquals(2, topDocs.scoreDocs[1].doc); + assertEquals(1.0f, topDocs.scoreDocs[1].score, 0.0f); + + s.getIndexReader().close(); + dir.close(); + } + private String[][] getRandomFields(int maxUniqueValues) { final String[][] fields = new String[_TestUtil.nextInt(random(), 2, 4)][];