public class FacetsPayloadProcessorProvider extends PayloadProcessorProvider
PayloadProcessorProvider
for updating facets ordinal references,
based on an ordinal map. You should use this code in conjunction with merging
taxonomies - after you merge taxonomies, you receive an DirectoryTaxonomyWriter.OrdinalMap
which maps the 'old' payloads to the 'new' ones. You can use that map to
re-map the payloads which contain the facets information (ordinals) either
before or while merging the indexes.
For re-mapping the ordinals before you merge the indexes, do the following:
// merge the old taxonomy with the new one. OrdinalMap map = LuceneTaxonomyWriter.addTaxonomies(); int[] ordmap = map.getMap(); // re-map the ordinals on the old directory. Directory oldDir; FacetsPayloadProcessorProvider fppp = new FacetsPayloadProcessorProvider( oldDir, ordmap); IndexWriterConfig conf = new IndexWriterConfig(VER, ANALYZER); conf.setMergePolicy(new ForceOptimizeMergePolicy()); IndexWriter writer = new IndexWriter(oldDir, conf); writer.setPayloadProcessorProvider(fppp); writer.forceMerge(1); writer.close(); // merge that directory with the new index. IndexWriter newWriter; // opened on the 'new' Directory newWriter.addIndexes(oldDir); newWriter.commit();For re-mapping the ordinals during index merge, do the following:
// merge the old taxonomy with the new one. OrdinalMap map = LuceneTaxonomyWriter.addTaxonomies(); int[] ordmap = map.getMap(); // Add the index and re-map ordinals on the go IndexReader r = IndexReader.open(oldDir); IndexWriterConfig conf = new IndexWriterConfig(VER, ANALYZER); IndexWriter writer = new IndexWriter(newDir, conf); writer.setPayloadProcessorProvider(fppp); writer.addIndexes(r); writer.commit();
NOTE: while the second example looks simpler, IndexWriter may trigger a long merge due to addIndexes. The first example avoids this perhaps unneeded merge, as well as can be done separately (e.g. on another node) before the index is merged.
Modifier and Type | Class and Description |
---|---|
static class |
FacetsPayloadProcessorProvider.FacetsDirPayloadProcessor |
static class |
FacetsPayloadProcessorProvider.FacetsPayloadProcessor
A PayloadProcessor for updating facets ordinal references, based on an ordinal map
|
PayloadProcessorProvider.DirPayloadProcessor, PayloadProcessorProvider.PayloadProcessor, PayloadProcessorProvider.ReaderPayloadProcessor
Constructor and Description |
---|
FacetsPayloadProcessorProvider(Directory dir,
int[] ordinalMap,
FacetIndexingParams indexingParams)
Construct FacetsPayloadProcessorProvider with FacetIndexingParams
|
Modifier and Type | Method and Description |
---|---|
PayloadProcessorProvider.ReaderPayloadProcessor |
getReaderProcessor(IndexReader reader)
Returns a
PayloadProcessorProvider.ReaderPayloadProcessor for the given Directory ,
through which PayloadProcessorProvider.PayloadProcessor s can be obtained for each
Term , or null if none should be used. |
getDirProcessor
public FacetsPayloadProcessorProvider(Directory dir, int[] ordinalMap, FacetIndexingParams indexingParams)
dir
- the Directory
containing the segments to updateordinalMap
- an array mapping previous facets ordinals to new onesindexingParams
- the facets indexing parameterspublic PayloadProcessorProvider.ReaderPayloadProcessor getReaderProcessor(IndexReader reader) throws IOException
PayloadProcessorProvider
PayloadProcessorProvider.ReaderPayloadProcessor
for the given Directory
,
through which PayloadProcessorProvider.PayloadProcessor
s can be obtained for each
Term
, or null
if none should be used.
You should override this method, not PayloadProcessorProvider.getDirProcessor(org.apache.lucene.store.Directory)
.getReaderProcessor
in class PayloadProcessorProvider
IOException