/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System; using System.IO; using TokenStream = Lucene.Net.Analysis.TokenStream; using StringHelper = Lucene.Net.Util.StringHelper; using PhraseQuery = Lucene.Net.Search.PhraseQuery; using SpanQuery = Lucene.Net.Search.Spans.SpanQuery; namespace Lucene.Net.Documents { /// /// /// /// [Serializable] public abstract class AbstractField : IFieldable { protected internal System.String name = "body"; protected internal bool storeTermVector = false; protected internal bool storeOffsetWithTermVector = false; protected internal bool storePositionWithTermVector = false; protected internal bool omitNorms = false; protected internal bool isStored = false; protected internal bool isIndexed = true; protected internal bool isTokenized = true; protected internal bool isBinary = false; protected internal bool lazy = false; protected internal bool omitTermFreqAndPositions = false; protected internal float boost = 1.0f; // the data object for all different kind of field values protected internal System.Object fieldsData = null; // pre-analyzed tokenStream for indexed fields protected internal TokenStream tokenStream; // length/offset for all primitive types protected internal int binaryLength; protected internal int binaryOffset; protected internal AbstractField() { } protected internal AbstractField(System.String name, Field.Store store, Field.Index index, Field.TermVector termVector) { if (name == null) throw new System.NullReferenceException("name cannot be null"); this.name = StringHelper.Intern(name); // field names are interned this.isStored = store.IsStored(); this.isIndexed = index.IsIndexed(); this.isTokenized = index.IsAnalyzed(); this.omitNorms = index.OmitNorms(); this.isBinary = false; SetStoreTermVector(termVector); } /// Returns the boost factor for hits for this field. /// ///

The default value is 1.0. /// ///

Note: this value is not stored directly with the document in the index. /// Documents returned from and /// may thus not have the same value present as when /// this field was indexed. /// ///

/// /// public virtual float Boost { get { return boost; } set { this.boost = value; } } /// Returns the name of the field as an interned string. /// For example "date", "title", "body", ... /// public virtual string Name { get { return name; } } protected internal virtual void SetStoreTermVector(Field.TermVector termVector) { this.storeTermVector = termVector.IsStored(); this.storePositionWithTermVector = termVector.WithPositions(); this.storeOffsetWithTermVector = termVector.WithOffsets(); } /// True iff the value of the field is to be stored in the index for return /// with search hits. It is an error for this to be true if a field is /// Reader-valued. /// public bool IsStored { get { return isStored; } } /// True iff the value of the field is to be indexed, so that it may be /// searched on. /// public bool IsIndexed { get { return isIndexed; } } /// True iff the value of the field should be tokenized as text prior to /// indexing. Un-tokenized fields are indexed as a single word and may not be /// Reader-valued. /// public bool IsTokenized { get { return isTokenized; } } /// True iff the term or terms used to index this field are stored as a term /// vector, available from . /// These methods do not provide access to the original content of the field, /// only to terms used to index it. If the original content must be /// preserved, use the stored attribute instead. /// /// /// /// public bool IsTermVectorStored { get { return storeTermVector; } } /// True iff terms are stored as term vector together with their offsets /// (start and end position in source text). /// public virtual bool IsStoreOffsetWithTermVector { get { return storeOffsetWithTermVector; } } /// True iff terms are stored as term vector together with their token positions. public virtual bool IsStorePositionWithTermVector { get { return storePositionWithTermVector; } } /// True iff the value of the filed is stored as binary public bool IsBinary { get { return isBinary; } } /// Return the raw byte[] for the binary field. Note that /// you must also call and /// to know which range of bytes in this /// returned array belong to the field. /// /// reference to the Field value as byte[]. public virtual byte[] GetBinaryValue() { return GetBinaryValue(null); } public virtual byte[] GetBinaryValue(byte[] result) { if (isBinary || fieldsData is byte[]) return (byte[]) fieldsData; else return null; } /// Returns length of byte[] segment that is used as value, if Field is not binary /// returned value is undefined /// /// length of byte[] segment that represents this Field value public virtual int BinaryLength { get { if (isBinary) { return binaryLength; } return fieldsData is byte[] ? ((byte[]) fieldsData).Length : 0; } } /// Returns offset into byte[] segment that is used as value, if Field is not binary /// returned value is undefined /// /// index of the first character in byte[] segment that represents this Field value public virtual int BinaryOffset { get { return binaryOffset; } } /// True if norms are omitted for this indexed field public virtual bool OmitNorms { get { return omitNorms; } set { this.omitNorms = value; } } /// Expert: /// /// If set, omit term freq, positions and payloads from /// postings for this field. /// ///

NOTE: While this option reduces storage space /// required in the index, it also means any query /// requiring positional information, such as /// or subclasses will /// silently fail to find results. ///

public virtual bool OmitTermFreqAndPositions { set { this.omitTermFreqAndPositions = value; } get { return omitTermFreqAndPositions; } } public virtual bool IsLazy { get { return lazy; } } /// Prints a Field for human consumption. public override System.String ToString() { System.Text.StringBuilder result = new System.Text.StringBuilder(); if (isStored) { result.Append("stored"); } if (isIndexed) { if (result.Length > 0) result.Append(","); result.Append("indexed"); } if (isTokenized) { if (result.Length > 0) result.Append(","); result.Append("tokenized"); } if (storeTermVector) { if (result.Length > 0) result.Append(","); result.Append("termVector"); } if (storeOffsetWithTermVector) { if (result.Length > 0) result.Append(","); result.Append("termVectorOffsets"); } if (storePositionWithTermVector) { if (result.Length > 0) result.Append(","); result.Append("termVectorPosition"); } if (isBinary) { if (result.Length > 0) result.Append(","); result.Append("binary"); } if (omitNorms) { result.Append(",omitNorms"); } if (omitTermFreqAndPositions) { result.Append(",omitTermFreqAndPositions"); } if (lazy) { result.Append(",lazy"); } result.Append('<'); result.Append(name); result.Append(':'); if (fieldsData != null && lazy == false) { result.Append(fieldsData); } result.Append('>'); return result.ToString(); } public abstract TokenStream TokenStreamValue { get; } public abstract TextReader ReaderValue { get; } public abstract string StringValue { get; } } }