Hello, I am a Lucene user and have been trying to write a search platform on top of lucene using version 6.6.1. I ran into some weird behavior and wanted to seek opinions from the community. I noticed that norms were being created even when I set *omitNorms=true* in the fieldTypes. I chased the issue and found that the method *getOrAddField* tries to create a *FieldInfo *object in the 1st pass. By default this object has omitNorms to false. The method sets the *indexOptions *as specified in the fieldType on this newly created object but doesn't do the same for *omitNorms.* This effectively overrides this flag which creates issues down the line.
Here's the code snippet for the method with the *fieldInfos.getOrAdd* call private PerField getOrAddField(String name, IndexableFieldType fieldType, boolean invert) { // Make sure we have a PerField allocated final int hashPos = name.hashCode() & hashMask; PerField fp = fieldHash[hashPos]; while (fp != null && !fp.fieldInfo.name.equals(name)) { fp = fp.next; } if (fp == null) { // First time we are seeing this field in this segment *FieldInfo fi = fieldInfos.getOrAdd(name);* // Messy: must set this here because e.g. FreqProxTermsWriterPerField looks at the initial // IndexOptions to decide what arrays it must create). Then, we also must set it in // PerField.invert to allow for later downgrading of the index options: *fi.setIndexOptions(fieldType.indexOptions()*); fp = new PerField(fi, invert); ... The *getOrAdd *method below instantiates a new object with omitNorms set to false as the 4th parameter. /** Create a new field, or return existing one. */ public FieldInfo getOrAdd(String name) { FieldInfo fi = fieldInfo(name); if (fi == null) { // This field wasn't yet added to this in-RAM // segment's FieldInfo, so now we get a global // number for this field. If the field was seen // before then we'll get the same name and number, // else we'll allocate a new one: final int fieldNumber = globalFieldNumbers.addOrGet(name, -1, DocValuesType.NONE, 0, 0); fi = new FieldInfo(name, fieldNumber, false, false, false, IndexOptions.NONE, DocValuesType.NONE, -1, new HashMap<>(), 0, 0); assert !byName.containsKey(fi.name); globalFieldNumbers.verifyConsistent(Integer.valueOf(fi.number), fi.name, DocValuesType.NONE); byName.put(fi.name, fi); } return fi; } I was thinking of opening this as a bug on lucene but would like get some feedback and make sure if I am not missing anything. Thanks in advance. Regards, Ishan