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 < luc...@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 <fancye...@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-unsubscr...@lucene.apache.org > For additional commands, e-mail: java-user-h...@lucene.apache.org > >