You don't change the Codec at all just the stored fields implementation, so you 
dont need to give it a new name. The simpliest is to anonymous subclass 
Lucene41Codec without FilterCodec. 

If your codec gets a new name, this name must be regustered in the codec 
manager by adding META-INF files to your JAR and not using anonymous subclasses.



Vitaly Funstein <vfunst...@gmail.com> schrieb:

>Uwe,
>
>I may not be doing this correctly, but I tried to see what would happen
>if
>I were to a reopen an index created with a custom codec that disables
>stored fields compression, and it doesn't seem to work. Here's how I
>configure the writer to disable compression, prior to indexing:
>
>     final StoredFieldsFormat sfFmt = new Lucene40StoredFieldsFormat();
>        idxWriterCfg.setCodec(new
>FilterCodec("DisableStoreFieldCompressionCodec", new Lucene41Codec()) {
>
>          @Override
>          public StoredFieldsFormat storedFieldsFormat() {
>            return sfFmt;
>          }
>
>        });
>      }
>
>However, when an index that was created with this writer configuration
>is
>opened, I get this exception:
>
>Exception in thread "main" java.lang.IllegalArgumentException: A SPI
>class
>of type org.apache.lucene.codecs.Codec with name
>'DisableStoreFieldCompressionCodec' does not exist. You need to add the
>corresponding JAR file supporting this SPI to your classpath.The
>current
>classpath supports the following names: [Lucene40, Lucene3x, Lucene41]
>at
>org.apache.lucene.util.NamedSPILoader.lookup(NamedSPILoader.java:104)
>    at org.apache.lucene.codecs.Codec.forName(Codec.java:95)
>    at org.apache.lucene.index.SegmentInfos.read(SegmentInfos.java:299)
>at org.apache.lucene.index.SegmentInfos$1.doBody(SegmentInfos.java:347)
>    at
>org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:783)
>    at
>org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:630)
>    at org.apache.lucene.index.SegmentInfos.read(SegmentInfos.java:343)
>    at
>org.apache.lucene.index.DirectoryReader.indexExists(DirectoryReader.java:322)
>
>
>I also tried instantiating Lucene40Codec directly to avoid using a
>named
>FilterCodec, but that codec apparently disallows writing to index in
>Lucene
>4.1:
>
>java.lang.UnsupportedOperationException: this codec can only be used
>for
>reading
>    at
>org.apache.lucene.codecs.lucene40.Lucene40PostingsFormat.fieldsConsumer(Lucene40PostingsFormat.java:246)
>    at
>org.apache.lucene.codecs.perfield.PerFieldPostingsFormat$FieldsWriter.addField(PerFieldPostingsFormat.java:130)
>    at
>org.apache.lucene.index.FreqProxTermsWriterPerField.flush(FreqProxTermsWriterPerField.java:336)
>    at
>org.apache.lucene.index.FreqProxTermsWriter.flush(FreqProxTermsWriter.java:85)
>   at org.apache.lucene.index.TermsHash.flush(TermsHash.java:116)    at
>org.apache.lucene.index.DocInverter.flush(DocInverter.java:53)
>    at
>org.apache.lucene.index.DocFieldProcessor.flush(DocFieldProcessor.java:81)
>    at
>org.apache.lucene.index.DocumentsWriterPerThread.flush(DocumentsWriterPerThread.java:487)
>    at
>org.apache.lucene.index.DocumentsWriter.doFlush(DocumentsWriter.java:422)
>    at
>org.apache.lucene.index.DocumentsWriter.flushAllThreads(DocumentsWriter.java:559)
> at org.apache.lucene.index.IndexWriter.getReader(IndexWriter.java:357)
>    at
>org.apache.lucene.index.StandardDirectoryReader.doOpenFromWriter(StandardDirectoryReader.java:270)
>    at
>org.apache.lucene.index.StandardDirectoryReader.doOpenIfChanged(StandardDirectoryReader.java:245)
>    at
>org.apache.lucene.index.StandardDirectoryReader.doOpenIfChanged(StandardDirectoryReader.java:235)
>    at
>org.apache.lucene.index.DirectoryReader.openIfChanged(DirectoryReader.java:169)
>    at
>org.apache.lucene.search.SearcherManager.refreshIfNeeded(SearcherManager.java:118)
>    at
>org.apache.lucene.search.SearcherManager.refreshIfNeeded(SearcherManager.java:58)
>    at
>org.apache.lucene.search.ReferenceManager.doMaybeRefresh(ReferenceManager.java:154)
>    at
>org.apache.lucene.search.ReferenceManager.maybeRefreshBlocking(ReferenceManager.java:233)
>
>What am I doing wrong here?
>
>Thx,
>Vitaly
>
>On Wed, May 15, 2013 at 2:47 PM, Uwe Schindler <u...@thetaphi.de> wrote:
>
>> Yes. You can also force this by using IW.forceMerge(1), unless your
>index
>> is not already consisting of only one segment. Another alternative is
>to
>> use IndexUpgrader, but this one would only merge if there are
>segments
>> created with an older Lucene version. You can change this by
>overriding
>> IndexUpgrader's merge policy to use all segments.
>>
>> You reminded me to open an issue to add the possibility to
>IndexUpgrader
>> to also "upgrade" segments using a different codec configuration, not
>just
>> coming from an older Lucene version (which is possible to do).
>>
>> Uwe
>>
>> -----
>> Uwe Schindler
>> H.-H.-Meier-Allee 63, D-28213 Bremen
>> http://www.thetaphi.de
>> eMail: u...@thetaphi.de
>>
>>
>> > -----Original Message-----
>> > From: Vitaly Funstein [mailto:vfunst...@gmail.com]
>> > Sent: Wednesday, May 15, 2013 11:36 PM
>> > To: java-user@lucene.apache.org
>> > Subject: Re: Toggling compression for stored fields
>> >
>> > Thanks for the quick reply, this is certainly good news. So just to
>> clarify
>> > - doing a manual segment merge is optional when changing codecs,
>> correct? I
>> > mean, I can just restart my application with a new codec config and
>let
>> the
>> > regular, background merging task do the work of eventually
>converting all
>> > the data to the new format?
>> >
>> > On Wed, May 15, 2013 at 2:30 PM, Uwe Schindler <u...@thetaphi.de>
>> > wrote:
>> >
>> > > Hi Vitaly,
>> > >
>> > > what you call an "index" is just a collection (a CompositeReader)
>of
>> > > atomic readers. They can be mixed regarding compression, just
>like you
>> > > could have a MultiReader with different indexes using different
>codecs.
>> > > Every atomic segment of an index can only have one stored fields
>> format.
>> > > Once merging occurs, the uncompressed fields of e.g. an older
>atomic
>> > > segment gets merged into a new segment with compression enabled.
>The
>> > > same can happen in the other direction. The codec is responsible
>for
>> > > encoding the data on disk and this includes the compression. When
>> > > merging segments, the data is uncompressed and recompressed as
>> > needed.
>> > > To improve performance, there are shortcuts to copy the data
>directly
>> > > if the codec does not change while merging.
>> > >
>> > > With Lucene 4.x, you are free to open an IndexWriter with a
>different
>> > > codec configuration and e.g. use IndexUpgrader or do a force
>merge
>> > > manually to merge all "old" segments and "recompress" them to a
>> > > different codec config. This has nothing to do with "reindexing"
>as
>> > > you are just changing the encoding of the exact same data on
>disk.
>> > >
>> > > Uwe
>> > >
>> > > -----
>> > > Uwe Schindler
>> > > H.-H.-Meier-Allee 63, D-28213 Bremen
>> > > http://www.thetaphi.de
>> > > eMail: u...@thetaphi.de
>> > >
>> > >
>> > > > -----Original Message-----
>> > > > From: Vitaly Funstein [mailto:vfunst...@gmail.com]
>> > > > Sent: Wednesday, May 15, 2013 10:38 PM
>> > > > To: java-user@lucene.apache.org
>> > > > Subject: Toggling compression for stored fields
>> > > >
>> > > > Is it possible to have a mix of compressed and uncompressed
>> > > > documents within a single index? That is, can I load an index
>> > > > created with Lucene
>> > > 4.0 into
>> > > > 4.1 and defer the decision of whether or not to use
>> > > > CompressingStoredFieldsFormat until a later time, or even go
>back
>> > > > and
>> > > forth
>> > > > between compressed and uncompressed codecs, if needed? I
>thought at
>> > > > first the answer would be an unequivocal "no", but then how
>would
>> > > > one migrate data from 4.0 to 4.1 without a full reindex?
>> > >
>> > >
>> > >
>---------------------------------------------------------------------
>> > > 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
>>
>>

--
Uwe Schindler
H.-H.-Meier-Allee 63, 28213 Bremen
http://www.thetaphi.de

Reply via email to