You have to call termDocs.next() after termDocs.seek. Something like termDocs.seek(). if (termDocs.next()) { // means there was a term/doc matching and your references should be valid. }
On Thu, Dec 2, 2010 at 10:22 AM, Lohrenz, Steven <steven.lohr...@hmhpub.com>wrote: > I must be missing something as I'm getting a NPE on the line: docIds[i] = > termDocs.doc(); > here's what I came up with: > > private int[] getDocIdsFromPrimaryKey(SolrQueryRequest req, List<Favorites> > favsBeans) throws ParseException { > // open the core & get data directory > String indexDir = req.getCore().getIndexDir(); > > FSDirectory indexDirectory = null; > try { > indexDirectory = FSDirectory.open(new File(indexDir)); > } catch (IOException e) { > throw new ParseException("IOException, cannot open the index at: > " + indexDir + " " + e.getMessage()); > } > > //String pkQueryString = "resourceId:" + favBean.getResourceId(); > //Query pkQuery = new QueryParser(Version.LUCENE_CURRENT, > "resourceId", new StandardAnalyzer()).parse(pkQueryString); > > IndexSearcher searcher = null; > TopScoreDocCollector collector = null; > IndexReader indexReader = null; > TermDocs termDocs = null; > > try { > searcher = new IndexSearcher(indexDirectory, true); > indexReader = new FilterIndexReader(searcher.getIndexReader()); > termDocs = indexReader.termDocs(); > } catch (IOException e) { > throw new ParseException("IOException, cannot open the index at: > " + indexDir + " " + e.getMessage()); > } > > int[] docIds = new int[favsBeans.size()]; > int i = 0; > for(Favorites favBean: favsBeans) { > Term term = new Term("resourceId", favBean.getResourceId()); > try { > termDocs.seek(term); > docIds[i] = termDocs.doc(); > } catch (IOException e) { > throw new ParseException("IOException, cannot seek to the > primary key " + favBean.getResourceId() + " in : " + indexDir + " " + > e.getMessage()); > } > //ScoreDoc[] hits = collector.topDocs().scoreDocs; > //if(hits != null && hits[0] != null) { > > i++; > //} > } > > Arrays.sort(docIds); > return docIds; > } > > Thanks, > Steve > -----Original Message----- > From: Erick Erickson [mailto:erickerick...@gmail.com] > Sent: 02 December 2010 14:20 > To: solr-user@lucene.apache.org > Subject: Re: Return Lucene DocId in Solr Results > > Ahhh, you're already down in Lucene. That makes things easier... > > See TermDocs. Particularly seek(Term). That'll directly access the indexed > unique key rather than having to form a bunch of queries. > > Best > Erick > > > On Thu, Dec 2, 2010 at 8:59 AM, Lohrenz, Steven > <steven.lohr...@hmhpub.com>wrote: > > > I would be interested in hearing about some ways to improve the > algorithm. > > I have done a very straightforward Lucene query within a loop to get the > > docIds. > > > > Here's what I did to get it working where favsBean are objects returned > > from a query of the second core, but there is probably a better way to do > > it: > > > > private int[] getDocIdsFromPrimaryKey(SolrQueryRequest req, > List<Favorites> > > favsBeans) throws ParseException { > > // open the core & get data directory > > String indexDir = req.getCore().getIndexDir(); > > FSDirectory index = null; > > try { > > index = FSDirectory.open(new File(indexDir)); > > } catch (IOException e) { > > throw new ParseException("IOException, cannot open the index > at: > > " + indexDir + " " + e.getMessage()); > > } > > > > int[] docIds = new int[favsBeans.size()]; > > int i = 0; > > for(Favorites favBean: favsBeans) { > > String pkQueryString = "resourceId:" + > favBean.getResourceId(); > > Query pkQuery = new QueryParser(Version.LUCENE_CURRENT, > > "resourceId", new StandardAnalyzer()).parse(pkQueryString); > > > > IndexSearcher searcher = null; > > TopScoreDocCollector collector = null; > > try { > > searcher = new IndexSearcher(index, true); > > collector = TopScoreDocCollector.create(1, true); > > searcher.search(pkQuery, collector); > > } catch (IOException e) { > > throw new ParseException("IOException, cannot search the > > index at: " + indexDir + " " + e.getMessage()); > > } > > > > ScoreDoc[] hits = collector.topDocs().scoreDocs; > > if(hits != null && hits[0] != null) { > > docIds[i] = hits[0].doc; > > i++; > > } > > } > > > > Arrays.sort(docIds); > > return docIds; > > } > > > > -----Original Message----- > > From: Erick Erickson [mailto:erickerick...@gmail.com] > > Sent: 02 December 2010 13:46 > > To: solr-user@lucene.apache.org > > Subject: Re: Return Lucene DocId in Solr Results > > > > Sounds good, especially because your old scenario was fragile. The doc > IDs > > in > > your first core could change as a result of a single doc deletion and > > optimize. So > > the doc IDs stored in the second core would then be wrong... > > > > Your user-defined unique key is definitely a better way to go. There are > > some tricks > > you could try if there are performance issues.... > > > > Best > > Erick > > > > On Thu, Dec 2, 2010 at 7:47 AM, Lohrenz, Steven > > <steven.lohr...@hmhpub.com>wrote: > > > > > I know the doc ids from one core have nothing to do with the other. I > was > > > going to use the docId returned from the first core in the solr results > > and > > > store it in the second core that way the second core knows about the > doc > > ids > > > from the first core. So when you query the second core from the Filter > in > > > the first core you get returned a set of data that includes the docId > > from > > > the first core that the document relates to. > > > > > > I have backed off from this approach and have a user defined primary > key > > in > > > the firstCore, which is stored as the reference in the secondCore and > > when > > > the filter performs the search it goes off and queries the firstCore > for > > > each primary key and gets the lucene docId from the returned doc. > > > > > > Thanks, > > > Steve > > > > > > -----Original Message----- > > > From: Erick Erickson [mailto:erickerick...@gmail.com] > > > Sent: 02 December 2010 02:19 > > > To: solr-user@lucene.apache.org > > > Subject: Re: Return Lucene DocId in Solr Results > > > > > > On the face of it, this doesn't make sense, so perhaps you can explain > a > > > bit.The doc IDs > > > from one Solr instance have no relation to the doc IDs from another > Solr > > > instance. So anything > > > that uses doc IDs from one Solr instance to create a filter on another > > > instance doesn't seem > > > to be something you'd want to do... > > > > > > Which may just mean I don't understand what you're trying to do. Can > you > > > back up a bit > > > and describe the higher-level problem? This seems like it may be an XY > > > problem, see: > > > http://people.apache.org/~hossman/#xyproblem > > > > > > Best > > > Erick > > > > > > On Tue, Nov 30, 2010 at 6:57 AM, Lohrenz, Steven > > > <steven.lohr...@hmhpub.com>wrote: > > > > > > > Hi, > > > > > > > > I was wondering how I would go about getting the lucene docid > included > > in > > > > the results from a solr query? > > > > > > > > I've built a QueryParser to query another solr instance and and join > > the > > > > results of the two instances through the use of a Filter. The Filter > > > needs > > > > the lucene docid to work. This is the only bit I'm missing right now. > > > > > > > > Thanks, > > > > Steve > > > > > > > > > > > > > >