lucene-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ian Lea <ian....@gmail.com>
Subject Re: update/re-add an existing document with numeric fields
Date Thu, 10 May 2012 08:20:15 GMT
You can't selectively update fields in docs read from an index, in old
or current versions of lucene.  I think there are some ideas floating
around but nothing usable today as far as I know.  You'll need to
rebuild the whole doc before passing it to writer.updateDocument().


--
Ian.


On Wed, May 9, 2012 at 6:38 PM, Tim Eck <teck@terracottatech.com> wrote:
> Note: I'm bound to lucene 3.0.3 for the context of this question, but
> I would be interested to know if newer versions would help me here.
>
> I have an existing document in my directory that has one regular
> String field and one numeric field. I naively thought I could update
> that document to change the String field with code like this:
>
>  FSDirectory dir = FSDirectory.open(...);
>  IndexWriter writer = new IndexWriter(dir, new
>      StandardAnalyzer(Version.LUCENE_30), MaxFieldLength.UNLIMITED);
>
>  // doc has 2 fields, one String and the other numeric
>  Document doc = new Document();
>  doc.add(new Field("string", "value", Store.YES,
>      Index.ANALYZED_NO_NORMS));
>  NumericField nf = new NumericField("numeric", Field.Store.YES,
>      true);
>  nf.setIntValue(42);
>  doc.add(nf);
>  writer.addDocument(doc);
>  writer.commit();
>
>  // make sure we can query on the numeric field
>  IndexSearcher searcher = new IndexSearcher(dir);
>  TopDocs docs = searcher.search(new TermQuery(new Term("numeric",
>      NumericUtils.intToPrefixCoded(42))), 1);
>  if (docs.totalHits != 1) {
>      throw new AssertionError();
>  }
>  doc = searcher.doc(docs.scoreDocs[0].doc);
>  searcher.close();
>
>  // update document with new value for string field
>  doc.removeField("string");
>  doc.add(new Field("string", "value2", Store.YES,
>      Index.ANALYZED_NO_NORMS));
>  writer.updateDocument(new Term("string", "value"), doc);
>  writer.commit();
>
>  // search again
>  searcher = new IndexSearcher(dir);
>  docs = searcher.search(new TermQuery(new Term("numeric",
>      NumericUtils.intToPrefixCoded(42))), 1);
>  if (docs.totalHits != 1) {
>      throw new AssertionError(docs.totalHits);
>  }
>
>
> That doesn't seem to work however. It seems I need to get the
> NumericField rematerialized in the document passed to
> updateDocument(). I was hoping to avoid that if possible so
> I'm looking for any suggestions someone might offer.
>
>
>
>
>
>
>
>

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


Mime
View raw message