lucene-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Martijn v Groningen <martijn.v.gronin...@gmail.com>
Subject Re: ToParentBlockJoinQuery query loop finitely
Date Fri, 23 Mar 2012 11:30:04 GMT
Hi,

There is an example usage in the package.html.
Something to keep in mind is that this search time join is different than
block join query. The JoinUtil can be used to do join filtering and the
block join is more meant for parent / child search.

Martijn

On 23 March 2012 11:58, Li Li <fancyerii@gmail.com> wrote:

> thank you. is there any the search time join example?
> I can only find a JoinUtil in package org.apache.lucene.search.join and a
> TestJoinUtil in test package.
>
>
> On Fri, Mar 23, 2012 at 6:24 PM, Michael McCandless <
> lucene@mikemccandless.com> wrote:
>
> > I think you're hitting the exception because you passed
> > trackScores=true to ToParentBlockJoinCollector.  If you do that, the
> > ScoreMode cannot be None... I'll update the javadocs to make this
> > clear, and I'll also fix the exception message.
> >
> > I think you're hitting the infinite loop because your parent document
> > is first, not last, in the group.  Try putting the parent (shirt)
> > document last in each case instead...
> >
> > Query-time join is already committed to trunk and 3.x, so it'll be in
> > 3.6.0/4.0.
> >
> > Mike McCandless
> >
> > http://blog.mikemccandless.com
> >
> > On Fri, Mar 23, 2012 at 12:27 AM, Li Li <fancyerii@gmail.com> wrote:
> > > hi all,
> > >    I read these two articles
> > >
> >
> http://blog.mikemccandless.com/2012/01/searching-relational-content-with.html
> > ,
> > >
> >
> http://blog.mikemccandless.com/2012/01/tochildblockjoinquery-in-lucene.htmland
> > > wrote a test program. But it seems there is some problem. it ends with
> > > endless loop.
> > >    Here is my program, almost copy from that article, the only
> > > modification is from BlockJoinQuery to ToParentBlockJoinQuery because I
> > > can't find BlockJoinQuery in latest 4.0 dev trunk source tree.
> > >   another modification is from SocreMode.none to ScoreMode.Avg because
> > > when using SocreMode.None, an exception throws:
> > > Exception in thread "main" java.lang.IllegalStateException: ScoreMode
> is
> > > None
> > >    at
> > >
> >
> org.apache.lucene.search.join.ToParentBlockJoinQuery$BlockJoinScorer.swapChildScores(ToParentBlockJoinQuery.java:270)
> > >    at
> > >
> >
> org.apache.lucene.search.join.ToParentBlockJoinCollector.copyGroups(ToParentBlockJoinCollector.java:251)
> > >     So I change ScoreMode.None to Avg
> > > //        BlockJoinQuery skuJoinQuery = new BlockJoinQuery(skuQuery,
> > shirts,
> > > //                ScoreMode.None);
> > >        ToParentBlockJoinQuery skuJoinQuery = new
> > > ToParentBlockJoinQuery(skuQuery, shirts,
> > >                ScoreMode.Avg);
> > >
> > >
> > >    Then I run again, it ends up with endless loop in BooleanScorer2:
> > >  public void score(Collector collector) throws IOException {
> > >    collector.setScorer(this);
> > >    while ((doc = countingSumScorer.nextDoc()) != NO_MORE_DOCS) {
> > >      collector.collect(doc);
> > >    }
> > >  }
> > >
> > >   current doc is -1, and countingSumScorer.nextDoc() always return -1!
> > > following is my program. btw, what's the status of query time join?
> > what's
> > > the relationship of solr's join and lucene's join?
> > > -------------my codes-------------
> > > public class TestJoin {
> > >
> > >    /**
> > >     * @param args
> > >     * @throws Exception
> > >     */
> > >    public static void main(String[] args) throws Exception {
> > >        File f=new File("./testindex");
> > >        if(!f.exists()){
> > >            f.mkdirs();
> > >        }
> > >        Directory dir=FSDirectory.open(f);
> > >        for(String name:dir.listAll()){
> > >            dir.deleteFile(name);
> > >        }
> > >        IndexWriterConfig conf=new
> IndexWriterConfig(Version.LUCENE_40,new
> > > WhitespaceAnalyzer(Version.LUCENE_40));
> > >        IndexWriter writer=new IndexWriter(dir, conf);
> > >        FieldType fType=new FieldType();
> > >        fType.setIndexed(true);
> > >        fType.setStored(true);
> > >        fType.setIndexOptions(IndexOptions.DOCS_AND_FREQS);
> > >        fType.setTokenized(true);
> > >        Document shirt=new Document();
> > >        shirt.add(new Field("name","three wolf",fType));
> > >        shirt.add(new StringField("type", "shirt"));
> > >        Document sku1=new Document();
> > >        sku1.add(new StringField("size","small"));
> > >        sku1.add(new StringField("color","blue"));
> > >        Document sku2=new Document();
> > >        sku2.add(new StringField("size","small"));
> > >        sku2.add(new StringField("color","black"));
> > >        Document sku3=new Document();
> > >        sku3.add(new StringField("size","medium"));
> > >        sku3.add(new StringField("color","black"));
> > >        Document sku4=new Document();
> > >        sku4.add(new StringField("size","large"));
> > >        sku4.add(new StringField("color","gray"));
> > >        List<Document> shirtGroup=new ArrayList<Document>();
> > >        shirtGroup.add(shirt);
> > >        shirtGroup.add(sku1);
> > >        shirtGroup.add(sku2);
> > >        shirtGroup.add(sku3);
> > >        shirtGroup.add(sku4);
> > >        writer.addDocuments(shirtGroup);
> > >
> > >        shirt=new Document();
> > >        shirt.add(new Field("name","seven wolf",fType));
> > >        shirt.add(new StringField("type", "shirt"));
> > >        sku1=new Document();
> > >        sku1.add(new StringField("size","large"));
> > >        sku1.add(new StringField("color","blue"));
> > >        sku2=new Document();
> > >        sku2.add(new StringField("size","small"));
> > >        sku2.add(new StringField("color","black"));
> > >
> > >        shirtGroup=new ArrayList<Document>();
> > >        shirtGroup.add(shirt);
> > >        shirtGroup.add(sku1);
> > >        shirtGroup.add(sku2);
> > >        writer.addDocuments(shirtGroup);
> > >        writer.close();
> > >
> > >        IndexSearcher searcher=new
> > IndexSearcher(DirectoryReader.open(dir));
> > >        Filter shirts = new CachingWrapperFilter(new QueryWrapperFilter(
> > >                new TermQuery(new Term("type", "shirt"))));
> > >        BooleanQuery skuQuery = new BooleanQuery();
> > >        skuQuery.add(new TermQuery(new Term("size", "small")),
> > Occur.MUST);
> > >        skuQuery.add(new TermQuery(new Term("color", "black")),
> > Occur.MUST);
> > > //        BlockJoinQuery skuJoinQuery = new BlockJoinQuery(skuQuery,
> > shirts,
> > > //                ScoreMode.None);
> > >        ToParentBlockJoinQuery skuJoinQuery = new
> > > ToParentBlockJoinQuery(skuQuery, shirts,
> > >                ScoreMode.Avg);
> > >
> > >        BooleanQuery query = new BooleanQuery();
> > >        query.add(new TermQuery(new Term("name", "wolf")), Occur.MUST);
> > >        query.add(skuJoinQuery, Occur.MUST);
> > >
> > >        ToParentBlockJoinCollector c = new ToParentBlockJoinCollector(
> > >                    Sort.RELEVANCE, // sort
> > >                    10,             // numHits
> > >                    true,           // trackScores
> > >                    false           // trackMaxScore
> > >                    );
> > >        searcher.search(query, c);
> > >
> > >        Sort skuSort=new Sort(new SortField("size",Type.STRING));
> > >        TopGroups hits = c.getTopGroups(skuJoinQuery, skuSort, 0, //
> > offset
> > >                10, // maxDocsPerGroup
> > >                0, // withinGroupOffset
> > >                true // fillSortFields
> > >                );
> > >        System.out.println("totalHitCount: " + hits.totalHitCount);
> > >        System.out.println("totalGroupedHitCount: " +
> > > hits.totalGroupedHitCount);
> > >        for(GroupDocs group:hits.groups){
> > >            System.out.println("totalHits: "+group.totalHits);
> > >            for(ScoreDoc doc:group.scoreDocs){
> > >                System.out.println(doc.doc+", "+doc.score);
> > >            }
> > >        }
> > >    }
> > >
> > > }
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: java-user-unsubscribe@lucene.apache.org
> > For additional commands, e-mail: java-user-help@lucene.apache.org
> >
> >
>



-- 
Met vriendelijke groet,

Martijn van Groningen

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message