Yes, I'm pretty sure you have to index the field (UN_TOKENIZED) to be able
to fetch it with TermDocs/TermEnum! The loop I posted works like this....

for each term in the index for the field
   if  this is one I want to update
        use a TermDocs to get to that document and operate on it.


But this is actually pretty silly. Your loop uses a better approach, except
you're not using TermDocs correctly. Try

    TermDocs tDocs = new IndexReader.TermDocs()
    for (Business biz : updates)
      {
          Term t = new Term("id", biz.getId());
          tDocs.seek(t);
          while (tDocs.next())
          {
              Document doc = reader.document(tDocs.doc());
          }
      }

But TermDocs/TermEnum is looking at terms in the index. If you haven't
indexed the term, you won't find it, so your Field.Index.NO is really
hurting you here.

Best
Erick

On 2/24/07, no spam <[EMAIL PROTECTED]> wrote:

I didn't fully understand your last post and why I wanted to do
IndexReader.terms() then IndexReader.termDocs().  Won't something like
this
work?

        for (Business biz : updates)
        {
            Term t = new Term("id", biz.getId()+"");
            TermDocs tDocs = reader.termDocs(t);

            while (tDocs.next())
            {
                Document doc = reader.document(tDocs.doc());
            }
        }

But tDocs never contains any docs.   Is this because I've indexed my pk
like
this:

doc.add(new Field("id", biz.getId(), Field.Store.YES, Field.Index.NO));

instead of

doc.add(new Field("id", biz.getId(), Field.Store.YES,
Field.Index.UNTOKENIZED));

Mark

On 2/21/07, Erick Erickson <[EMAIL PROTECTED]> wrote:
>
> I think you can get MUCH better efficiency by using TermEnum/TermDocs.
But
> I
> think you need to index (UN_TOKENIZED) your primary key (although now
I'm
> not sure. But I'd be surprised if TermEnum worked with un-indexed data.
> Still, it'd be worth trying but I've always assumed that TermEnums only
> worked on indexed fields....).....
>
> Anyway, your loop looks more like this...
>
> TermEnum terms = IndexReader.terms(new Term("primarykey", ""));
> TermDocs tDocs = IndexRreader.termDocs();
>
> while (terms.next()) {
>    if (docsToUpdate.contains(terms.text()) {
>        tDocs.seek(terms.term());
>        writer.updateDocument(tDocs.doc());
>    }
> }
>
> NOTE: I've been fast and loose with edge conditions, like insuring that
> while (terms.next()) doesn't skip the first term, so caveat emptor....
> This
> loop also assumes that there is one and only one document in your index
> with
> the primary key. Otherwise, you have to do some more work with the
> TermDocs
> class to process each document that has your primary key...
>
> This is similar to creating Lucene filters, which is very fast....
>
> Hope this helps
> Erick
>
>
>
>

Reply via email to