@Override public boolean nextNode() throws IOException { freq = 0.0f; // reset freq while (conjunctionScorer.nextNode()) { // if node contains phrase-query terms if (this.firstPhrase()) { // check for phrase freq = this.phraseFreq(); // compute frequency of the phrase return true; } } return false; }
@Test public void testSkipToCandidateNext() throws Exception { final ArrayList<String> docs = new ArrayList<String>(); for (int i = 0; i < 32; i++) docs.add("<http://renaud.delbru.fr/> . "); this.addDocuments(docs); final NodePhraseScorer scorer = (NodePhraseScorer) this.getScorer(npq("renaud", "delbru")); assertTrue(scorer.nextCandidateDocument()); assertTrue(scorer.skipToCandidate(16)); assertEquals(16, scorer.doc()); assertTrue(scorer.nextNode()); assertEquals(node(0,0), scorer.node()); assertTrue(scorer.nextCandidateDocument()); assertEquals(17, scorer.doc()); assertTrue(scorer.nextNode()); assertEquals(node(0,0), scorer.node()); }
@Test public void testMultipleOccurrences() throws Exception { this.addDocument("<http://renaud.delbru.fr/> \"renaud delbru delbru renaud renaud delbru\" . "); NodeQuery q = npq("renaud", "delbru").getNodeQuery(); NodePhraseScorer scorer = (NodePhraseScorer) this.getScorer(q); assertTrue(scorer.nextCandidateDocument()); assertEquals(0, scorer.doc()); assertTrue(scorer.nextNode()); assertEquals(node(0,0), scorer.node()); assertEquals(1.0f, scorer.freqInNode(), 0); assertTrue(scorer.nextNode()); assertEquals(node(0,1), scorer.node()); assertEquals(2.0f, scorer.freqInNode(), 0); assertFalse(scorer.nextNode()); assertFalse(scorer.nextCandidateDocument()); q = npq("renaud", "", "delbru").getNodeQuery(); scorer = (NodePhraseScorer) this.getScorer(q); assertTrue(scorer.nextCandidateDocument()); assertEquals(0, scorer.doc()); assertTrue(scorer.nextNode()); assertEquals(node(0,1), scorer.node()); assertEquals(2.0f, scorer.freqInNode(), 0); assertFalse(scorer.nextNode()); assertFalse(scorer.nextCandidateDocument()); }
/** * Test exact phrase scorer: should not match two words in separate nodes */ @Test public void testEmptyResult1() throws Exception { this.addDocument("\"word1 word2 word3\" \"word4 word5\" . "); final NodePhraseScorer scorer = (NodePhraseScorer) this.getScorer(npq("word1", "word4")); assertTrue(scorer.nextCandidateDocument()); assertFalse(scorer.nextNode()); }
@Test public void testSkipToCandidate() throws Exception { final ArrayList<String> docs = new ArrayList<String>(); for (int i = 0; i < 32; i++) { docs.add("<http://renaud.delbru.fr/> . "); } this.addDocuments(docs); final NodePhraseScorer scorer = (NodePhraseScorer) this.getScorer(npq("renaud", "delbru")); assertTrue(scorer.skipToCandidate(16)); assertEquals(16, scorer.doc()); assertTrue(scorer.nextNode()); assertEquals(node(0,0), scorer.node()); }
/** * Test exact phrase scorer: should not match phrase with a gap of 1 between * the two phrase query terms */ @Test public void testEmptyResult2() throws Exception { this.addDocument("\"word1 word2 word3\" \"word4 word5\" . "); final NodePhraseScorer scorer = (NodePhraseScorer) this.getScorer(npq("word4", "", "word5")); assertTrue(scorer.nextCandidateDocument()); assertFalse(scorer.nextNode()); }
@Test public void testNodeConstraint() throws Exception { this.addDocument("\"word1 word2 word3\" \"word4 word5\" . "); NodePhraseScorer scorer = (NodePhraseScorer) this.getScorer(npq("word4", "word5")); assertTrue(scorer.nextCandidateDocument()); assertTrue(scorer.nextNode()); scorer = (NodePhraseScorer) this.getScorer(npq("word4", "word5").level(2)); assertTrue(scorer.nextCandidateDocument()); assertTrue(scorer.nextNode()); scorer = (NodePhraseScorer) this.getScorer(npq("word4", "word5").level(1)); assertTrue(scorer.nextCandidateDocument()); assertFalse(scorer.nextNode()); scorer = (NodePhraseScorer) this.getScorer(npq("word4", "word5").bound(0,0)); assertTrue(scorer.nextCandidateDocument()); assertFalse(scorer.nextNode()); scorer = (NodePhraseScorer) this.getScorer(npq("word4", "word5").bound(0,1)); assertTrue(scorer.nextCandidateDocument()); assertTrue(scorer.nextNode()); }