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 <t...@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-unsubscr...@lucene.apache.org For additional commands, e-mail: java-user-h...@lucene.apache.org