blob: a1182b894370495c0b9bdeda6fea35be3a8fb566 [file] [log] [blame]
Index: src/java/org/apache/lucene/document/Field.java
===================================================================
--- src/java/org/apache/lucene/document/Field.java (revision 763566)
+++ src/java/org/apache/lucene/document/Field.java (working copy)
@@ -329,6 +329,8 @@
if (index == Index.NO) {
this.isIndexed = false;
this.isTokenized = false;
+ this.omitTermFreqAndPositions = false;
+ this.omitNorms = true;
} else if (index == Index.ANALYZED) {
this.isIndexed = true;
this.isTokenized = true;
@@ -492,6 +494,8 @@
isIndexed = false;
isTokenized = false;
+ omitTermFreqAndPositions = false;
+ omitNorms = true;
isBinary = true;
binaryLength = length;
Index: src/java/org/apache/lucene/index/FieldInfo.java
===================================================================
--- src/java/org/apache/lucene/index/FieldInfo.java (revision 763566)
+++ src/java/org/apache/lucene/index/FieldInfo.java (working copy)
@@ -38,12 +38,21 @@
name = na;
isIndexed = tk;
number = nu;
- this.storeTermVector = storeTermVector;
- this.storeOffsetWithTermVector = storeOffsetWithTermVector;
- this.storePositionWithTermVector = storePositionWithTermVector;
- this.omitNorms = omitNorms;
- this.storePayloads = storePayloads;
- this.omitTermFreqAndPositions = omitTermFreqAndPositions;
+ if (isIndexed) {
+ this.storeTermVector = storeTermVector;
+ this.storeOffsetWithTermVector = storeOffsetWithTermVector;
+ this.storePositionWithTermVector = storePositionWithTermVector;
+ this.storePayloads = storePayloads;
+ this.omitNorms = omitNorms;
+ this.omitTermFreqAndPositions = omitTermFreqAndPositions;
+ } else { // for non-indexed fields, leave defaults
+ this.storeTermVector = false;
+ this.storeOffsetWithTermVector = false;
+ this.storePositionWithTermVector = false;
+ this.storePayloads = false;
+ this.omitNorms = true;
+ this.omitTermFreqAndPositions = false;
+ }
}
public Object clone() {
@@ -56,23 +65,25 @@
if (this.isIndexed != isIndexed) {
this.isIndexed = true; // once indexed, always index
}
- if (this.storeTermVector != storeTermVector) {
- this.storeTermVector = true; // once vector, always vector
+ if (isIndexed) { // if updated field data is not for indexing, leave the updates out
+ if (this.storeTermVector != storeTermVector) {
+ this.storeTermVector = true; // once vector, always vector
+ }
+ if (this.storePositionWithTermVector != storePositionWithTermVector) {
+ this.storePositionWithTermVector = true; // once vector, always vector
+ }
+ if (this.storeOffsetWithTermVector != storeOffsetWithTermVector) {
+ this.storeOffsetWithTermVector = true; // once vector, always vector
+ }
+ if (this.storePayloads != storePayloads) {
+ this.storePayloads = true;
+ }
+ if (this.omitNorms != omitNorms) {
+ this.omitNorms = false; // once norms are stored, always store
+ }
+ if (this.omitTermFreqAndPositions != omitTermFreqAndPositions) {
+ this.omitTermFreqAndPositions = true; // if one require omitTermFreqAndPositions at least once, it remains off for life
+ }
}
- if (this.storePositionWithTermVector != storePositionWithTermVector) {
- this.storePositionWithTermVector = true; // once vector, always vector
- }
- if (this.storeOffsetWithTermVector != storeOffsetWithTermVector) {
- this.storeOffsetWithTermVector = true; // once vector, always vector
- }
- if (this.omitNorms != omitNorms) {
- this.omitNorms = false; // once norms are stored, always store
- }
- if (this.omitTermFreqAndPositions != omitTermFreqAndPositions) {
- this.omitTermFreqAndPositions = true; // if one require omitTermFreqAndPositions at least once, it remains off for life
- }
- if (this.storePayloads != storePayloads) {
- this.storePayloads = true;
- }
}
}
Index: src/java/org/apache/lucene/index/FieldInfos.java
===================================================================
--- src/java/org/apache/lucene/index/FieldInfos.java (revision 763566)
+++ src/java/org/apache/lucene/index/FieldInfos.java (working copy)
@@ -84,7 +84,7 @@
while (fieldIterator.hasNext()) {
Fieldable field = (Fieldable) fieldIterator.next();
add(field.name(), field.isIndexed(), field.isTermVectorStored(), field.isStorePositionWithTermVector(),
- field.isStoreOffsetWithTermVector(), field.getOmitNorms());
+ field.isStoreOffsetWithTermVector(), field.getOmitNorms(), false, field.getOmitTf());
}
}
Index: src/java/org/apache/lucene/index/FieldsReader.java
===================================================================
--- src/java/org/apache/lucene/index/FieldsReader.java (revision 763566)
+++ src/java/org/apache/lucene/index/FieldsReader.java (working copy)
@@ -322,6 +322,7 @@
//skip over the part that we aren't loading
fieldsStream.seek(pointer + toRead);
f.setOmitNorms(fi.omitNorms);
+ f.setOmitTf(fi.omitTermFreqAndPositions);
} else {
int length = fieldsStream.readVInt();
long pointer = fieldsStream.getFilePointer();
@@ -332,6 +333,7 @@
fieldsStream.skipChars(length);
f = new LazyField(fi.name, store, index, termVector, length, pointer, binary);
f.setOmitNorms(fi.omitNorms);
+ f.setOmitTf(fi.omitTermFreqAndPositions);
}
doc.add(f);
}
@@ -365,7 +367,6 @@
doc.add(new Field(fi.name, uncompress(b), Field.Store.COMPRESS));
else
doc.add(new Field(fi.name, b, Field.Store.YES));
-
} else {
Field.Store store = Field.Store.YES;
Field.Index index = getIndexType(fi, tokenize);
@@ -383,6 +384,7 @@
store,
index,
termVector);
+ f.setOmitTf(fi.omitTermFreqAndPositions);
f.setOmitNorms(fi.omitNorms);
} else {
f = new Field(fi.name, // name
@@ -390,6 +392,7 @@
store,
index,
termVector);
+ f.setOmitTf(fi.omitTermFreqAndPositions);
f.setOmitNorms(fi.omitNorms);
}
doc.add(f);
@@ -641,6 +644,7 @@
this.name = fi.name.intern();
this.isIndexed = fi.isIndexed;
this.omitNorms = fi.omitNorms;
+ this.omitTermFreqAndPositions = fi.omitTermFreqAndPositions;
this.storeOffsetWithTermVector = fi.storeOffsetWithTermVector;
this.storePositionWithTermVector = fi.storePositionWithTermVector;
this.storeTermVector = fi.storeTermVector;
Index: src/test/org/apache/lucene/index/DocHelper.java
===================================================================
--- src/test/org/apache/lucene/index/DocHelper.java (revision 763566)
+++ src/test/org/apache/lucene/index/DocHelper.java (working copy)
@@ -64,6 +64,14 @@
public static Field noNormsField = new Field(NO_NORMS_KEY, NO_NORMS_TEXT,
Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS);
+ public static final String NO_TF_TEXT = "analyzed with no tf and positions";
+ public static final String NO_TF_KEY = "omitTermFreqAndPositions";
+ public static Field noTFField = new Field(NO_TF_KEY, NO_TF_TEXT,
+ Field.Store.YES, Field.Index.ANALYZED);
+ static {
+ noTFField.setOmitTermFreqAndPositions(true);
+ }
+
public static final String UNINDEXED_FIELD_TEXT = "unindexed field text";
public static final String UNINDEXED_FIELD_KEY = "unIndField";
public static Field unIndField = new Field(UNINDEXED_FIELD_KEY, UNINDEXED_FIELD_TEXT,
@@ -119,6 +127,7 @@
compressedTextField2,
keyField,
noNormsField,
+ noTFField,
unIndField,
unStoredField1,
unStoredField2,
@@ -139,6 +148,7 @@
public static Map notermvector=new HashMap();
public static Map lazy= new HashMap();
public static Map noNorms=new HashMap();
+ public static Map noTf=new HashMap();
static {
//Initialize the large Lazy Field
@@ -167,6 +177,7 @@
if (f.isStored()) add(stored,f);
else add(unstored,f);
if (f.getOmitNorms()) add(noNorms,f);
+ if (f.getOmitTf()) add(noTf,f);
if (f.isLazy()) add(lazy, f);
}
}
@@ -186,6 +197,7 @@
nameValues.put(TEXT_FIELD_3_KEY, FIELD_3_TEXT);
nameValues.put(KEYWORD_FIELD_KEY, KEYWORD_TEXT);
nameValues.put(NO_NORMS_KEY, NO_NORMS_TEXT);
+ nameValues.put(NO_TF_KEY, NO_TF_TEXT);
nameValues.put(UNINDEXED_FIELD_KEY, UNINDEXED_FIELD_TEXT);
nameValues.put(UNSTORED_FIELD_1_KEY, UNSTORED_1_FIELD_TEXT);
nameValues.put(UNSTORED_FIELD_2_KEY, UNSTORED_2_FIELD_TEXT);
Index: src/test/org/apache/lucene/index/TestDocumentWriter.java
===================================================================
--- src/test/org/apache/lucene/index/TestDocumentWriter.java (revision 763566)
+++ src/test/org/apache/lucene/index/TestDocumentWriter.java (working copy)
@@ -259,14 +259,13 @@
doc.add(new Field("f2", "v1", Store.YES, Index.NOT_ANALYZED, TermVector.WITH_POSITIONS_OFFSETS));
doc.add(new Field("f2", "v2", Store.YES, Index.NOT_ANALYZED, TermVector.NO));
- RAMDirectory ram = new RAMDirectory();
- IndexWriter writer = new IndexWriter(ram, new StandardAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED);
+ IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED);
writer.addDocument(doc);
writer.close();
- _TestUtil.checkIndex(ram);
+ _TestUtil.checkIndex(dir);
- IndexReader reader = IndexReader.open(ram);
+ IndexReader reader = IndexReader.open(dir);
// f1
TermFreqVector tfv1 = reader.getTermFreqVector(0, "f1");
assertNotNull(tfv1);
@@ -276,4 +275,37 @@
assertNotNull(tfv2);
assertEquals("the 'with_tv' setting should rule!",2,tfv2.getTerms().length);
}
+
+ /**
+ * Test adding two fields with the same name, one indexed
+ * the other stored only. The omitNorms and omitTermFreqAndPositions setting
+ * of the stored field should not affect the indexed one (LUCENE-1590)
+ */
+ public void testLUCENE_1590() throws Exception {
+ Document doc = new Document();
+ // f1 has no norms
+ doc.add(new Field("f1", "v1", Store.NO, Index.ANALYZED_NO_NORMS));
+ doc.add(new Field("f1", "v2", Store.YES, Index.NO));
+ // f2 has no TF
+ Field f = new Field("f2", "v1", Store.NO, Index.ANALYZED);
+ f.setOmitTermFreqAndPositions(true);
+ doc.add(f);
+ doc.add(new Field("f2", "v2", Store.YES, Index.NO));
+
+ IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED);
+ writer.addDocument(doc);
+ writer.optimize(); // be sure to have a single segment
+ writer.close();
+
+ _TestUtil.checkIndex(dir);
+
+ SegmentReader reader = (SegmentReader) IndexReader.open(dir);
+ FieldInfos fi = reader.fieldInfos();
+ // f1
+ assertFalse("f1 should have no norms", reader.hasNorms("f1"));
+ assertFalse("omitTermFreqAndPositions field bit should not be set for f1", fi.fieldInfo("f1").omitTermFreqAndPositions);
+ // f2
+ assertTrue("f2 should have norms", reader.hasNorms("f2"));
+ assertTrue("omitTermFreqAndPositions field bit should be set for f2", fi.fieldInfo("f2").omitTermFreqAndPositions);
+ }
}
Index: src/test/org/apache/lucene/index/TestFieldsReader.java
===================================================================
--- src/test/org/apache/lucene/index/TestFieldsReader.java (revision 763566)
+++ src/test/org/apache/lucene/index/TestFieldsReader.java (working copy)
@@ -72,6 +72,7 @@
assertTrue(field.isStoreOffsetWithTermVector() == true);
assertTrue(field.isStorePositionWithTermVector() == true);
assertTrue(field.getOmitNorms() == false);
+ assertTrue(field.getOmitTf() == false);
field = doc.getField(DocHelper.TEXT_FIELD_3_KEY);
assertTrue(field != null);
@@ -79,8 +80,15 @@
assertTrue(field.isStoreOffsetWithTermVector() == false);
assertTrue(field.isStorePositionWithTermVector() == false);
assertTrue(field.getOmitNorms() == true);
+ assertTrue(field.getOmitTf() == false);
-
+ field = doc.getField(DocHelper.NO_TF_KEY);
+ assertTrue(field != null);
+ assertTrue(field.isTermVectorStored() == false);
+ assertTrue(field.isStoreOffsetWithTermVector() == false);
+ assertTrue(field.isStorePositionWithTermVector() == false);
+ assertTrue(field.getOmitNorms() == false);
+ assertTrue(field.getOmitTf() == true);
reader.close();
}