Skip to content

Commit

Permalink
Use BDV or a StoredField based on the Lucene version that has created…
Browse files Browse the repository at this point in the history
… the last

index commit

If the Lucene version was < 9 then use a StringField or else if the
index is fresh or if the index is was built using a version >= 9, then
use a BDV field.
  • Loading branch information
Gautam Worah committed Jul 26, 2021
1 parent d870e9b commit 2ea7f26
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
/** @lucene.experimental */
abstract class Consts {
static final String FULL = "$full_path$";
static final String FULL_BINARY = "$full_path_binary$";
static final String FIELD_PAYLOADS = "$payloads$";
static final String PAYLOAD_PARENT = "p";
static final BytesRef PAYLOAD_PARENT_BYTES_REF = new BytesRef(PAYLOAD_PARENT);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ public FacetLabel getPath(int ordinal) throws IOException {
int readerIndex = ReaderUtil.subIndex(ordinal, indexReader.leaves());
LeafReader leafReader = indexReader.leaves().get(readerIndex).reader();
// TODO: Use LUCENE-9476 to get the bulk lookup API for extracting BinaryDocValues
BinaryDocValues values = leafReader.getBinaryDocValues(Consts.FULL_BINARY);
BinaryDocValues values = leafReader.getBinaryDocValues(Consts.FULL);

FacetLabel ret;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.Version;

/**
* {@link TaxonomyWriter} which uses a {@link Directory} to store the taxonomy information on disk,
Expand Down Expand Up @@ -475,8 +476,20 @@ private int addCategoryDocument(FacetLabel categoryPath, int parent) throws IOEx

String fieldPath = FacetsConfig.pathToString(categoryPath.components, categoryPath.length);
fullPathField.setStringValue(fieldPath);

boolean commitExists = indexWriter.getLiveCommitData().iterator().hasNext();
/* no commits so this is a fresh index, or the old index was built using a Lucene 9 or greater version */
if ((commitExists == false)
|| (SegmentInfos.readLatestCommit(dir)
.getMinSegmentLuceneVersion()
.onOrAfter(Version.LUCENE_9_0_0))) {
/* Lucene 9 introduces BinaryDocValuesField for storing taxonomy categories */
d.add(new BinaryDocValuesField(Consts.FULL, new BytesRef(fieldPath)));
} else {
fullPathField = new StringField(Consts.FULL, fieldPath, Field.Store.YES);
}

d.add(fullPathField);
d.add(new BinaryDocValuesField(Consts.FULL_BINARY, new BytesRef(fieldPath)));

// Note that we do no pass an Analyzer here because the fields that are
// added to the Document are untokenized or contains their own TokenStream.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,8 @@ public class TestBackwardsCompatibility extends LuceneTestCase {
//
// Then move the zip file to your trunk checkout and use it in your test cases

public static final String oldTaxonomyIndexName = "taxonomy.8.6.3-cfs";
public static final String oldTaxonomyIndexName = "taxonomy.8.10.0-cfs";

// LUCENE-9334 requires consistency of field data structures between documents.
// Old taxonomy index had $full_path$ field indexed only with postings,
// It is not allowed to add the same field $full_path$ indexed with BinaryDocValues
// for a new segment, that this test is trying to do.
public void testCreateNewTaxonomy() throws IOException {
createNewTaxonomyIndex(oldTaxonomyIndexName);
}
Expand All @@ -67,8 +63,8 @@ private void createNewTaxonomyIndex(String dirName) throws IOException {

DirectoryTaxonomyWriter writer = new DirectoryTaxonomyWriter(dir);

FacetLabel cp_b = new FacetLabel("b");
writer.addCategory(cp_b);
FacetLabel cp_c = new FacetLabel("c");
writer.addCategory(cp_c);
writer.getInternalIndexWriter().forceMerge(1);
writer.commit();

Expand All @@ -79,10 +75,15 @@ private void createNewTaxonomyIndex(String dirName) throws IOException {
// Just asserting ord1 != TaxonomyReader.INVALID_ORDINAL is not enough to check compatibility
assertNotNull(reader.getPath(ord1));

int ord2 = reader.getOrdinal(cp_b);
int ord2 = reader.getOrdinal(new FacetLabel("b"));
assert ord2 != TaxonomyReader.INVALID_ORDINAL;
// Just asserting ord2 != TaxonomyReader.INVALID_ORDINAL is not enough to check compatibility
assertNotNull(reader.getPath(ord2));

int ord3 = reader.getOrdinal(cp_c);
assert ord3 != TaxonomyReader.INVALID_ORDINAL;
assertNotNull(reader.getPath(ord3));

reader.close();
writer.close();
dir.close();
Expand All @@ -102,6 +103,7 @@ private void createOldTaxonomyIndex(String dirName) throws IOException {
TaxonomyWriter writer = new DirectoryTaxonomyWriter(dir);

writer.addCategory(new FacetLabel("a"));
writer.addCategory(new FacetLabel("b"));
writer.commit();
writer.close();
dir.close();
Expand Down
Binary file not shown.

0 comments on commit 2ea7f26

Please sign in to comment.