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.ReaderPayloadProcessors can be obtained for each
Term, or null if none should be used. |
getDirProcessorpublic 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
PayloadProcessorProviderPayloadProcessorProvider.ReaderPayloadProcessor for the given Directory,
through which PayloadProcessorProvider.ReaderPayloadProcessors 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 PayloadProcessorProviderIOException