Monday, January 5, 2015

Join in lucene: ToParentBlockJoinQuery and ToChildBlockJoinQuery

ToParentBlockJoinQuery:

-Result in groups where each group represent parent and corresponding matched child’s.


ToChildBlockJoinQuery:

for given parent list all the child's of him.

 ***Examples***
  1. Use ToParentBlockJoinQuery to retrieve parent doc based on matched child doc.
private List<Document> searchParentDocs(Query childQuery, Query parentQuery)
            throws IOException {
        List<Document> parentDocs = new ArrayList<Document>();

        Filter parentFilter = new FixedBitSetCachingWrapperFilter(
                new QueryWrapperFilter(new TermQuery(new Term("path", "root"))));

       
        TotalHitCountCollector tc = new TotalHitCountCollector();
        SearchUtility.getFixSearcher().search(parentQuery, tc);
       
        ToParentBlockJoinQuery parentJoinQuery = new ToParentBlockJoinQuery(
                childQuery, parentFilter, ScoreMode.None);

        logger.debug("Total parent matching parentQuery:" + tc.getTotalHits());

        ToParentBlockJoinCollector pjc = new ToParentBlockJoinCollector(
                Sort.RELEVANCE,  tc.getTotalHits() , false, false);

        BooleanQuery searchQuery = new BooleanQuery();
        searchQuery.add(parentJoinQuery, Occur.MUST);
        searchQuery.add(parentQuery, Occur.MUST);

        SearchUtility.getFixSearcher().search(searchQuery, pjc);

        TopGroups<Integer> topgroups = pjc.getTopGroupsWithAllChildDocs(
                parentJoinQuery, Sort.RELEVANCE, 0, 0, true);

        if (topgroups == null)
            return parentDocs;

        GroupDocs<Integer>[] groupdocs = topgroups.groups;

        logger.debug("Total groupdocs:" + groupdocs.length);

        for (GroupDocs<Integer> g : groupdocs) {
            Document parentDoc = SearchUtility.getFixSearcher().doc(
                    g.groupValue);
            logger.debug("Parent DocId:" + g.groupValue);
            parentDocs.add(parentDoc);
             }
        return parentDocs;
    }

No comments:

Post a Comment