lucene-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Li Li <fancye...@gmail.com>
Subject Re: ToParentBlockJoinQuery query loop finitely
Date Fri, 23 Mar 2012 11:36:13 GMT
that's fine. thank you.

On Fri, Mar 23, 2012 at 7:30 PM, Martijn v Groningen <
martijn.v.groningen@gmail.com> wrote:

> 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