Oh well, it's your code so I guess you know what it does.

But I still think you're wrong.

If your list contains 3 searchers at the top of the loop and all 3
need to be reopened then the list will contain 6 searchers at the end
of the loop, and the first 3 will be for readers that you've just
closed.  Hence the already closed exception when you try to use them.


--
Ian.


On Wed, Jan 21, 2009 at 8:24 PM, Amin Mohammed-Coleman <ami...@gmail.com> wrote:
> Hi,
>
> That is what I am doing with the line:
>
> indexSearchers.add(indexSearch);
>
> indexSearchers is an ArrayList that is constructed before the for loop:
>
> List<IndexSearcher> indexSearchers = new ArrayList<IndexSearcher>();
>
>
> I then pass the indexSearchers to :
>
> multiSearcher = new MultiSearcher(indexSearchers.toArray(new IndexSearcher[]
> {}));
>
>
> Cheers
>
> On 21 Jan 2009, at 20:19, Ian Lea wrote:
>
>> I haven't been following this thread, but shouldn't you be replacing
>> the old searcher in your list of searchers rather than just adding the
>> new one on the end?  Could be wrong - I find the names in your code
>> snippet rather confusing.
>>
>>
>> --
>> Ian.
>>
>> On Wed, Jan 21, 2009 at 6:59 PM, Amin Mohammed-Coleman <ami...@gmail.com>
>> wrote:
>>>
>>> Hi
>>> I did the following according to java docs:
>>>
>>> for (IndexSearcher indexSearcher: searchers) {
>>>
>>> IndexReader reader = indexSearcher.getIndexReader();
>>>
>>> IndexReader newReader = reader.reopen();
>>>
>>> if (newReader != reader) {
>>>
>>>  reader.close();
>>>
>>> }
>>>
>>> reader = newReader;
>>>
>>> IndexSearcher indexSearch = new IndexSearcher(reader);
>>>
>>> indexSearchers.add(indexSearch);
>>>
>>> }
>>>
>>>
>>> First search works ok, susequent search result in:
>>>
>>>
>>> org.apache.lucene.store.AlreadyClosedException: this IndexReader is
>>> closed
>>>
>>>
>>>
>>> Cheers
>>>
>>>
>>>
>>> On Wed, Jan 21, 2009 at 1:47 PM, Amin Mohammed-Coleman
>>> <ami...@gmail.com>wrote:
>>>
>>>> Hi
>>>> Will give that a go.
>>>>
>>>> Thanks
>>>>
>>>> Sent from my iPhone
>>>>
>>>> On 21 Jan 2009, at 12:26, "Ganesh" <emailg...@yahoo.co.in> wrote:
>>>>
>>>> I am closing the old reader and it is working fine for me. Refer to
>>>>>
>>>>> IndexReader.Reopen javadoc.
>>>>>
>>>>> ///Below is the code snipper from IndexReader.reopen javadoc
>>>>>
>>>>> IndexReader reader = ...
>>>>> ...
>>>>> IndexReader new = r.reopen();
>>>>> if (new != reader) {
>>>>> ...     // reader was reopened
>>>>> reader.close();  //Old reader is closed.
>>>>> }
>>>>> reader = new;
>>>>>
>>>>> Regards
>>>>> Ganesh
>>>>>
>>>>> ----- Original Message ----- From: "Amin Mohammed-Coleman" <
>>>>> ami...@gmail.com>
>>>>> To: <java-user@lucene.apache.org>
>>>>> Cc: <java-user@lucene.apache.org>
>>>>> Sent: Wednesday, January 21, 2009 1:07 AM
>>>>>
>>>>> Subject: Re: Indexing and Searching Web Application
>>>>>
>>>>>
>>>>> Hi
>>>>>>
>>>>>> Yes I am using the reopen method on indexreader. I am not closing the
>>>>>> old indexer as per Ganesh's instruction. It seems to be working
>>>>>>  correctly
>>>>>> so I presume it's ok not to close.
>>>>>>
>>>>>> Thanks
>>>>>>
>>>>>>
>>>>>> Amin
>>>>>>
>>>>>> On 20 Jan 2009, at 19:27, "Angel, Eric" <ean...@business.com> wrote:
>>>>>>
>>>>>> There's a reopen() method in the IndexReader class.  You can use that.
>>>>>>>
>>>>>>> -----Original Message-----
>>>>>>> From: Amin Mohammed-Coleman [mailto:ami...@gmail.com]
>>>>>>> Sent: Tuesday, January 20, 2009 5:02 AM
>>>>>>> To: java-user@lucene.apache.org
>>>>>>> Subject: Re: Indexing and Searching Web Application
>>>>>>>
>>>>>>> Am I supposed to close the oldIndexReader?  I just tried this and I
>>>>>>>  get
>>>>>>> an
>>>>>>> exception stating that the IndexReader is closed.
>>>>>>>
>>>>>>> Cheers
>>>>>>>
>>>>>>> On Tue, Jan 20, 2009 at 9:33 AM, Ganesh <emailg...@yahoo.co.in>
>>>>>>> wrote:
>>>>>>>
>>>>>>> Reopen the reader, only if it is modified.
>>>>>>>>
>>>>>>>> IndexReader oldIndexReader = indexSearcher.getIndexReader();
>>>>>>>> if (!oldIndexReader.isCurrent()) {
>>>>>>>> IndexReader newIndexReader = oldIndexReader.reOpen();
>>>>>>>> oldIndexReader.close();
>>>>>>>> indexSearcher.close();
>>>>>>>> IndexSearcher indexSearch = new IndexSearcher(newIndexReader);
>>>>>>>> }
>>>>>>>>
>>>>>>>> Regards
>>>>>>>> Ganesh
>>>>>>>>
>>>>>>>> ----- Original Message ----- From: "Amin Mohammed-Coleman" <
>>>>>>>> ami...@gmail.com>
>>>>>>>> To: <java-user@lucene.apache.org>
>>>>>>>> Sent: Tuesday, January 20, 2009 1:38 PM
>>>>>>>> Subject: Re: Indexing and Searching Web Application
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Hi
>>>>>>>>
>>>>>>>>>
>>>>>>>>> After your email I had a look around and came up with the below
>>>>>>>>> solution (I'm not sure if this is the right approach or there is a
>>>>>>>>> performance implication to doing this)
>>>>>>>>>
>>>>>>>>> public Summary[] search(SearchRequest searchRequest) {
>>>>>>>>> List<Summary> summaryList = new ArrayList<Summary>();
>>>>>>>>> StopWatch stopWatch = new StopWatch("searchStopWatch");
>>>>>>>>> stopWatch.start();
>>>>>>>>> MultiSearcher multiSearcher = null;
>>>>>>>>> List<IndexSearcher> newIndexSearchers = new
>>>>>>>>> ArrayList<IndexSearcher>();
>>>>>>>>> try {
>>>>>>>>> for (IndexSearcher indexSearcher: searchers) {
>>>>>>>>> IndexReader indexReader = indexSearcher.getIndexReader().reopen();
>>>>>>>>> IndexSearcher indexSearch = new IndexSearcher(indexReader);
>>>>>>>>> newIndexSearchers.add(indexSearch);
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> multiSearcher = new MultiSearcher(newIndexSearchers.toArray(new
>>>>>>>>> IndexSearcher[] {}));
>>>>>>>>> QueryParser queryParser = new
>>>>>>>>> MultiFieldQueryParser(FieldNameEnum.fieldNameDescriptions(),
>>>>>>>>>
>>>>>>>> analyzer);
>>>>>>>
>>>>>>>> Query query = queryParser.parse(searchRequest.getSearchTerm());
>>>>>>>>>
>>>>>>>>> //TODO: Sort and Filters
>>>>>>>>>
>>>>>>>>> TopDocs topDocs = multiSearcher.search(query, 100);
>>>>>>>>> ScoreDoc[] scoreDocs = topDocs.scoreDocs;
>>>>>>>>> LOGGER.debug("total number of hits for [" + query.toString() + " ]
>>>>>>>>> = " +topDocs.totalHits);
>>>>>>>>>
>>>>>>>>> for (ScoreDoc scoreDoc : scoreDocs) {
>>>>>>>>> final Document doc = multiSearcher.doc(scoreDoc.doc);
>>>>>>>>> float score = scoreDoc.score;
>>>>>>>>> final BaseDocument baseDocument = new BaseDocument(doc, score);
>>>>>>>>> Summary documentSummary = new DocumentSummaryImpl(baseDocument);
>>>>>>>>> summaryList.add(documentSummary);
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> } catch (Exception e) {
>>>>>>>>> throw new IllegalStateException(e);
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> stopWatch.stop();
>>>>>>>>>
>>>>>>>>> LOGGER.debug("total time taken for seach: " +
>>>>>>>>> stopWatch.getTotalTimeMillis() + " ms");
>>>>>>>>> return summaryList.toArray(new Summary[] {});
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> The searchers are configured in spring using which looks like this:
>>>>>>>>>
>>>>>>>>> <bean id="rtfIndexSearcher"
>>>>>>>>> class="org.apache.lucene.search.IndexSearcher" scope="prototype"
>>>>>>>>>
>>>>>>>> lazy-
>>>>>>>
>>>>>>>> init="true" >
>>>>>>>>>
>>>>>>>>> <constructor-arg type="org.apache.lucene.store.Directory"
>>>>>>>>> ref="rtfDirectory"  />
>>>>>>>>> </bean>
>>>>>>>>>
>>>>>>>>> I set the dependencies on the DocumentSearcher class.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Cheers
>>>>>>>>> Amin
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On 19 Jan 2009, at 21:45, Amin Mohammed-Coleman wrote:
>>>>>>>>>
>>>>>>>>> I make a call to my search class which looks like this:
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> public Summary[] search(SearchRequest searchRequest) {
>>>>>>>>>> List<Summary> summaryList = new ArrayList<Summary>();
>>>>>>>>>> StopWatch stopWatch = new StopWatch("searchStopWatch");
>>>>>>>>>> stopWatch.start();
>>>>>>>>>> MultiSearcher multiSearcher = null;
>>>>>>>>>> try {
>>>>>>>>>> multiSearcher = new MultiSearcher(searchers.toArray(new
>>>>>>>>>> IndexSearcher[] {}));
>>>>>>>>>> QueryParser queryParser = new
>>>>>>>>>> MultiFieldQueryParser(FieldNameEnum.fieldNameDescriptions(),
>>>>>>>>>> analyzer);
>>>>>>>>>> Query query = queryParser.parse(searchRequest.getSearchTerm());
>>>>>>>>>>
>>>>>>>>>> //TODO: Sort and Filters
>>>>>>>>>>
>>>>>>>>>> TopDocs topDocs = multiSearcher.search(query, 100);
>>>>>>>>>> ScoreDoc[] scoreDocs = topDocs.scoreDocs;
>>>>>>>>>> LOGGER.debug("total number of hits for [" + query.toString() +
>>>>>>>>>> " ] = " +topDocs.totalHits);
>>>>>>>>>>
>>>>>>>>>> for (ScoreDoc scoreDoc : scoreDocs) {
>>>>>>>>>> final Document doc = multiSearcher.doc(scoreDoc.doc);
>>>>>>>>>> float score = scoreDoc.score;
>>>>>>>>>> final BaseDocument baseDocument = new BaseDocument(doc, score);
>>>>>>>>>> Summary documentSummary = new DocumentSummaryImpl(baseDocument);
>>>>>>>>>> summaryList.add(documentSummary);
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> } catch (Exception e) {
>>>>>>>>>> throw new IllegalStateException(e);
>>>>>>>>>> }
>>>>>>>>>> stopWatch.stop();
>>>>>>>>>>
>>>>>>>>>> LOGGER.debug("total time taken for seach: " +
>>>>>>>>>> stopWatch.getTotalTimeMillis() + " ms");
>>>>>>>>>> return summaryList.toArray(new Summary[] {});
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> Do I need to do this explicitly?
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Cheers
>>>>>>>>>> Amin
>>>>>>>>>>
>>>>>>>>>> On 19 Jan 2009, at 20:48, Greg Shackles wrote:
>>>>>>>>>>
>>>>>>>>>> After you make the commit to the index, are you reloading the
>>>>>>>>>> index
>>>>>>>>>>
>>>>>>>>>>> in the
>>>>>>>>>>> searchers?
>>>>>>>>>>>
>>>>>>>>>>> - Greg
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Mon, Jan 19, 2009 at 3:29 PM, Amin Mohammed-Coleman <
>>>>>>>>>>> ami...@gmail.com
>>>>>>>>>>>
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Hi
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> I have recently worked on developing an application which allows
>>>>>>>>>>>> you to
>>>>>>>>>>>> upload a file (which is indexed so you can search later).  I
>>>>>>>>>>>> have
>>>>>>>>>>>> numerous
>>>>>>>>>>>> tests to show that you can index and search documents (in some
>>>>>>>>>>>> instances
>>>>>>>>>>>> within the same test), however when I perform the operation in
>>>>>>>>>>>>  the
>>>>>>>>>>>> site:
>>>>>>>>>>>>
>>>>>>>>>>>> 1) Upload File and Index
>>>>>>>>>>>> 2) Search
>>>>>>>>>>>>
>>>>>>>>>>>> I don't get any hits.  When I restart the application then if I
>>>>>>>>>>>>
>>>>>>>>>>> make
>>>>>>>
>>>>>>>> another search I can find the results.  It seems as though  indexes
>>>>>>>>>>>>
>>>>>>>>>>>> aren't
>>>>>>>>>>>> being committed when I do the initial upload.  This is  strange.
>>>>>>>>>>>>  I
>>>>>>>>>>>> explicitly call commit in my code when I upload the file.  Has
>>>>>>>>>>>> anyone
>>>>>>>>>>>> experienced this before?
>>>>>>>>>>>>
>>>>>>>>>>>> Any help would be appreciated.
>>>>>>>>>>>>
>>>>>>>>>>>> Kind Regards
>>>>>>>>>>>>
>>>>>>>>>>>> Amin
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>
>>>>>>>> To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
>>>>>>>>>>>>
>>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>>>>>> java-user-h...@lucene.apache.org
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Send instant messages to your online friends
>>>>>>>>
>>>>>>> http://in.messenger.yahoo.com
>>>>>>>
>>>>>>>>
>>>>>>>> ---------------------------------------------------------------------
>>>>>>>> To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
>>>>>>>> For additional commands, e-mail: java-user-h...@lucene.apache.org
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>> ---------------------------------------------------------------------
>>>>>>> To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
>>>>>>> For additional commands, e-mail: java-user-h...@lucene.apache.org
>>>>>>>
>>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
>>>>>> For additional commands, e-mail: java-user-h...@lucene.apache.org
>>>>>>
>>>>>
>>>>> Send instant messages to your online friends
>>>>> http://in.messenger.yahoo.com
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
>>>>> For additional commands, e-mail: java-user-h...@lucene.apache.org
>>>>>
>>>>>
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
>> For additional commands, e-mail: java-user-h...@lucene.apache.org
>>
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org
For additional commands, e-mail: java-user-h...@lucene.apache.org

Reply via email to