Hello,
I'd like to contribute BlockJoinQParserPlugin for Solr. It's not a very big
deal, but I'm stuck during writing filtered search test cases. At the first
glance it looks like deja vu for another "join"
https://issues.apache.org/jira/browse/SOLR-3062
http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/search/JoinQParserPlugin.java?r1=1238085&r2=1239355.
But then I realized that it's a question about requirements:
What is the expected functionality for ToParentBlockJoinQuery for filtered
search IndexSearcher.search(Query, *Filter*, Collector)? whether the given
filter is applied to children documents or to the parent documents?
Considering Solr's fq= I suppose that there is more sense to apply that
filter to parent documents. WDYT?
I'm attaching the small amendments to TestBlockJoin to get you my
understanding.
Thanks in advance.
--
Sincerely yours
Mikhail Khludnev
Lucid Certified
Apache Lucene/Solr Developer
Grid Dynamics
<http://www.griddynamics.com>
<[email protected]>
Index: modules/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java
===================================================================
--- modules/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java (revision 1237200)
+++ modules/join/src/test/org/apache/lucene/search/join/TestBlockJoin.java (working copy)
@@ -155,6 +155,63 @@ public class TestBlockJoin extends LuceneTestCase {
dir.close();
}
+ public void testSimpleFilter() throws Exception {
+
+ final Directory dir = newDirectory();
+ final RandomIndexWriter w = new RandomIndexWriter(random, dir);
+
+ final List<Document> docs = new ArrayList<Document>();
+
+ docs.add(makeJob("java", 2007));
+ docs.add(makeJob("python", 2010));
+ docs.add(makeResume("Lisa", "United Kingdom"));
+ w.addDocuments(docs);
+
+ docs.clear();
+ docs.add(makeJob("ruby", 2005));
+ docs.add(makeJob("java", 2006));
+ docs.add(makeResume("Frank", "United States"));
+ w.addDocuments(docs);
+
+ IndexReader r = w.getReader();
+ w.close();
+ IndexSearcher s = newSearcher(r);
+
+ // Create a filter that defines "parent" documents in the index - in this case resumes
+ Filter parentsFilter = new CachingWrapperFilter(new QueryWrapperFilter(new TermQuery(new Term("docType", "resume"))));
+
+ // Define child document criteria (finds an example of relevant work experience)
+ BooleanQuery childQuery = new BooleanQuery();
+ childQuery.add(new BooleanClause(new TermQuery(new Term("skill", "java")), Occur.MUST));
+ childQuery.add(new BooleanClause(NumericRangeQuery.newIntRange("year", 2006, 2011, true, true), Occur.MUST));
+
+ // Define parent document criteria (find a resident in the UK)
+ Query parentQuery = new TermQuery(new Term("country", "United Kingdom"));
+
+ // Wrap the child document query to 'join' any matches
+ // up to corresponding parent:
+ ToParentBlockJoinQuery childJoinQuery = new ToParentBlockJoinQuery(childQuery, parentsFilter, ToParentBlockJoinQuery.ScoreMode.Avg);
+
+ assertEquals("no filter - both passed",s.search(childJoinQuery, 10).totalHits, 2);
+ assertEquals("dummy filter passes everyone ",s.search(childJoinQuery, parentsFilter, 10).totalHits, 2);
+
+ // not found test
+ TopDocs ozHabitants = s.search(childJoinQuery , new CachingWrapperFilter( new QueryWrapperFilter(new TermQuery(new Term("country", "Oz")))), 10);
+ assertEquals("noone live there",0, ozHabitants.totalHits);
+
+ // apply the UK filter by the searcher
+ TopDocs ukOnly = s.search(childJoinQuery, new CachingWrapperFilter(new QueryWrapperFilter(parentQuery)), 10);
+ //TopDocs ukOnly = s.search(childJoinQuery, new QueryWrapperFilter(parentQuery), 10);
+ assertEquals("has filter - single passed",1, ukOnly.totalHits);
+ assertEquals( "Lisa", r.document(ukOnly.scoreDocs[0].doc).get("name"));
+ // looking for US candidates
+ TopDocs usThen = s.search(childJoinQuery , new CachingWrapperFilter( new QueryWrapperFilter(new TermQuery(new Term("country", "United States")))), 10);
+ assertEquals("has filter - single passed", 1,usThen.totalHits);
+ assertEquals("Frank", r.document(usThen.scoreDocs[0].doc).get("name"));
+ r.close();
+ dir.close();
+ }
+
private Document getParentDoc(IndexReader reader, Filter parents, int childDocID) throws IOException {
final AtomicReaderContext[] leaves = ReaderUtil.leaves(reader.getTopReaderContext());
final int subIndex = ReaderUtil.subIndex(childDocID, leaves);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]