ArchiveOrangemail archive

java-user.lucene.apache.org


(List home) (Recent threads) (34 other Apache Lucene lists)

Subscription Options

  • RSS or Atom: Read-only subscription using a browser or aggregator. This is the recommended way if you don't need to send messages to the list. You can learn more about feed syndication and clients here.
  • Conventional: All messages are delivered to your mail address, and you can reply. To subscribe, send an email to the list's subscribe address with "subscribe" in the subject line, or visit the list's homepage here.
  • Moderate traffic list: up to 30 messages per day
  • This list contains about 41,902 messages, beginning Mar 2005
  • 9 messages added yesterday
Report the Spam
This button sends a spam report to the moderator. Please use it sparingly. For other removal requests, read this.
Are you sure? yes no

IndexReader.deleteDocument in Lucene 3.6

Ad
Nikolay Zamosenchuk 1337958472Fri, 25 May 2012 15:07:52 +0000 (UTC)
Hi everyone. We are using IndexReader.deleteDocument(Term) method to
delete documents, since it returns the number of deleted documents.
This is used to be sure that some docs were removed. We must know for
sure if documents were deleted. But in lucene 3.6 this method is final
and can't be overridden in our codebase anymore. Method
IndexWriter.deleteDocument(..) is not final and possibly can be used
in our project, but doesn't return any value so we can't be sure
whether ant documents were deleted. So briefly
IndexReader.deleteDocument(Term) is a final but returns number of
deletions performed and IndexWriter.deleteDocument(..) is not final,
but doesn't return any result. Our functionality requires overriding
and result value.

Can anyone please suggest how to solve this issue? Can simply run term
query before, but it seems to be absolutely inefficient.-- 
Best regards, Nikolay Zamosenchuk
Yonik Seeley 1337964045Fri, 25 May 2012 16:40:45 +0000 (UTC)
On Fri, May 25, 2012 at 5:23 AM, Nikolay Zamosenchuk
 wrote:
> IndexWriter.deleteDocument(..) is not final,
> but doesn't return any result.Deleted terms are buffered for good performance, so at the time of
IndexWriter.deleteDocument(Term) we don't know how many documents
match the term.> Can anyone please suggest how to solve this issue? Can simply run term
> query before, but it seems to be absolutely inefficient.You could switch to an asynchronous design and use a custom query that
keeps track of how many (or which) documents it matched.

-Yonik
http://lucidimagination.com> --
> Best regards, Nikolay Zamosenchuk
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: 
> For additional commands, e-mail: 
>
Edward W. Rouse 1337965683Fri, 25 May 2012 17:08:03 +0000 (UTC)
To ensure deletion I use a while loop with a counter (to prevent an endless
loop if there's a problem)

    Term term = this.createIdTerm(id);
    Int count = 0;
    while(readDocument(indexName, id) != null)
    {
	count++;
      log.debug("deleting document " + id + " from index " + indexName);
      writer.deleteDocuments(term);
      writer.commit();
	if(count > 10) 
	{
	  failed = true;
	  break;
	}
    }
    If(failed) throw DeleteFailedException("Failed to delete document " + id
+ " from index " + indexName);

And readDocument does this:

    IndexReader reader = this.getReader(indexName);
    Document doc = null;
    TermDocs td = reader.termDocs(this.createIdTerm(id));
    if(td.next())
    {
      int d = td.doc();
      doc = reader.document(d);
    }
    this.returnReader(reader);
    return doc;

Because IndexReader.termDocs doesn't return deleted documents, once the
deletion is successful, readDocument returns a null.

I'm not even sure if I need to make the writer.commit() call, but the load
for us is small enough that performance isn't an issue. If performance does
become an issue I might need to tweak this a bit, but it does ensure that a
deletion is successful or it throws an exception.> -----Original Message-----
> From:   On Behalf Of Yonik
> Seeley
> Sent: Friday, May 25, 2012 12:40 PM
> To: 
> Subject: Re: IndexReader.deleteDocument in Lucene 3.6
> 
> On Fri, May 25, 2012 at 5:23 AM, Nikolay Zamosenchuk
>  wrote:
> > IndexWriter.deleteDocument(..) is not final,
> > but doesn't return any result.
> 
> Deleted terms are buffered for good performance, so at the time of
> IndexWriter.deleteDocument(Term) we don't know how many documents
> match the term.
> 
> > Can anyone please suggest how to solve this issue? Can simply run
> term
> > query before, but it seems to be absolutely inefficient.
> 
> You could switch to an asynchronous design and use a custom query that
> keeps track of how many (or which) documents it matched.
> 
> -Yonik
> http://lucidimagination.com
> 
> 
> 
> 
> > --
> > Best regards, Nikolay Zamosenchuk
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: 
> > For additional commands, e-mail: 
> >
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: 
> For additional commands, e-mail: 
Home | About | Privacy