{
  "Lucene.Net.Queries.BooleanFilter.html": {
    "href": "Lucene.Net.Queries.BooleanFilter.html",
    "title": "Class BooleanFilter | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class BooleanFilter A container Lucene.Net.Search.Filter that allows Boolean composition of Lucene.Net.Search.Filter s. Lucene.Net.Search.Filter s are allocated into one of three logical constructs; SHOULD, MUST NOT, MUST The results Lucene.Net.Search.Filter BitSet is constructed as follows: SHOULD Filters are OR'd together The resulting Lucene.Net.Search.Filter is NOT'd with the NOT Lucene.Net.Search.Filter s The resulting Lucene.Net.Search.Filter is AND'd with the MUST Lucene.Net.Search.Filter s Inheritance System.Object Lucene.Net.Search.Filter BooleanFilter Implements System.Collections.Generic.IEnumerable < FilterClause > System.Collections.IEnumerable Inherited Members Filter.NewAnonymous(Func<AtomicReaderContext, IBits, DocIdSet>) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries Assembly : Lucene.Net.Queries.dll Syntax public class BooleanFilter : Filter, IEnumerable<FilterClause>, IEnumerable Properties | Improve this Doc View Source Clauses Gets the list of clauses Declaration public virtual IList<FilterClause> Clauses { get; } Property Value Type Description System.Collections.Generic.IList < FilterClause > Methods | Improve this Doc View Source Add(FilterClause) Adds a new FilterClause to the Boolean Lucene.Net.Search.Filter container Declaration public virtual void Add(FilterClause filterClause) Parameters Type Name Description FilterClause filterClause A FilterClause object containing a Lucene.Net.Search.Filter and an Lucene.Net.Search.Occur parameter | Improve this Doc View Source Add(Filter, Occur) Declaration public void Add(Filter filter, Occur occur) Parameters Type Name Description Lucene.Net.Search.Filter filter Lucene.Net.Search.Occur occur | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object obj) Parameters Type Name Description System.Object obj Returns Type Description System.Boolean Overrides System.Object.Equals(System.Object) | Improve this Doc View Source GetDocIdSet(AtomicReaderContext, IBits) Returns the a Lucene.Net.Search.DocIdSetIterator representing the Boolean composition of the filters that have been added. Declaration public override DocIdSet GetDocIdSet(AtomicReaderContext context, IBits acceptDocs) Parameters Type Name Description Lucene.Net.Index.AtomicReaderContext context Lucene.Net.Util.IBits acceptDocs Returns Type Description Lucene.Net.Search.DocIdSet Overrides Lucene.Net.Search.Filter.GetDocIdSet(Lucene.Net.Index.AtomicReaderContext, Lucene.Net.Util.IBits) | Improve this Doc View Source GetEnumerator() Returns an iterator on the clauses in this query. It implements the System.Collections.Generic.IEnumerable<T> interface to make it possible to do: for (FilterClause clause : booleanFilter) {} Declaration public IEnumerator<FilterClause> GetEnumerator() Returns Type Description System.Collections.Generic.IEnumerator < FilterClause > | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides System.Object.GetHashCode() | Improve this Doc View Source ToString() Prints a user-readable version of this Lucene.Net.Search.Filter . Declaration public override string ToString() Returns Type Description System.String Overrides System.Object.ToString() Explicit Interface Implementations | Improve this Doc View Source IEnumerable.GetEnumerator() Declaration IEnumerator IEnumerable.GetEnumerator() Returns Type Description System.Collections.IEnumerator Implements System.Collections.Generic.IEnumerable<T> System.Collections.IEnumerable"
  },
  "Lucene.Net.Queries.BoostingQuery.html": {
    "href": "Lucene.Net.Queries.BoostingQuery.html",
    "title": "Class BoostingQuery | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class BoostingQuery The BoostingQuery class can be used to effectively demote results that match a given query. Unlike the \"NOT\" clause, this still selects documents that contain undesirable terms, but reduces their overall score: Query balancedQuery = new BoostingQuery(positiveQuery, negativeQuery, 0.01f); In this scenario the positiveQuery contains the mandatory, desirable criteria which is used to select all matching documents, and the negativeQuery contains the undesirable elements which are simply used to lessen the scores. Documents that match the negativeQuery have their score multiplied by the supplied \"boost\" parameter, so this should be less than 1 to achieve a demoting effect This code was originally made available here: [WWW] http://marc.theaimsgroup.com/?l=lucene-user&m=108058407130459&w=2 and is documented here: http://wiki.apache.org/lucene-java/CommunityContributions Inheritance System.Object Lucene.Net.Search.Query BoostingQuery Inherited Members Lucene.Net.Search.Query.Boost Lucene.Net.Search.Query.ToString() Lucene.Net.Search.Query.CreateWeight(Lucene.Net.Search.IndexSearcher) Query.ExtractTerms(ISet<Term>) Lucene.Net.Search.Query.Clone() System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries Assembly : Lucene.Net.Queries.dll Syntax public class BoostingQuery : Query Constructors | Improve this Doc View Source BoostingQuery(Query, Query, Single) Declaration public BoostingQuery(Query match, Query context, float boost) Parameters Type Name Description Lucene.Net.Search.Query match Lucene.Net.Search.Query context System.Single boost Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object obj) Parameters Type Name Description System.Object obj Returns Type Description System.Boolean Overrides Query.Equals(Object) | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides Lucene.Net.Search.Query.GetHashCode() | Improve this Doc View Source Rewrite(IndexReader) Declaration public override Query Rewrite(IndexReader reader) Parameters Type Name Description Lucene.Net.Index.IndexReader reader Returns Type Description Lucene.Net.Search.Query Overrides Lucene.Net.Search.Query.Rewrite(Lucene.Net.Index.IndexReader) | Improve this Doc View Source ToString(String) Declaration public override string ToString(string field) Parameters Type Name Description System.String field Returns Type Description System.String Overrides Query.ToString(String)"
  },
  "Lucene.Net.Queries.ChainedFilter.html": {
    "href": "Lucene.Net.Queries.ChainedFilter.html",
    "title": "Class ChainedFilter | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class ChainedFilter Allows multiple Lucene.Net.Search.Filter s to be chained. Logical operations such as NOT and XOR are applied between filters. One operation can be used for all filters, or a specific operation can be declared for each filter. Order in which filters are called depends on the position of the filter in the chain. It's probably more efficient to place the most restrictive filters/least computationally-intensive filters first. Inheritance System.Object Lucene.Net.Search.Filter ChainedFilter Inherited Members Filter.NewAnonymous(Func<AtomicReaderContext, IBits, DocIdSet>) System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.GetHashCode() System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries Assembly : Lucene.Net.Queries.dll Syntax public class ChainedFilter : Filter Constructors | Improve this Doc View Source ChainedFilter(Filter[]) Ctor. Declaration public ChainedFilter(Filter[] chain) Parameters Type Name Description Lucene.Net.Search.Filter [] chain The chain of filters | Improve this Doc View Source ChainedFilter(Filter[], Int32) Ctor. Declaration public ChainedFilter(Filter[] chain, int logic) Parameters Type Name Description Lucene.Net.Search.Filter [] chain The chain of filters System.Int32 logic Logical operation to apply to ALL filters | Improve this Doc View Source ChainedFilter(Filter[], Int32[]) Ctor. Declaration public ChainedFilter(Filter[] chain, int[] logicArray) Parameters Type Name Description Lucene.Net.Search.Filter [] chain The chain of filters System.Int32 [] logicArray Logical operations to apply between filters Fields | Improve this Doc View Source AND Declaration public const int AND = 1 Field Value Type Description System.Int32 | Improve this Doc View Source ANDNOT Declaration public const int ANDNOT = 2 Field Value Type Description System.Int32 | Improve this Doc View Source DEFAULT Logical operation when none is declared. Defaults to OR. Declaration public const int DEFAULT = 0 Field Value Type Description System.Int32 | Improve this Doc View Source OR Declaration public const int OR = 0 Field Value Type Description System.Int32 | Improve this Doc View Source XOR Declaration public const int XOR = 3 Field Value Type Description System.Int32 Methods | Improve this Doc View Source GetDocIdSet(AtomicReaderContext, IBits) Lucene.Net.Search.Filter.GetDocIdSet(Lucene.Net.Index.AtomicReaderContext, Lucene.Net.Util.IBits) . Declaration public override DocIdSet GetDocIdSet(AtomicReaderContext context, IBits acceptDocs) Parameters Type Name Description Lucene.Net.Index.AtomicReaderContext context Lucene.Net.Util.IBits acceptDocs Returns Type Description Lucene.Net.Search.DocIdSet Overrides Lucene.Net.Search.Filter.GetDocIdSet(Lucene.Net.Index.AtomicReaderContext, Lucene.Net.Util.IBits) | Improve this Doc View Source ToString() Declaration public override string ToString() Returns Type Description System.String Overrides System.Object.ToString()"
  },
  "Lucene.Net.Queries.CommonTermsQuery.html": {
    "href": "Lucene.Net.Queries.CommonTermsQuery.html",
    "title": "Class CommonTermsQuery | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class CommonTermsQuery A query that executes high-frequency terms in a optional sub-query to prevent slow queries due to \"common\" terms like stopwords. This query builds 2 queries off the Add(Term) added terms: low-frequency terms are added to a required boolean clause and high-frequency terms are added to an optional boolean clause. The optional clause is only executed if the required \"low-frequency\" clause matches. Scores produced by this query will be slightly different than plain BooleanQuery scorer mainly due to differences in the Coord(Int32, Int32) number of leaf queries in the required boolean clause. In most cases, high-frequency terms are unlikely to significantly contribute to the document score unless at least one of the low-frequency terms are matched. This query can improve query execution times significantly if applicable. CommonTermsQuery has several advantages over stopword filtering at index or query time since a term can be \"classified\" based on the actual document frequency in the index and can prevent slow queries even across domains without specialized stopword files. Note: if the query only contains high-frequency terms the query is rewritten into a plain conjunction query ie. all high-frequency terms need to match in order to match a document. Collection initializer note: To create and populate a CommonTermsQuery in a single statement, you can use the following example as a guide: var query = new CommonTermsQuery() { new Term(\"field\", \"microsoft\"), new Term(\"field\", \"office\") }; Inheritance System.Object Lucene.Net.Search.Query CommonTermsQuery Implements System.Collections.Generic.IEnumerable < Lucene.Net.Index.Term > System.Collections.IEnumerable Inherited Members Lucene.Net.Search.Query.Boost Lucene.Net.Search.Query.ToString() Lucene.Net.Search.Query.CreateWeight(Lucene.Net.Search.IndexSearcher) Lucene.Net.Search.Query.Clone() System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries Assembly : Lucene.Net.Queries.dll Syntax public class CommonTermsQuery : Query, IEnumerable<Term>, IEnumerable Constructors | Improve this Doc View Source CommonTermsQuery(Occur, Occur, Single) Creates a new CommonTermsQuery Declaration public CommonTermsQuery(Occur highFreqOccur, Occur lowFreqOccur, float maxTermFrequency) Parameters Type Name Description Lucene.Net.Search.Occur highFreqOccur Lucene.Net.Search.Occur used for high frequency terms Lucene.Net.Search.Occur lowFreqOccur Lucene.Net.Search.Occur used for low frequency terms System.Single maxTermFrequency a value in [0..1) (or absolute number >=1) representing the maximum threshold of a terms document frequency to be considered a low frequency term. Exceptions Type Condition System.ArgumentException if MUST_NOT is pass as lowFreqOccur or highFreqOccur | Improve this Doc View Source CommonTermsQuery(Occur, Occur, Single, Boolean) Creates a new CommonTermsQuery Declaration public CommonTermsQuery(Occur highFreqOccur, Occur lowFreqOccur, float maxTermFrequency, bool disableCoord) Parameters Type Name Description Lucene.Net.Search.Occur highFreqOccur Lucene.Net.Search.Occur used for high frequency terms Lucene.Net.Search.Occur lowFreqOccur Lucene.Net.Search.Occur used for low frequency terms System.Single maxTermFrequency a value in [0..1) (or absolute number >=1) representing the maximum threshold of a terms document frequency to be considered a low frequency term. System.Boolean disableCoord disables Coord(Int32, Int32) in scoring for the low / high frequency sub-queries Exceptions Type Condition System.ArgumentException if MUST_NOT is pass as lowFreqOccur or highFreqOccur Fields | Improve this Doc View Source m_disableCoord Declaration protected readonly bool m_disableCoord Field Value Type Description System.Boolean | Improve this Doc View Source m_highFreqBoost Declaration protected float m_highFreqBoost Field Value Type Description System.Single | Improve this Doc View Source m_highFreqMinNrShouldMatch Declaration protected float m_highFreqMinNrShouldMatch Field Value Type Description System.Single | Improve this Doc View Source m_highFreqOccur Declaration protected readonly Occur m_highFreqOccur Field Value Type Description Lucene.Net.Search.Occur | Improve this Doc View Source m_lowFreqBoost Declaration protected float m_lowFreqBoost Field Value Type Description System.Single | Improve this Doc View Source m_lowFreqMinNrShouldMatch Declaration protected float m_lowFreqMinNrShouldMatch Field Value Type Description System.Single | Improve this Doc View Source m_lowFreqOccur Declaration protected readonly Occur m_lowFreqOccur Field Value Type Description Lucene.Net.Search.Occur | Improve this Doc View Source m_maxTermFrequency Declaration protected readonly float m_maxTermFrequency Field Value Type Description System.Single | Improve this Doc View Source m_terms Declaration protected readonly IList<Term> m_terms Field Value Type Description System.Collections.Generic.IList < Lucene.Net.Index.Term > Properties | Improve this Doc View Source HighFreqMinimumNumberShouldMatch Gets or Sets a minimum number of the high frequent optional BooleanClauses which must be satisfied in order to produce a match on the low frequency terms query part. This method accepts a float value in the range [0..1) as a fraction of the actual query terms in the low frequent clause or a number >=1 as an absolut number of clauses that need to match. By default no optional clauses are necessary for a match (unless there are no required clauses). If this method is used, then the specified number of clauses is required. Declaration public virtual float HighFreqMinimumNumberShouldMatch { get; set; } Property Value Type Description System.Single | Improve this Doc View Source IsCoordDisabled Returns true iff Coord(Int32, Int32) is disabled in scoring for the high and low frequency query instance. The top level query will always disable coords. Declaration public virtual bool IsCoordDisabled { get; } Property Value Type Description System.Boolean | Improve this Doc View Source LowFreqMinimumNumberShouldMatch Gets or Sets a minimum number of the low frequent optional BooleanClauses which must be satisfied in order to produce a match on the low frequency terms query part. This method accepts a float value in the range [0..1) as a fraction of the actual query terms in the low frequent clause or a number >=1 as an absolut number of clauses that need to match. By default no optional clauses are necessary for a match (unless there are no required clauses). If this method is used, then the specified number of clauses is required. Declaration public virtual float LowFreqMinimumNumberShouldMatch { get; set; } Property Value Type Description System.Single Methods | Improve this Doc View Source Add(Term) Adds a term to the CommonTermsQuery Declaration public virtual void Add(Term term) Parameters Type Name Description Lucene.Net.Index.Term term the term to add | Improve this Doc View Source BuildQuery(Int32, TermContext[], Term[]) Declaration protected virtual Query BuildQuery(int maxDoc, TermContext[] contextArray, Term[] queryTerms) Parameters Type Name Description System.Int32 maxDoc Lucene.Net.Index.TermContext [] contextArray Lucene.Net.Index.Term [] queryTerms Returns Type Description Lucene.Net.Search.Query | Improve this Doc View Source CalcHighFreqMinimumNumberShouldMatch(Int32) Declaration protected virtual int CalcHighFreqMinimumNumberShouldMatch(int numOptional) Parameters Type Name Description System.Int32 numOptional Returns Type Description System.Int32 | Improve this Doc View Source CalcLowFreqMinimumNumberShouldMatch(Int32) Declaration protected virtual int CalcLowFreqMinimumNumberShouldMatch(int numOptional) Parameters Type Name Description System.Int32 numOptional Returns Type Description System.Int32 | Improve this Doc View Source CollectTermContext(IndexReader, IList<AtomicReaderContext>, TermContext[], Term[]) Declaration public virtual void CollectTermContext(IndexReader reader, IList<AtomicReaderContext> leaves, TermContext[] contextArray, Term[] queryTerms) Parameters Type Name Description Lucene.Net.Index.IndexReader reader System.Collections.Generic.IList < Lucene.Net.Index.AtomicReaderContext > leaves Lucene.Net.Index.TermContext [] contextArray Lucene.Net.Index.Term [] queryTerms | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object obj) Parameters Type Name Description System.Object obj Returns Type Description System.Boolean Overrides Query.Equals(Object) | Improve this Doc View Source ExtractTerms(ISet<Term>) Declaration public override void ExtractTerms(ISet<Term> terms) Parameters Type Name Description System.Collections.Generic.ISet < Lucene.Net.Index.Term > terms Overrides Query.ExtractTerms(ISet<Term>) | Improve this Doc View Source GetEnumerator() Returns an enumerator that iterates through the m_terms collection. Declaration public IEnumerator<Term> GetEnumerator() Returns Type Description System.Collections.Generic.IEnumerator < Lucene.Net.Index.Term > An enumerator that can be used to iterate through the m_terms collection. | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides Lucene.Net.Search.Query.GetHashCode() | Improve this Doc View Source NewTermQuery(Term, TermContext) Builds a new TermQuery instance. This is intended for subclasses that wish to customize the generated queries. Declaration protected virtual Query NewTermQuery(Term term, TermContext context) Parameters Type Name Description Lucene.Net.Index.Term term term Lucene.Net.Index.TermContext context the Lucene.Net.Index.TermContext to be used to create the low level term query. Can be null . Returns Type Description Lucene.Net.Search.Query new TermQuery instance | Improve this Doc View Source Rewrite(IndexReader) Declaration public override Query Rewrite(IndexReader reader) Parameters Type Name Description Lucene.Net.Index.IndexReader reader Returns Type Description Lucene.Net.Search.Query Overrides Lucene.Net.Search.Query.Rewrite(Lucene.Net.Index.IndexReader) | Improve this Doc View Source ToString(String) Declaration public override string ToString(string field) Parameters Type Name Description System.String field Returns Type Description System.String Overrides Query.ToString(String) Explicit Interface Implementations | Improve this Doc View Source IEnumerable.GetEnumerator() Returns an enumerator that iterates through the m_terms collection. Declaration IEnumerator IEnumerable.GetEnumerator() Returns Type Description System.Collections.IEnumerator An enumerator that can be used to iterate through the m_terms collection. Implements System.Collections.Generic.IEnumerable<T> System.Collections.IEnumerable"
  },
  "Lucene.Net.Queries.CustomScoreProvider.html": {
    "href": "Lucene.Net.Queries.CustomScoreProvider.html",
    "title": "Class CustomScoreProvider | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class CustomScoreProvider An instance of this subclass should be returned by GetCustomScoreProvider(AtomicReaderContext) , if you want to modify the custom score calculation of a CustomScoreQuery . Since Lucene 2.9, queries operate on each segment of an index separately, so the protected m_context field can be used to resolve doc IDs, as the supplied doc ID is per-segment and without knowledge of the Lucene.Net.Index.IndexReader you cannot access the document or Lucene.Net.Search.IFieldCache . This is a Lucene.NET EXPERIMENTAL API, use at your own risk @since 2.9.2 Inheritance System.Object CustomScoreProvider Inherited Members System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.GetHashCode() System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) System.Object.ToString() Namespace : Lucene.Net.Queries Assembly : Lucene.Net.Queries.dll Syntax public class CustomScoreProvider Constructors | Improve this Doc View Source CustomScoreProvider(AtomicReaderContext) Creates a new instance of the provider class for the given Lucene.Net.Index.IndexReader . Declaration public CustomScoreProvider(AtomicReaderContext context) Parameters Type Name Description Lucene.Net.Index.AtomicReaderContext context Fields | Improve this Doc View Source m_context Declaration protected readonly AtomicReaderContext m_context Field Value Type Description Lucene.Net.Index.AtomicReaderContext Methods | Improve this Doc View Source CustomExplain(Int32, Explanation, Explanation) Explain the custom score. Whenever overriding CustomScore(Int32, Single, Single) , this method should also be overridden to provide the correct explanation for the part of the custom scoring. Declaration public virtual Explanation CustomExplain(int doc, Explanation subQueryExpl, Explanation valSrcExpl) Parameters Type Name Description System.Int32 doc doc being explained. Lucene.Net.Search.Explanation subQueryExpl explanation for the sub-query part. Lucene.Net.Search.Explanation valSrcExpl explanation for the value source part. Returns Type Description Lucene.Net.Search.Explanation an explanation for the custom score | Improve this Doc View Source CustomExplain(Int32, Explanation, Explanation[]) Explain the custom score. Whenever overriding CustomScore(Int32, Single, Single[]) , this method should also be overridden to provide the correct explanation for the part of the custom scoring. Declaration public virtual Explanation CustomExplain(int doc, Explanation subQueryExpl, Explanation[] valSrcExpls) Parameters Type Name Description System.Int32 doc doc being explained. Lucene.Net.Search.Explanation subQueryExpl explanation for the sub-query part. Lucene.Net.Search.Explanation [] valSrcExpls explanation for the value source part. Returns Type Description Lucene.Net.Search.Explanation an explanation for the custom score | Improve this Doc View Source CustomScore(Int32, Single, Single) Compute a custom score by the subQueryScore and the FunctionQuery score. Subclasses can override this method to modify the custom score. If your custom scoring is different than the default herein you should override at least one of the two CustomScore(Int32, Single, Single) methods. If the number of FunctionQuery s is always < 2 it is sufficient to override this CustomScore(Int32, Single, Single) method, which is simpler. The default computation herein is a multiplication of the two scores: ModifiedScore = subQueryScore * valSrcScore Declaration public virtual float CustomScore(int doc, float subQueryScore, float valSrcScore) Parameters Type Name Description System.Int32 doc id of scored doc. System.Single subQueryScore score of that doc by the subQuery. System.Single valSrcScore score of that doc by the FunctionQuery . Returns Type Description System.Single custom score. | Improve this Doc View Source CustomScore(Int32, Single, Single[]) Compute a custom score by the subQuery score and a number of FunctionQuery scores. Subclasses can override this method to modify the custom score. If your custom scoring is different than the default herein you should override at least one of the two CustomScore(Int32, Single, Single) methods. If the number of FunctionQuery s is always < 2 it is sufficient to override the other CustomScore(Int32, Single, Single) method, which is simpler. The default computation herein is a multiplication of given scores: ModifiedScore = valSrcScore * valSrcScores[0] * valSrcScores[1] * ... Declaration public virtual float CustomScore(int doc, float subQueryScore, float[] valSrcScores) Parameters Type Name Description System.Int32 doc id of scored doc. System.Single subQueryScore score of that doc by the subQuery. System.Single [] valSrcScores scores of that doc by the FunctionQuery . Returns Type Description System.Single custom score."
  },
  "Lucene.Net.Queries.CustomScoreQuery.html": {
    "href": "Lucene.Net.Queries.CustomScoreQuery.html",
    "title": "Class CustomScoreQuery | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class CustomScoreQuery Query that sets document score as a programmatic function of several (sub) scores: the score of its subQuery (any query) (optional) the score of its FunctionQuery (or queries). Subclasses can modify the computation by overriding GetCustomScoreProvider(AtomicReaderContext) . This is a Lucene.NET EXPERIMENTAL API, use at your own risk Inheritance System.Object Lucene.Net.Search.Query CustomScoreQuery Inherited Members Lucene.Net.Search.Query.Boost Lucene.Net.Search.Query.ToString() System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries Assembly : Lucene.Net.Queries.dll Syntax public class CustomScoreQuery : Query Constructors | Improve this Doc View Source CustomScoreQuery(Query) Create a CustomScoreQuery over input subQuery . Declaration public CustomScoreQuery(Query subQuery) Parameters Type Name Description Lucene.Net.Search.Query subQuery the sub query whose scored is being customized. Must not be null . | Improve this Doc View Source CustomScoreQuery(Query, FunctionQuery) Create a CustomScoreQuery over input subQuery and a FunctionQuery . Declaration public CustomScoreQuery(Query subQuery, FunctionQuery scoringQuery) Parameters Type Name Description Lucene.Net.Search.Query subQuery the sub query whose score is being customized. Must not be null . FunctionQuery scoringQuery a value source query whose scores are used in the custom score computation. This parameter is optional - it can be null. | Improve this Doc View Source CustomScoreQuery(Query, FunctionQuery[]) Create a CustomScoreQuery over input subQuery and a FunctionQuery . Declaration public CustomScoreQuery(Query subQuery, params FunctionQuery[] scoringQueries) Parameters Type Name Description Lucene.Net.Search.Query subQuery the sub query whose score is being customized. Must not be null . FunctionQuery [] scoringQueries value source queries whose scores are used in the custom score computation. This parameter is optional - it can be null or even an empty array. Properties | Improve this Doc View Source IsStrict Checks if this is strict custom scoring. In strict custom scoring, the ValueSource part does not participate in weight normalization. This may be useful when one wants full control over how scores are modified, and does not care about normalizing by the ValueSource part. One particular case where this is useful if for testing this query. Note: only has effect when the ValueSource part is not null . Declaration public virtual bool IsStrict { get; set; } Property Value Type Description System.Boolean | Improve this Doc View Source Name A short name of this query, used in ToString(String) . Declaration public virtual string Name { get; } Property Value Type Description System.String | Improve this Doc View Source ScoringQueries The scoring queries that only affect the score of CustomScoreQuery . Declaration public virtual Query[] ScoringQueries { get; } Property Value Type Description Lucene.Net.Search.Query [] | Improve this Doc View Source SubQuery The sub-query that CustomScoreQuery wraps, affecting both the score and which documents match. Declaration public virtual Query SubQuery { get; } Property Value Type Description Lucene.Net.Search.Query Methods | Improve this Doc View Source Clone() Lucene.Net.Search.Query.Clone() Declaration public override object Clone() Returns Type Description System.Object Overrides Lucene.Net.Search.Query.Clone() | Improve this Doc View Source CreateWeight(IndexSearcher) Declaration public override Weight CreateWeight(IndexSearcher searcher) Parameters Type Name Description Lucene.Net.Search.IndexSearcher searcher Returns Type Description Lucene.Net.Search.Weight Overrides Lucene.Net.Search.Query.CreateWeight(Lucene.Net.Search.IndexSearcher) | Improve this Doc View Source Equals(Object) Returns true if o is equal to this. Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides Query.Equals(Object) | Improve this Doc View Source ExtractTerms(ISet<Term>) ExtractTerms(ISet<Term>) Declaration public override void ExtractTerms(ISet<Term> terms) Parameters Type Name Description System.Collections.Generic.ISet < Lucene.Net.Index.Term > terms Overrides Query.ExtractTerms(ISet<Term>) | Improve this Doc View Source GetCustomScoreProvider(AtomicReaderContext) Returns a CustomScoreProvider that calculates the custom scores for the given Lucene.Net.Index.IndexReader . The default implementation returns a default implementation as specified in the docs of CustomScoreProvider . @since 2.9.2 Declaration protected virtual CustomScoreProvider GetCustomScoreProvider(AtomicReaderContext context) Parameters Type Name Description Lucene.Net.Index.AtomicReaderContext context Returns Type Description CustomScoreProvider | Improve this Doc View Source GetHashCode() Returns a hash code value for this object. Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides Lucene.Net.Search.Query.GetHashCode() | Improve this Doc View Source Rewrite(IndexReader) Lucene.Net.Search.Query.Rewrite(Lucene.Net.Index.IndexReader) Declaration public override Query Rewrite(IndexReader reader) Parameters Type Name Description Lucene.Net.Index.IndexReader reader Returns Type Description Lucene.Net.Search.Query Overrides Lucene.Net.Search.Query.Rewrite(Lucene.Net.Index.IndexReader) | Improve this Doc View Source ToString(String) ToString(String) Declaration public override string ToString(string field) Parameters Type Name Description System.String field Returns Type Description System.String Overrides Query.ToString(String)"
  },
  "Lucene.Net.Queries.FilterClause.html": {
    "href": "Lucene.Net.Queries.FilterClause.html",
    "title": "Class FilterClause | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class FilterClause A Lucene.Net.Search.Filter that wrapped with an indication of how that filter is used when composed with another filter. (Follows the boolean logic in BooleanClause for composition of queries.) Inheritance System.Object FilterClause Inherited Members System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries Assembly : Lucene.Net.Queries.dll Syntax public sealed class FilterClause Constructors | Improve this Doc View Source FilterClause(Filter, Occur) Create a new FilterClause Declaration public FilterClause(Filter filter, Occur occur) Parameters Type Name Description Lucene.Net.Search.Filter filter A Lucene.Net.Search.Filter object containing a BitSet Lucene.Net.Search.Occur occur A parameter implementation indicating SHOULD, MUST or MUST NOT Properties | Improve this Doc View Source Filter Returns this FilterClause 's filter Declaration public Filter Filter { get; } Property Value Type Description Lucene.Net.Search.Filter A Lucene.Net.Search.Filter object | Improve this Doc View Source Occur Returns this FilterClause 's occur parameter Declaration public Occur Occur { get; } Property Value Type Description Lucene.Net.Search.Occur An Lucene.Net.Search.Occur object Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides System.Object.Equals(System.Object) | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides System.Object.GetHashCode() | Improve this Doc View Source ToString() Declaration public override string ToString() Returns Type Description System.String Overrides System.Object.ToString()"
  },
  "Lucene.Net.Queries.Function.BoostedQuery.html": {
    "href": "Lucene.Net.Queries.Function.BoostedQuery.html",
    "title": "Class BoostedQuery | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class BoostedQuery Query that is boosted by a ValueSource Inheritance System.Object Lucene.Net.Search.Query BoostedQuery Inherited Members Lucene.Net.Search.Query.Boost Lucene.Net.Search.Query.ToString() Lucene.Net.Search.Query.Clone() System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function Assembly : Lucene.Net.Queries.dll Syntax public class BoostedQuery : Query Constructors | Improve this Doc View Source BoostedQuery(Query, ValueSource) Declaration public BoostedQuery(Query subQuery, ValueSource boostVal) Parameters Type Name Description Lucene.Net.Search.Query subQuery ValueSource boostVal Properties | Improve this Doc View Source Query Declaration public virtual Query Query { get; } Property Value Type Description Lucene.Net.Search.Query | Improve this Doc View Source ValueSource Declaration public virtual ValueSource ValueSource { get; } Property Value Type Description ValueSource Methods | Improve this Doc View Source CreateWeight(IndexSearcher) Declaration public override Weight CreateWeight(IndexSearcher searcher) Parameters Type Name Description Lucene.Net.Search.IndexSearcher searcher Returns Type Description Lucene.Net.Search.Weight Overrides Lucene.Net.Search.Query.CreateWeight(Lucene.Net.Search.IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides Query.Equals(Object) | Improve this Doc View Source ExtractTerms(ISet<Term>) Declaration public override void ExtractTerms(ISet<Term> terms) Parameters Type Name Description System.Collections.Generic.ISet < Lucene.Net.Index.Term > terms Overrides Query.ExtractTerms(ISet<Term>) | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides Lucene.Net.Search.Query.GetHashCode() | Improve this Doc View Source Rewrite(IndexReader) Declaration public override Query Rewrite(IndexReader reader) Parameters Type Name Description Lucene.Net.Index.IndexReader reader Returns Type Description Lucene.Net.Search.Query Overrides Lucene.Net.Search.Query.Rewrite(Lucene.Net.Index.IndexReader) | Improve this Doc View Source ToString(String) Declaration public override string ToString(string field) Parameters Type Name Description System.String field Returns Type Description System.String Overrides Query.ToString(String)"
  },
  "Lucene.Net.Queries.Function.DocValues.BoolDocValues.html": {
    "href": "Lucene.Net.Queries.Function.DocValues.BoolDocValues.html",
    "title": "Class BoolDocValues | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class BoolDocValues Abstract FunctionValues implementation which supports retrieving System.Boolean values. Implementations can control how the System.Boolean values are loaded through BoolVal(Int32) Inheritance System.Object FunctionValues BoolDocValues Inherited Members FunctionValues.BytesVal(Int32, BytesRef) FunctionValues.Exists(Int32) FunctionValues.OrdVal(Int32) FunctionValues.NumOrd FunctionValues.ByteVal(Int32, Byte[]) FunctionValues.Int16Val(Int32, Int16[]) FunctionValues.SingleVal(Int32, Single[]) FunctionValues.Int32Val(Int32, Int32[]) FunctionValues.Int64Val(Int32, Int64[]) FunctionValues.DoubleVal(Int32, Double[]) FunctionValues.StrVal(Int32, String[]) FunctionValues.Explain(Int32) FunctionValues.GetScorer(IndexReader) FunctionValues.GetRangeScorer(IndexReader, String, String, Boolean, Boolean) System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.GetHashCode() System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) System.Object.ToString() Namespace : Lucene.Net.Queries.Function.DocValues Assembly : Lucene.Net.Queries.dll Syntax public abstract class BoolDocValues : FunctionValues Constructors | Improve this Doc View Source BoolDocValues(ValueSource) Declaration protected BoolDocValues(ValueSource vs) Parameters Type Name Description ValueSource vs Fields | Improve this Doc View Source m_vs Declaration protected readonly ValueSource m_vs Field Value Type Description ValueSource Methods | Improve this Doc View Source BoolVal(Int32) Declaration public abstract override bool BoolVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Boolean Overrides FunctionValues.BoolVal(Int32) | Improve this Doc View Source ByteVal(Int32) Declaration public override byte ByteVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Byte Overrides FunctionValues.ByteVal(Int32) | Improve this Doc View Source DoubleVal(Int32) Declaration public override double DoubleVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Double Overrides FunctionValues.DoubleVal(Int32) | Improve this Doc View Source GetValueFiller() Declaration public override FunctionValues.ValueFiller GetValueFiller() Returns Type Description FunctionValues.ValueFiller Overrides FunctionValues.GetValueFiller() | Improve this Doc View Source Int16Val(Int32) NOTE: This was shortVal() in Lucene Declaration public override short Int16Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int16 Overrides FunctionValues.Int16Val(Int32) | Improve this Doc View Source Int32Val(Int32) NOTE: This was intVal() in Lucene Declaration public override int Int32Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int32 Overrides FunctionValues.Int32Val(Int32) | Improve this Doc View Source Int64Val(Int32) NOTE: This was longVal() in Lucene Declaration public override long Int64Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int64 Overrides FunctionValues.Int64Val(Int32) | Improve this Doc View Source ObjectVal(Int32) Declaration public override object ObjectVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Object Overrides FunctionValues.ObjectVal(Int32) | Improve this Doc View Source SingleVal(Int32) NOTE: This was floatVal() in Lucene Declaration public override float SingleVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Single Overrides FunctionValues.SingleVal(Int32) | Improve this Doc View Source StrVal(Int32) Declaration public override string StrVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.String Overrides FunctionValues.StrVal(Int32) | Improve this Doc View Source ToString(Int32) Declaration public override string ToString(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.String Overrides FunctionValues.ToString(Int32)"
  },
  "Lucene.Net.Queries.Function.DocValues.DocTermsIndexDocValues.DocTermsIndexException.html": {
    "href": "Lucene.Net.Queries.Function.DocValues.DocTermsIndexDocValues.DocTermsIndexException.html",
    "title": "Class DocTermsIndexDocValues.DocTermsIndexException | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class DocTermsIndexDocValues.DocTermsIndexException Custom System.Exception to be thrown when the DocTermsIndex for a field cannot be generated Inheritance System.Object System.Exception DocTermsIndexDocValues.DocTermsIndexException Implements System.Runtime.Serialization.ISerializable Inherited Members System.Exception.GetBaseException() System.Exception.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext) System.Exception.GetType() System.Exception.ToString() System.Exception.Data System.Exception.HelpLink System.Exception.HResult System.Exception.InnerException System.Exception.Message System.Exception.Source System.Exception.StackTrace System.Exception.TargetSite System.Exception.SerializeObjectState System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.GetHashCode() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.DocValues Assembly : Lucene.Net.Queries.dll Syntax public sealed class DocTermsIndexException : Exception, ISerializable Constructors | Improve this Doc View Source DocTermsIndexException(String, Exception) Declaration public DocTermsIndexException(string fieldName, Exception cause) Parameters Type Name Description System.String fieldName System.Exception cause Implements System.Runtime.Serialization.ISerializable"
  },
  "Lucene.Net.Queries.Function.DocValues.DocTermsIndexDocValues.html": {
    "href": "Lucene.Net.Queries.Function.DocValues.DocTermsIndexDocValues.html",
    "title": "Class DocTermsIndexDocValues | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class DocTermsIndexDocValues Serves as base class for FunctionValues based on DocTermsIndex. This is a Lucene.NET INTERNAL API, use at your own risk Inheritance System.Object FunctionValues DocTermsIndexDocValues Inherited Members FunctionValues.ByteVal(Int32) FunctionValues.Int16Val(Int32) FunctionValues.SingleVal(Int32) FunctionValues.Int32Val(Int32) FunctionValues.Int64Val(Int32) FunctionValues.DoubleVal(Int32) FunctionValues.ByteVal(Int32, Byte[]) FunctionValues.Int16Val(Int32, Int16[]) FunctionValues.SingleVal(Int32, Single[]) FunctionValues.Int32Val(Int32, Int32[]) FunctionValues.Int64Val(Int32, Int64[]) FunctionValues.DoubleVal(Int32, Double[]) FunctionValues.StrVal(Int32, String[]) FunctionValues.Explain(Int32) FunctionValues.GetScorer(IndexReader) System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.GetHashCode() System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) System.Object.ToString() Namespace : Lucene.Net.Queries.Function.DocValues Assembly : Lucene.Net.Queries.dll Syntax public abstract class DocTermsIndexDocValues : FunctionValues Constructors | Improve this Doc View Source DocTermsIndexDocValues(ValueSource, AtomicReaderContext, String) Declaration protected DocTermsIndexDocValues(ValueSource vs, AtomicReaderContext context, string field) Parameters Type Name Description ValueSource vs Lucene.Net.Index.AtomicReaderContext context System.String field Fields | Improve this Doc View Source m_spare Declaration protected readonly BytesRef m_spare Field Value Type Description Lucene.Net.Util.BytesRef | Improve this Doc View Source m_spareChars Declaration protected readonly CharsRef m_spareChars Field Value Type Description Lucene.Net.Util.CharsRef | Improve this Doc View Source m_termsIndex Declaration protected readonly SortedDocValues m_termsIndex Field Value Type Description Lucene.Net.Index.SortedDocValues | Improve this Doc View Source m_val Declaration protected readonly MutableValueStr m_val Field Value Type Description Lucene.Net.Util.Mutable.MutableValueStr | Improve this Doc View Source m_vs Declaration protected readonly ValueSource m_vs Field Value Type Description ValueSource Properties | Improve this Doc View Source NumOrd Declaration public override int NumOrd { get; } Property Value Type Description System.Int32 Overrides FunctionValues.NumOrd Methods | Improve this Doc View Source BoolVal(Int32) Declaration public override bool BoolVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Boolean Overrides FunctionValues.BoolVal(Int32) | Improve this Doc View Source BytesVal(Int32, BytesRef) Declaration public override bool BytesVal(int doc, BytesRef target) Parameters Type Name Description System.Int32 doc Lucene.Net.Util.BytesRef target Returns Type Description System.Boolean Overrides FunctionValues.BytesVal(Int32, BytesRef) | Improve this Doc View Source Exists(Int32) Declaration public override bool Exists(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Boolean Overrides FunctionValues.Exists(Int32) | Improve this Doc View Source GetRangeScorer(IndexReader, String, String, Boolean, Boolean) Declaration public override ValueSourceScorer GetRangeScorer(IndexReader reader, string lowerVal, string upperVal, bool includeLower, bool includeUpper) Parameters Type Name Description Lucene.Net.Index.IndexReader reader System.String lowerVal System.String upperVal System.Boolean includeLower System.Boolean includeUpper Returns Type Description ValueSourceScorer Overrides FunctionValues.GetRangeScorer(IndexReader, String, String, Boolean, Boolean) | Improve this Doc View Source GetValueFiller() Declaration public override FunctionValues.ValueFiller GetValueFiller() Returns Type Description FunctionValues.ValueFiller Overrides FunctionValues.GetValueFiller() | Improve this Doc View Source ObjectVal(Int32) Declaration public abstract override object ObjectVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Object Overrides FunctionValues.ObjectVal(Int32) | Improve this Doc View Source OrdVal(Int32) Declaration public override int OrdVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int32 Overrides FunctionValues.OrdVal(Int32) | Improve this Doc View Source StrVal(Int32) Declaration public override string StrVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.String Overrides FunctionValues.StrVal(Int32) | Improve this Doc View Source ToString(Int32) Declaration public override string ToString(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.String Overrides FunctionValues.ToString(Int32) | Improve this Doc View Source ToTerm(String) Declaration protected abstract string ToTerm(string readableValue) Parameters Type Name Description System.String readableValue Returns Type Description System.String"
  },
  "Lucene.Net.Queries.Function.DocValues.DoubleDocValues.html": {
    "href": "Lucene.Net.Queries.Function.DocValues.DoubleDocValues.html",
    "title": "Class DoubleDocValues | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class DoubleDocValues Abstract FunctionValues implementation which supports retrieving System.Double values. Implementations can control how the System.Double values are loaded through DoubleVal(Int32) Inheritance System.Object FunctionValues DoubleDocValues Inherited Members FunctionValues.BytesVal(Int32, BytesRef) FunctionValues.Exists(Int32) FunctionValues.OrdVal(Int32) FunctionValues.NumOrd FunctionValues.ByteVal(Int32, Byte[]) FunctionValues.Int16Val(Int32, Int16[]) FunctionValues.SingleVal(Int32, Single[]) FunctionValues.Int32Val(Int32, Int32[]) FunctionValues.Int64Val(Int32, Int64[]) FunctionValues.DoubleVal(Int32, Double[]) FunctionValues.StrVal(Int32, String[]) FunctionValues.Explain(Int32) FunctionValues.GetScorer(IndexReader) System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.GetHashCode() System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) System.Object.ToString() Namespace : Lucene.Net.Queries.Function.DocValues Assembly : Lucene.Net.Queries.dll Syntax public abstract class DoubleDocValues : FunctionValues Constructors | Improve this Doc View Source DoubleDocValues(ValueSource) Declaration protected DoubleDocValues(ValueSource vs) Parameters Type Name Description ValueSource vs Fields | Improve this Doc View Source m_vs Declaration protected readonly ValueSource m_vs Field Value Type Description ValueSource Methods | Improve this Doc View Source BoolVal(Int32) Declaration public override bool BoolVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Boolean Overrides FunctionValues.BoolVal(Int32) | Improve this Doc View Source ByteVal(Int32) Declaration public override byte ByteVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Byte Overrides FunctionValues.ByteVal(Int32) | Improve this Doc View Source DoubleVal(Int32) Declaration public abstract override double DoubleVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Double Overrides FunctionValues.DoubleVal(Int32) | Improve this Doc View Source GetRangeScorer(IndexReader, String, String, Boolean, Boolean) Declaration public override ValueSourceScorer GetRangeScorer(IndexReader reader, string lowerVal, string upperVal, bool includeLower, bool includeUpper) Parameters Type Name Description Lucene.Net.Index.IndexReader reader System.String lowerVal System.String upperVal System.Boolean includeLower System.Boolean includeUpper Returns Type Description ValueSourceScorer Overrides FunctionValues.GetRangeScorer(IndexReader, String, String, Boolean, Boolean) | Improve this Doc View Source GetValueFiller() Declaration public override FunctionValues.ValueFiller GetValueFiller() Returns Type Description FunctionValues.ValueFiller Overrides FunctionValues.GetValueFiller() | Improve this Doc View Source Int16Val(Int32) NOTE: This was shortVal() in Lucene Declaration public override short Int16Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int16 Overrides FunctionValues.Int16Val(Int32) | Improve this Doc View Source Int32Val(Int32) NOTE: This was intVal() in Lucene Declaration public override int Int32Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int32 Overrides FunctionValues.Int32Val(Int32) | Improve this Doc View Source Int64Val(Int32) NOTE: This was longVal() in Lucene Declaration public override long Int64Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int64 Overrides FunctionValues.Int64Val(Int32) | Improve this Doc View Source ObjectVal(Int32) Declaration public override object ObjectVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Object Overrides FunctionValues.ObjectVal(Int32) | Improve this Doc View Source SingleVal(Int32) NOTE: This was floatVal() in Lucene Declaration public override float SingleVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Single Overrides FunctionValues.SingleVal(Int32) | Improve this Doc View Source StrVal(Int32) Declaration public override string StrVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.String Overrides FunctionValues.StrVal(Int32) | Improve this Doc View Source ToString(Int32) Declaration public override string ToString(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.String Overrides FunctionValues.ToString(Int32)"
  },
  "Lucene.Net.Queries.Function.DocValues.html": {
    "href": "Lucene.Net.Queries.Function.DocValues.html",
    "title": "Namespace Lucene.Net.Queries.Function.DocValues | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Namespace Lucene.Net.Queries.Function.DocValues <!-- 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. --> FunctionValues for different data types. Classes BoolDocValues Abstract FunctionValues implementation which supports retrieving System.Boolean values. Implementations can control how the System.Boolean values are loaded through BoolVal(Int32) DocTermsIndexDocValues Serves as base class for FunctionValues based on DocTermsIndex. This is a Lucene.NET INTERNAL API, use at your own risk DocTermsIndexDocValues.DocTermsIndexException Custom System.Exception to be thrown when the DocTermsIndex for a field cannot be generated DoubleDocValues Abstract FunctionValues implementation which supports retrieving System.Double values. Implementations can control how the System.Double values are loaded through DoubleVal(Int32) Int32DocValues Abstract FunctionValues implementation which supports retrieving System.Int32 values. Implementations can control how the System.Int32 values are loaded through Int32Val(Int32) NOTE: This was IntDocValues in Lucene Int64DocValues Abstract FunctionValues implementation which supports retrieving System.Int64 values. Implementations can control how the System.Int64 values are loaded through Int64Val(Int32) NOTE: This was LongDocValues in Lucene SingleDocValues Abstract FunctionValues implementation which supports retrieving System.Single values. Implementations can control how the System.Single values are loaded through SingleVal(Int32) NOTE: This was FloatDocValues in Lucene StrDocValues Abstract FunctionValues implementation which supports retrieving System.String values. Implementations can control how the System.String values are loaded through StrVal(Int32)"
  },
  "Lucene.Net.Queries.Function.DocValues.Int32DocValues.html": {
    "href": "Lucene.Net.Queries.Function.DocValues.Int32DocValues.html",
    "title": "Class Int32DocValues | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class Int32DocValues Abstract FunctionValues implementation which supports retrieving System.Int32 values. Implementations can control how the System.Int32 values are loaded through Int32Val(Int32) NOTE: This was IntDocValues in Lucene Inheritance System.Object FunctionValues Int32DocValues Inherited Members FunctionValues.BoolVal(Int32) FunctionValues.BytesVal(Int32, BytesRef) FunctionValues.Exists(Int32) FunctionValues.OrdVal(Int32) FunctionValues.NumOrd FunctionValues.ByteVal(Int32, Byte[]) FunctionValues.Int16Val(Int32, Int16[]) FunctionValues.SingleVal(Int32, Single[]) FunctionValues.Int32Val(Int32, Int32[]) FunctionValues.Int64Val(Int32, Int64[]) FunctionValues.DoubleVal(Int32, Double[]) FunctionValues.StrVal(Int32, String[]) FunctionValues.Explain(Int32) FunctionValues.GetScorer(IndexReader) System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.GetHashCode() System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) System.Object.ToString() Namespace : Lucene.Net.Queries.Function.DocValues Assembly : Lucene.Net.Queries.dll Syntax public abstract class Int32DocValues : FunctionValues Constructors | Improve this Doc View Source Int32DocValues(ValueSource) Declaration protected Int32DocValues(ValueSource vs) Parameters Type Name Description ValueSource vs Fields | Improve this Doc View Source m_vs Declaration protected readonly ValueSource m_vs Field Value Type Description ValueSource Methods | Improve this Doc View Source ByteVal(Int32) Declaration public override byte ByteVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Byte Overrides FunctionValues.ByteVal(Int32) | Improve this Doc View Source DoubleVal(Int32) Declaration public override double DoubleVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Double Overrides FunctionValues.DoubleVal(Int32) | Improve this Doc View Source GetRangeScorer(IndexReader, String, String, Boolean, Boolean) Declaration public override ValueSourceScorer GetRangeScorer(IndexReader reader, string lowerVal, string upperVal, bool includeLower, bool includeUpper) Parameters Type Name Description Lucene.Net.Index.IndexReader reader System.String lowerVal System.String upperVal System.Boolean includeLower System.Boolean includeUpper Returns Type Description ValueSourceScorer Overrides FunctionValues.GetRangeScorer(IndexReader, String, String, Boolean, Boolean) | Improve this Doc View Source GetValueFiller() Declaration public override FunctionValues.ValueFiller GetValueFiller() Returns Type Description FunctionValues.ValueFiller Overrides FunctionValues.GetValueFiller() | Improve this Doc View Source Int16Val(Int32) NOTE: This was shortVal() in Lucene Declaration public override short Int16Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int16 Overrides FunctionValues.Int16Val(Int32) | Improve this Doc View Source Int32Val(Int32) NOTE: This was intVal() in Lucene Declaration public abstract override int Int32Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int32 Overrides FunctionValues.Int32Val(Int32) | Improve this Doc View Source Int64Val(Int32) NOTE: This was longVal() in Lucene Declaration public override long Int64Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int64 Overrides FunctionValues.Int64Val(Int32) | Improve this Doc View Source ObjectVal(Int32) Declaration public override object ObjectVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Object Overrides FunctionValues.ObjectVal(Int32) | Improve this Doc View Source SingleVal(Int32) NOTE: This was floatVal() in Lucene Declaration public override float SingleVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Single Overrides FunctionValues.SingleVal(Int32) | Improve this Doc View Source StrVal(Int32) Declaration public override string StrVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.String Overrides FunctionValues.StrVal(Int32) | Improve this Doc View Source ToString(Int32) Declaration public override string ToString(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.String Overrides FunctionValues.ToString(Int32)"
  },
  "Lucene.Net.Queries.Function.DocValues.Int64DocValues.html": {
    "href": "Lucene.Net.Queries.Function.DocValues.Int64DocValues.html",
    "title": "Class Int64DocValues | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class Int64DocValues Abstract FunctionValues implementation which supports retrieving System.Int64 values. Implementations can control how the System.Int64 values are loaded through Int64Val(Int32) NOTE: This was LongDocValues in Lucene Inheritance System.Object FunctionValues Int64DocValues Inherited Members FunctionValues.BytesVal(Int32, BytesRef) FunctionValues.Exists(Int32) FunctionValues.OrdVal(Int32) FunctionValues.NumOrd FunctionValues.ByteVal(Int32, Byte[]) FunctionValues.Int16Val(Int32, Int16[]) FunctionValues.SingleVal(Int32, Single[]) FunctionValues.Int32Val(Int32, Int32[]) FunctionValues.Int64Val(Int32, Int64[]) FunctionValues.DoubleVal(Int32, Double[]) FunctionValues.StrVal(Int32, String[]) FunctionValues.Explain(Int32) FunctionValues.GetScorer(IndexReader) System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.GetHashCode() System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) System.Object.ToString() Namespace : Lucene.Net.Queries.Function.DocValues Assembly : Lucene.Net.Queries.dll Syntax public abstract class Int64DocValues : FunctionValues Constructors | Improve this Doc View Source Int64DocValues(ValueSource) Declaration protected Int64DocValues(ValueSource vs) Parameters Type Name Description ValueSource vs Fields | Improve this Doc View Source m_vs Declaration protected readonly ValueSource m_vs Field Value Type Description ValueSource Methods | Improve this Doc View Source BoolVal(Int32) Declaration public override bool BoolVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Boolean Overrides FunctionValues.BoolVal(Int32) | Improve this Doc View Source ByteVal(Int32) Declaration public override byte ByteVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Byte Overrides FunctionValues.ByteVal(Int32) | Improve this Doc View Source DoubleVal(Int32) Declaration public override double DoubleVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Double Overrides FunctionValues.DoubleVal(Int32) | Improve this Doc View Source ExternalToInt64(String) NOTE: This was externalToLong() in Lucene Declaration protected virtual long ExternalToInt64(string extVal) Parameters Type Name Description System.String extVal Returns Type Description System.Int64 | Improve this Doc View Source GetRangeScorer(IndexReader, String, String, Boolean, Boolean) Declaration public override ValueSourceScorer GetRangeScorer(IndexReader reader, string lowerVal, string upperVal, bool includeLower, bool includeUpper) Parameters Type Name Description Lucene.Net.Index.IndexReader reader System.String lowerVal System.String upperVal System.Boolean includeLower System.Boolean includeUpper Returns Type Description ValueSourceScorer Overrides FunctionValues.GetRangeScorer(IndexReader, String, String, Boolean, Boolean) | Improve this Doc View Source GetValueFiller() Declaration public override FunctionValues.ValueFiller GetValueFiller() Returns Type Description FunctionValues.ValueFiller Overrides FunctionValues.GetValueFiller() | Improve this Doc View Source Int16Val(Int32) NOTE: This was shortVal() in Lucene Declaration public override short Int16Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int16 Overrides FunctionValues.Int16Val(Int32) | Improve this Doc View Source Int32Val(Int32) NOTE: This was intVal() in Lucene Declaration public override int Int32Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int32 Overrides FunctionValues.Int32Val(Int32) | Improve this Doc View Source Int64Val(Int32) Declaration public abstract override long Int64Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int64 Overrides FunctionValues.Int64Val(Int32) | Improve this Doc View Source ObjectVal(Int32) Declaration public override object ObjectVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Object Overrides FunctionValues.ObjectVal(Int32) | Improve this Doc View Source SingleVal(Int32) NOTE: This was floatVal() in Lucene Declaration public override float SingleVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Single Overrides FunctionValues.SingleVal(Int32) | Improve this Doc View Source StrVal(Int32) Declaration public override string StrVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.String Overrides FunctionValues.StrVal(Int32) | Improve this Doc View Source ToString(Int32) Declaration public override string ToString(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.String Overrides FunctionValues.ToString(Int32)"
  },
  "Lucene.Net.Queries.Function.DocValues.SingleDocValues.html": {
    "href": "Lucene.Net.Queries.Function.DocValues.SingleDocValues.html",
    "title": "Class SingleDocValues | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class SingleDocValues Abstract FunctionValues implementation which supports retrieving System.Single values. Implementations can control how the System.Single values are loaded through SingleVal(Int32) NOTE: This was FloatDocValues in Lucene Inheritance System.Object FunctionValues SingleDocValues Inherited Members FunctionValues.BoolVal(Int32) FunctionValues.BytesVal(Int32, BytesRef) FunctionValues.Exists(Int32) FunctionValues.OrdVal(Int32) FunctionValues.NumOrd FunctionValues.ByteVal(Int32, Byte[]) FunctionValues.Int16Val(Int32, Int16[]) FunctionValues.SingleVal(Int32, Single[]) FunctionValues.Int32Val(Int32, Int32[]) FunctionValues.Int64Val(Int32, Int64[]) FunctionValues.DoubleVal(Int32, Double[]) FunctionValues.StrVal(Int32, String[]) FunctionValues.Explain(Int32) FunctionValues.GetScorer(IndexReader) FunctionValues.GetRangeScorer(IndexReader, String, String, Boolean, Boolean) System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.GetHashCode() System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) System.Object.ToString() Namespace : Lucene.Net.Queries.Function.DocValues Assembly : Lucene.Net.Queries.dll Syntax public abstract class SingleDocValues : FunctionValues Constructors | Improve this Doc View Source SingleDocValues(ValueSource) Declaration protected SingleDocValues(ValueSource vs) Parameters Type Name Description ValueSource vs Fields | Improve this Doc View Source m_vs Declaration protected readonly ValueSource m_vs Field Value Type Description ValueSource Methods | Improve this Doc View Source ByteVal(Int32) Declaration public override byte ByteVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Byte Overrides FunctionValues.ByteVal(Int32) | Improve this Doc View Source DoubleVal(Int32) Declaration public override double DoubleVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Double Overrides FunctionValues.DoubleVal(Int32) | Improve this Doc View Source GetValueFiller() Declaration public override FunctionValues.ValueFiller GetValueFiller() Returns Type Description FunctionValues.ValueFiller Overrides FunctionValues.GetValueFiller() | Improve this Doc View Source Int16Val(Int32) NOTE: This was shortVal() in Lucene Declaration public override short Int16Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int16 Overrides FunctionValues.Int16Val(Int32) | Improve this Doc View Source Int32Val(Int32) NOTE: This was intVal() in Lucene Declaration public override int Int32Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int32 Overrides FunctionValues.Int32Val(Int32) | Improve this Doc View Source Int64Val(Int32) NOTE: This was longVal() in Lucene Declaration public override long Int64Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int64 Overrides FunctionValues.Int64Val(Int32) | Improve this Doc View Source ObjectVal(Int32) Declaration public override object ObjectVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Object Overrides FunctionValues.ObjectVal(Int32) | Improve this Doc View Source SingleVal(Int32) NOTE: This was floatVal() in Lucene Declaration public abstract override float SingleVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Single Overrides FunctionValues.SingleVal(Int32) | Improve this Doc View Source StrVal(Int32) Declaration public override string StrVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.String Overrides FunctionValues.StrVal(Int32) | Improve this Doc View Source ToString(Int32) Declaration public override string ToString(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.String Overrides FunctionValues.ToString(Int32)"
  },
  "Lucene.Net.Queries.Function.DocValues.StrDocValues.html": {
    "href": "Lucene.Net.Queries.Function.DocValues.StrDocValues.html",
    "title": "Class StrDocValues | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class StrDocValues Abstract FunctionValues implementation which supports retrieving System.String values. Implementations can control how the System.String values are loaded through StrVal(Int32) Inheritance System.Object FunctionValues StrDocValues Inherited Members FunctionValues.ByteVal(Int32) FunctionValues.Int16Val(Int32) FunctionValues.SingleVal(Int32) FunctionValues.Int32Val(Int32) FunctionValues.Int64Val(Int32) FunctionValues.DoubleVal(Int32) FunctionValues.BytesVal(Int32, BytesRef) FunctionValues.Exists(Int32) FunctionValues.OrdVal(Int32) FunctionValues.NumOrd FunctionValues.ByteVal(Int32, Byte[]) FunctionValues.Int16Val(Int32, Int16[]) FunctionValues.SingleVal(Int32, Single[]) FunctionValues.Int32Val(Int32, Int32[]) FunctionValues.Int64Val(Int32, Int64[]) FunctionValues.DoubleVal(Int32, Double[]) FunctionValues.StrVal(Int32, String[]) FunctionValues.Explain(Int32) FunctionValues.GetScorer(IndexReader) FunctionValues.GetRangeScorer(IndexReader, String, String, Boolean, Boolean) System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.GetHashCode() System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) System.Object.ToString() Namespace : Lucene.Net.Queries.Function.DocValues Assembly : Lucene.Net.Queries.dll Syntax public abstract class StrDocValues : FunctionValues Constructors | Improve this Doc View Source StrDocValues(ValueSource) Declaration protected StrDocValues(ValueSource vs) Parameters Type Name Description ValueSource vs Fields | Improve this Doc View Source m_vs Declaration protected readonly ValueSource m_vs Field Value Type Description ValueSource Methods | Improve this Doc View Source BoolVal(Int32) Declaration public override bool BoolVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Boolean Overrides FunctionValues.BoolVal(Int32) | Improve this Doc View Source GetValueFiller() Declaration public override FunctionValues.ValueFiller GetValueFiller() Returns Type Description FunctionValues.ValueFiller Overrides FunctionValues.GetValueFiller() | Improve this Doc View Source ObjectVal(Int32) Declaration public override object ObjectVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Object Overrides FunctionValues.ObjectVal(Int32) | Improve this Doc View Source StrVal(Int32) Declaration public abstract override string StrVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.String Overrides FunctionValues.StrVal(Int32) | Improve this Doc View Source ToString(Int32) Declaration public override string ToString(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.String Overrides FunctionValues.ToString(Int32)"
  },
  "Lucene.Net.Queries.Function.FunctionQuery.AllScorer.html": {
    "href": "Lucene.Net.Queries.Function.FunctionQuery.AllScorer.html",
    "title": "Class FunctionQuery.AllScorer | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class FunctionQuery.AllScorer Inheritance System.Object Lucene.Net.Search.DocIdSetIterator Lucene.Net.Index.DocsEnum Lucene.Net.Search.Scorer FunctionQuery.AllScorer Inherited Members Lucene.Net.Search.Scorer.m_weight Lucene.Net.Search.Scorer.Weight Lucene.Net.Search.Scorer.GetChildren() Lucene.Net.Index.DocsEnum.Attributes Lucene.Net.Search.DocIdSetIterator.GetEmpty() Lucene.Net.Search.DocIdSetIterator.NO_MORE_DOCS DocIdSetIterator.SlowAdvance(Int32) System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.GetHashCode() System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) System.Object.ToString() Namespace : Lucene.Net.Queries.Function Assembly : Lucene.Net.Queries.dll Syntax protected class AllScorer : Scorer Constructors | Improve this Doc View Source AllScorer(FunctionQuery, AtomicReaderContext, IBits, FunctionQuery.FunctionWeight, Single) Declaration public AllScorer(FunctionQuery outerInstance, AtomicReaderContext context, IBits acceptDocs, FunctionQuery.FunctionWeight w, float qWeight) Parameters Type Name Description FunctionQuery outerInstance Lucene.Net.Index.AtomicReaderContext context Lucene.Net.Util.IBits acceptDocs FunctionQuery.FunctionWeight w System.Single qWeight Exceptions Type Condition System.IO.IOException Properties | Improve this Doc View Source DocID Declaration public override int DocID { get; } Property Value Type Description System.Int32 Overrides Lucene.Net.Search.DocIdSetIterator.DocID | Improve this Doc View Source Freq Declaration public override int Freq { get; } Property Value Type Description System.Int32 Overrides Lucene.Net.Index.DocsEnum.Freq Methods | Improve this Doc View Source Advance(Int32) Declaration public override int Advance(int target) Parameters Type Name Description System.Int32 target Returns Type Description System.Int32 Overrides DocIdSetIterator.Advance(Int32) | Improve this Doc View Source Explain(Int32) Declaration public virtual Explanation Explain(int d) Parameters Type Name Description System.Int32 d Returns Type Description Lucene.Net.Search.Explanation | Improve this Doc View Source GetCost() Declaration public override long GetCost() Returns Type Description System.Int64 Overrides Lucene.Net.Search.DocIdSetIterator.GetCost() | Improve this Doc View Source GetScore() Declaration public override float GetScore() Returns Type Description System.Single Overrides Lucene.Net.Search.Scorer.GetScore() | Improve this Doc View Source NextDoc() Declaration public override int NextDoc() Returns Type Description System.Int32 Overrides Lucene.Net.Search.DocIdSetIterator.NextDoc()"
  },
  "Lucene.Net.Queries.Function.FunctionQuery.FunctionWeight.html": {
    "href": "Lucene.Net.Queries.Function.FunctionQuery.FunctionWeight.html",
    "title": "Class FunctionQuery.FunctionWeight | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class FunctionQuery.FunctionWeight Inheritance System.Object Lucene.Net.Search.Weight FunctionQuery.FunctionWeight Inherited Members Weight.GetBulkScorer(AtomicReaderContext, Boolean, IBits) Lucene.Net.Search.Weight.ScoresDocsOutOfOrder System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.GetHashCode() System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) System.Object.ToString() Namespace : Lucene.Net.Queries.Function Assembly : Lucene.Net.Queries.dll Syntax protected class FunctionWeight : Weight Constructors | Improve this Doc View Source FunctionWeight(FunctionQuery, IndexSearcher) Declaration public FunctionWeight(FunctionQuery outerInstance, IndexSearcher searcher) Parameters Type Name Description FunctionQuery outerInstance Lucene.Net.Search.IndexSearcher searcher Fields | Improve this Doc View Source m_context Declaration protected readonly IDictionary m_context Field Value Type Description System.Collections.IDictionary | Improve this Doc View Source m_queryNorm Declaration protected float m_queryNorm Field Value Type Description System.Single | Improve this Doc View Source m_queryWeight Declaration protected float m_queryWeight Field Value Type Description System.Single | Improve this Doc View Source m_searcher Declaration protected readonly IndexSearcher m_searcher Field Value Type Description Lucene.Net.Search.IndexSearcher Properties | Improve this Doc View Source Query Declaration public override Query Query { get; } Property Value Type Description Lucene.Net.Search.Query Overrides Lucene.Net.Search.Weight.Query Methods | Improve this Doc View Source Explain(AtomicReaderContext, Int32) Declaration public override Explanation Explain(AtomicReaderContext ctx, int doc) Parameters Type Name Description Lucene.Net.Index.AtomicReaderContext ctx System.Int32 doc Returns Type Description Lucene.Net.Search.Explanation Overrides Weight.Explain(AtomicReaderContext, Int32) | Improve this Doc View Source GetScorer(AtomicReaderContext, IBits) Declaration public override Scorer GetScorer(AtomicReaderContext ctx, IBits acceptDocs) Parameters Type Name Description Lucene.Net.Index.AtomicReaderContext ctx Lucene.Net.Util.IBits acceptDocs Returns Type Description Lucene.Net.Search.Scorer Overrides Lucene.Net.Search.Weight.GetScorer(Lucene.Net.Index.AtomicReaderContext, Lucene.Net.Util.IBits) | Improve this Doc View Source GetValueForNormalization() Declaration public override float GetValueForNormalization() Returns Type Description System.Single Overrides Lucene.Net.Search.Weight.GetValueForNormalization() | Improve this Doc View Source Normalize(Single, Single) Declaration public override void Normalize(float norm, float topLevelBoost) Parameters Type Name Description System.Single norm System.Single topLevelBoost Overrides Weight.Normalize(Single, Single)"
  },
  "Lucene.Net.Queries.Function.FunctionQuery.html": {
    "href": "Lucene.Net.Queries.Function.FunctionQuery.html",
    "title": "Class FunctionQuery | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class FunctionQuery Returns a score for each document based on a ValueSource , often some function of the value of a field. Note: This API is experimental and may change in non backward-compatible ways in the future Inheritance System.Object Lucene.Net.Search.Query FunctionQuery Inherited Members Lucene.Net.Search.Query.Boost Lucene.Net.Search.Query.ToString() Lucene.Net.Search.Query.Clone() System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function Assembly : Lucene.Net.Queries.dll Syntax public class FunctionQuery : Query Constructors | Improve this Doc View Source FunctionQuery(ValueSource) Declaration public FunctionQuery(ValueSource func) Parameters Type Name Description ValueSource func defines the function to be used for scoring Properties | Improve this Doc View Source ValueSource Declaration public virtual ValueSource ValueSource { get; } Property Value Type Description ValueSource The associated ValueSource Methods | Improve this Doc View Source CreateWeight(IndexSearcher) Declaration public override Weight CreateWeight(IndexSearcher searcher) Parameters Type Name Description Lucene.Net.Search.IndexSearcher searcher Returns Type Description Lucene.Net.Search.Weight Overrides Lucene.Net.Search.Query.CreateWeight(Lucene.Net.Search.IndexSearcher) | Improve this Doc View Source Equals(Object) Returns true if o is equal to this. Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides Query.Equals(Object) | Improve this Doc View Source ExtractTerms(ISet<Term>) Declaration public override void ExtractTerms(ISet<Term> terms) Parameters Type Name Description System.Collections.Generic.ISet < Lucene.Net.Index.Term > terms Overrides Query.ExtractTerms(ISet<Term>) | Improve this Doc View Source GetHashCode() Returns a hash code value for this object. Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides Lucene.Net.Search.Query.GetHashCode() | Improve this Doc View Source Rewrite(IndexReader) Declaration public override Query Rewrite(IndexReader reader) Parameters Type Name Description Lucene.Net.Index.IndexReader reader Returns Type Description Lucene.Net.Search.Query Overrides Lucene.Net.Search.Query.Rewrite(Lucene.Net.Index.IndexReader) | Improve this Doc View Source ToString(String) Prints a user-readable version of this query. Declaration public override string ToString(string field) Parameters Type Name Description System.String field Returns Type Description System.String Overrides Query.ToString(String)"
  },
  "Lucene.Net.Queries.Function.FunctionValues.html": {
    "href": "Lucene.Net.Queries.Function.FunctionValues.html",
    "title": "Class FunctionValues | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class FunctionValues Represents field values as different types. Normally created via a ValueSource for a particular field and reader. Inheritance System.Object FunctionValues BoolDocValues DocTermsIndexDocValues DoubleDocValues Int32DocValues Int64DocValues SingleDocValues StrDocValues MultiFunction.Values Inherited Members System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.GetHashCode() System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) System.Object.ToString() Namespace : Lucene.Net.Queries.Function Assembly : Lucene.Net.Queries.dll Syntax public abstract class FunctionValues Properties | Improve this Doc View Source NumOrd Declaration public virtual int NumOrd { get; } Property Value Type Description System.Int32 the number of unique sort ordinals this instance has Methods | Improve this Doc View Source BoolVal(Int32) Declaration public virtual bool BoolVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Boolean | Improve this Doc View Source BytesVal(Int32, BytesRef) returns the bytes representation of the str val - TODO: should this return the indexed raw bytes not? Declaration public virtual bool BytesVal(int doc, BytesRef target) Parameters Type Name Description System.Int32 doc Lucene.Net.Util.BytesRef target Returns Type Description System.Boolean | Improve this Doc View Source ByteVal(Int32) Declaration public virtual byte ByteVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Byte | Improve this Doc View Source ByteVal(Int32, Byte[]) Declaration public virtual void ByteVal(int doc, byte[] vals) Parameters Type Name Description System.Int32 doc System.Byte [] vals | Improve this Doc View Source DoubleVal(Int32) Declaration public virtual double DoubleVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Double | Improve this Doc View Source DoubleVal(Int32, Double[]) Declaration public virtual void DoubleVal(int doc, double[] vals) Parameters Type Name Description System.Int32 doc System.Double [] vals | Improve this Doc View Source Exists(Int32) Returns true if there is a value for this document Declaration public virtual bool Exists(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Boolean | Improve this Doc View Source Explain(Int32) Declaration public virtual Explanation Explain(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description Lucene.Net.Search.Explanation | Improve this Doc View Source GetRangeScorer(IndexReader, String, String, Boolean, Boolean) Declaration public virtual ValueSourceScorer GetRangeScorer(IndexReader reader, string lowerVal, string upperVal, bool includeLower, bool includeUpper) Parameters Type Name Description Lucene.Net.Index.IndexReader reader System.String lowerVal System.String upperVal System.Boolean includeLower System.Boolean includeUpper Returns Type Description ValueSourceScorer | Improve this Doc View Source GetScorer(IndexReader) Declaration public virtual ValueSourceScorer GetScorer(IndexReader reader) Parameters Type Name Description Lucene.Net.Index.IndexReader reader Returns Type Description ValueSourceScorer | Improve this Doc View Source GetValueFiller() This is a Lucene.NET EXPERIMENTAL API, use at your own risk Declaration public virtual FunctionValues.ValueFiller GetValueFiller() Returns Type Description FunctionValues.ValueFiller | Improve this Doc View Source Int16Val(Int32) NOTE: This was shortVal() in Lucene Declaration public virtual short Int16Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int16 | Improve this Doc View Source Int16Val(Int32, Int16[]) NOTE: This was shortVal() in Lucene Declaration public virtual void Int16Val(int doc, short[] vals) Parameters Type Name Description System.Int32 doc System.Int16 [] vals | Improve this Doc View Source Int32Val(Int32) NOTE: This was intVal() in Lucene Declaration public virtual int Int32Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int32 | Improve this Doc View Source Int32Val(Int32, Int32[]) NOTE: This was intVal() in Lucene Declaration public virtual void Int32Val(int doc, int[] vals) Parameters Type Name Description System.Int32 doc System.Int32 [] vals | Improve this Doc View Source Int64Val(Int32) NOTE: This was longVal() in Lucene Declaration public virtual long Int64Val(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Int64 | Improve this Doc View Source Int64Val(Int32, Int64[]) NOTE: This was longVal() in Lucene Declaration public virtual void Int64Val(int doc, long[] vals) Parameters Type Name Description System.Int32 doc System.Int64 [] vals | Improve this Doc View Source ObjectVal(Int32) Native System.Object representation of the value Declaration public virtual object ObjectVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Object | Improve this Doc View Source OrdVal(Int32) Declaration public virtual int OrdVal(int doc) Parameters Type Name Description System.Int32 doc The doc to retrieve to sort ordinal for Returns Type Description System.Int32 the sort ordinal for the specified doc TODO: Maybe we can just use intVal for this... | Improve this Doc View Source SingleVal(Int32) NOTE: This was floatVal() in Lucene Declaration public virtual float SingleVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Single | Improve this Doc View Source SingleVal(Int32, Single[]) NOTE: This was floatVal() in Lucene Declaration public virtual void SingleVal(int doc, float[] vals) Parameters Type Name Description System.Int32 doc System.Single [] vals | Improve this Doc View Source StrVal(Int32) Declaration public virtual string StrVal(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.String | Improve this Doc View Source StrVal(Int32, String[]) Declaration public virtual void StrVal(int doc, string[] vals) Parameters Type Name Description System.Int32 doc System.String [] vals | Improve this Doc View Source ToString(Int32) Declaration public abstract string ToString(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.String"
  },
  "Lucene.Net.Queries.Function.FunctionValues.ValueFiller.html": {
    "href": "Lucene.Net.Queries.Function.FunctionValues.ValueFiller.html",
    "title": "Class FunctionValues.ValueFiller | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class FunctionValues.ValueFiller Abstraction of the logic required to fill the value of a specified doc into a reusable Lucene.Net.Util.Mutable.MutableValue . Implementations of FunctionValues are encouraged to define their own implementations of FunctionValues.ValueFiller if their value is not a System.Single . This is a Lucene.NET EXPERIMENTAL API, use at your own risk Inheritance System.Object FunctionValues.ValueFiller Inherited Members System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.GetHashCode() System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) System.Object.ToString() Namespace : Lucene.Net.Queries.Function Assembly : Lucene.Net.Queries.dll Syntax public abstract class ValueFiller Properties | Improve this Doc View Source Value Lucene.Net.Util.Mutable.MutableValue will be reused across calls Declaration public abstract MutableValue Value { get; } Property Value Type Description Lucene.Net.Util.Mutable.MutableValue Methods | Improve this Doc View Source FillValue(Int32) Lucene.Net.Util.Mutable.MutableValue will be reused across calls. Returns true if the value exists. Declaration public abstract void FillValue(int doc) Parameters Type Name Description System.Int32 doc"
  },
  "Lucene.Net.Queries.Function.html": {
    "href": "Lucene.Net.Queries.Function.html",
    "title": "Namespace Lucene.Net.Queries.Function | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Namespace Lucene.Net.Queries.Function <!-- 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. --> Queries that compute score based upon a function Classes BoostedQuery Query that is boosted by a ValueSource FunctionQuery Returns a score for each document based on a ValueSource , often some function of the value of a field. Note: This API is experimental and may change in non backward-compatible ways in the future FunctionQuery.AllScorer FunctionQuery.FunctionWeight FunctionValues Represents field values as different types. Normally created via a ValueSource for a particular field and reader. FunctionValues.ValueFiller Abstraction of the logic required to fill the value of a specified doc into a reusable Lucene.Net.Util.Mutable.MutableValue . Implementations of FunctionValues are encouraged to define their own implementations of FunctionValues.ValueFiller if their value is not a System.Single . This is a Lucene.NET EXPERIMENTAL API, use at your own risk ValueSource Instantiates FunctionValues for a particular reader. Often used when creating a FunctionQuery . ValueSourceScorer Lucene.Net.Search.Scorer which returns the result of SingleVal(Int32) as the score for a document."
  },
  "Lucene.Net.Queries.Function.ValueSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSource.html",
    "title": "Class ValueSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class ValueSource Instantiates FunctionValues for a particular reader. Often used when creating a FunctionQuery . Inheritance System.Object ValueSource BoolFunction ConstNumberSource DocFreqValueSource DualSingleFunction FieldCacheSource LinearSingleFunction LiteralValueSource MaxDocValueSource MultiFunction MultiSingleFunction MultiValueSource NormValueSource NumDocsValueSource OrdFieldSource QueryValueSource RangeMapSingleFunction ReciprocalSingleFunction ReverseOrdFieldSource ScaleSingleFunction SingularFunction SumTotalTermFreqValueSource TotalTermFreqValueSource Inherited Members System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function Assembly : Lucene.Net.Queries.dll Syntax public abstract class ValueSource Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Implementations should propagate CreateWeight to sub-ValueSources which can optionally store weight info in the context. The context object will be passed to GetValues() where this info can be retrieved. Declaration public virtual void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher | Improve this Doc View Source Equals(Object) Declaration public abstract override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides System.Object.Equals(System.Object) | Improve this Doc View Source GetDescription() description of field, used in Explain() Declaration public abstract string GetDescription() Returns Type Description System.String | Improve this Doc View Source GetHashCode() Declaration public abstract override int GetHashCode() Returns Type Description System.Int32 Overrides System.Object.GetHashCode() | Improve this Doc View Source GetSortField(Boolean) EXPERIMENTAL: This method is subject to change. Get the Lucene.Net.Search.SortField for this ValueSource . Uses the GetValues(IDictionary, AtomicReaderContext) to populate the Lucene.Net.Search.SortField . Declaration public virtual SortField GetSortField(bool reverse) Parameters Type Name Description System.Boolean reverse true if this is a reverse sort. Returns Type Description Lucene.Net.Search.SortField The Lucene.Net.Search.SortField for the ValueSource | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Gets the values for this reader and the context that was previously passed to CreateWeight(IDictionary, IndexSearcher) Declaration public abstract FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues | Improve this Doc View Source NewContext(IndexSearcher) Returns a new non-threadsafe context map. Declaration public static IDictionary NewContext(IndexSearcher searcher) Parameters Type Name Description Lucene.Net.Search.IndexSearcher searcher Returns Type Description System.Collections.IDictionary | Improve this Doc View Source ToString() Declaration public override string ToString() Returns Type Description System.String Overrides System.Object.ToString()"
  },
  "Lucene.Net.Queries.Function.ValueSources.BoolFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.BoolFunction.html",
    "title": "Class BoolFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class BoolFunction Abstract parent class for those ValueSource implementations which apply boolean logic to their values Inheritance System.Object ValueSource BoolFunction IfFunction MultiBoolFunction SimpleBoolFunction Inherited Members ValueSource.GetValues(IDictionary, AtomicReaderContext) ValueSource.Equals(Object) ValueSource.GetHashCode() ValueSource.GetDescription() ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public abstract class BoolFunction : ValueSource"
  },
  "Lucene.Net.Queries.Function.ValueSources.ByteFieldSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.ByteFieldSource.html",
    "title": "Class ByteFieldSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class ByteFieldSource Obtains System.Int32 field values from the FieldCache using GetInt32s(AtomicReader, String, FieldCache.IInt32Parser, Boolean) and makes those values available as other numeric types, casting as needed. * Inheritance System.Object ValueSource FieldCacheSource ByteFieldSource Inherited Members FieldCacheSource.m_field FieldCacheSource.m_cache FieldCacheSource.FieldCache FieldCacheSource.Field ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax [Obsolete] public class ByteFieldSource : FieldCacheSource Constructors | Improve this Doc View Source ByteFieldSource(String) Declaration public ByteFieldSource(string field) Parameters Type Name Description System.String field | Improve this Doc View Source ByteFieldSource(String, FieldCache.IByteParser) Declaration public ByteFieldSource(string field, FieldCache.IByteParser parser) Parameters Type Name Description System.String field Lucene.Net.Search.FieldCache.IByteParser parser Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides FieldCacheSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides FieldCacheSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides FieldCacheSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.BytesRefFieldSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.BytesRefFieldSource.html",
    "title": "Class BytesRefFieldSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class BytesRefFieldSource An implementation for retrieving FunctionValues instances for System.String based fields. Inheritance System.Object ValueSource FieldCacheSource BytesRefFieldSource Inherited Members FieldCacheSource.m_field FieldCacheSource.m_cache FieldCacheSource.FieldCache FieldCacheSource.Field FieldCacheSource.GetDescription() FieldCacheSource.Equals(Object) FieldCacheSource.GetHashCode() ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class BytesRefFieldSource : FieldCacheSource Constructors | Improve this Doc View Source BytesRefFieldSource(String) Declaration public BytesRefFieldSource(string field) Parameters Type Name Description System.String field Methods | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.ConstNumberSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.ConstNumberSource.html",
    "title": "Class ConstNumberSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class ConstNumberSource ConstNumberSource is the base class for all constant numbers Inheritance System.Object ValueSource ConstNumberSource ConstValueSource DoubleConstValueSource Inherited Members ValueSource.GetValues(IDictionary, AtomicReaderContext) ValueSource.Equals(Object) ValueSource.GetHashCode() ValueSource.GetDescription() ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public abstract class ConstNumberSource : ValueSource Properties | Improve this Doc View Source Bool Declaration public abstract bool Bool { get; } Property Value Type Description System.Boolean | Improve this Doc View Source Double Declaration public abstract double Double { get; } Property Value Type Description System.Double | Improve this Doc View Source Int32 NOTE: This was getInt() in Lucene Declaration public abstract int Int32 { get; } Property Value Type Description System.Int32 | Improve this Doc View Source Int64 NOTE: This was getLong() in Lucene Declaration public abstract long Int64 { get; } Property Value Type Description System.Int64 | Improve this Doc View Source Single NOTE: This was getFloat() in Lucene Declaration public abstract float Single { get; } Property Value Type Description System.Single"
  },
  "Lucene.Net.Queries.Function.ValueSources.ConstValueSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.ConstValueSource.html",
    "title": "Class ConstValueSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class ConstValueSource ConstValueSource returns a constant for all documents Inheritance System.Object ValueSource ConstNumberSource ConstValueSource Inherited Members ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class ConstValueSource : ConstNumberSource Constructors | Improve this Doc View Source ConstValueSource(Single) Declaration public ConstValueSource(float constant) Parameters Type Name Description System.Single constant Properties | Improve this Doc View Source Bool Declaration public override bool Bool { get; } Property Value Type Description System.Boolean Overrides ConstNumberSource.Bool | Improve this Doc View Source Double Declaration public override double Double { get; } Property Value Type Description System.Double Overrides ConstNumberSource.Double | Improve this Doc View Source Int32 NOTE: This was getInt() in Lucene Declaration public override int Int32 { get; } Property Value Type Description System.Int32 Overrides ConstNumberSource.Int32 | Improve this Doc View Source Int64 NOTE: This was getLong() in Lucene Declaration public override long Int64 { get; } Property Value Type Description System.Int64 Overrides ConstNumberSource.Int64 | Improve this Doc View Source Single NOTE: This was getFloat() in Lucene Declaration public override float Single { get; } Property Value Type Description System.Single Overrides ConstNumberSource.Single Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.DefFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.DefFunction.html",
    "title": "Class DefFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class DefFunction ValueSource implementation which only returns the values from the provided ValueSource s which are available for a particular docId. Consequently, when combined with a ConstValueSource , this function serves as a way to return a default value when the values for a field are unavailable. Inheritance System.Object ValueSource MultiFunction DefFunction Inherited Members MultiFunction.m_sources MultiFunction.GetDescription() MultiFunction.GetDescription(String, IList<ValueSource>) MultiFunction.ValsArr(IList<ValueSource>, IDictionary, AtomicReaderContext) MultiFunction.ToString(String, FunctionValues[], Int32) MultiFunction.CreateWeight(IDictionary, IndexSearcher) MultiFunction.GetHashCode() MultiFunction.Equals(Object) ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class DefFunction : MultiFunction Constructors | Improve this Doc View Source DefFunction(IList<ValueSource>) Declaration public DefFunction(IList<ValueSource> sources) Parameters Type Name Description System.Collections.Generic.IList < ValueSource > sources Properties | Improve this Doc View Source Name Declaration protected override string Name { get; } Property Value Type Description System.String Overrides MultiFunction.Name Methods | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary fcontext, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary fcontext Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.DivSingleFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.DivSingleFunction.html",
    "title": "Class DivSingleFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class DivSingleFunction Function to divide \"a\" by \"b\" NOTE: This was DivFloatFunction in Lucene Inheritance System.Object ValueSource DualSingleFunction DivSingleFunction Inherited Members DualSingleFunction.m_a DualSingleFunction.m_b DualSingleFunction.GetDescription() DualSingleFunction.GetValues(IDictionary, AtomicReaderContext) DualSingleFunction.CreateWeight(IDictionary, IndexSearcher) DualSingleFunction.GetHashCode() DualSingleFunction.Equals(Object) ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class DivSingleFunction : DualSingleFunction Constructors | Improve this Doc View Source DivSingleFunction(ValueSource, ValueSource) Declaration public DivSingleFunction(ValueSource a, ValueSource b) Parameters Type Name Description ValueSource a the numerator. ValueSource b the denominator. Properties | Improve this Doc View Source Name Declaration protected override string Name { get; } Property Value Type Description System.String Overrides DualSingleFunction.Name Methods | Improve this Doc View Source Func(Int32, FunctionValues, FunctionValues) Declaration protected override float Func(int doc, FunctionValues aVals, FunctionValues bVals) Parameters Type Name Description System.Int32 doc FunctionValues aVals FunctionValues bVals Returns Type Description System.Single Overrides DualSingleFunction.Func(Int32, FunctionValues, FunctionValues)"
  },
  "Lucene.Net.Queries.Function.ValueSources.DocFreqValueSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.DocFreqValueSource.html",
    "title": "Class DocFreqValueSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class DocFreqValueSource DocFreqValueSource returns the number of documents containing the term. This is a Lucene.NET INTERNAL API, use at your own risk Inheritance System.Object ValueSource DocFreqValueSource IDFValueSource TermFreqValueSource Inherited Members ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class DocFreqValueSource : ValueSource Constructors | Improve this Doc View Source DocFreqValueSource(String, String, String, BytesRef) Declaration public DocFreqValueSource(string field, string val, string indexedField, BytesRef indexedBytes) Parameters Type Name Description System.String field System.String val System.String indexedField Lucene.Net.Util.BytesRef indexedBytes Fields | Improve this Doc View Source m_field Declaration protected readonly string m_field Field Value Type Description System.String | Improve this Doc View Source m_indexedBytes Declaration protected readonly BytesRef m_indexedBytes Field Value Type Description Lucene.Net.Util.BytesRef | Improve this Doc View Source m_indexedField Declaration protected readonly string m_indexedField Field Value Type Description System.String | Improve this Doc View Source m_val Declaration protected readonly string m_val Field Value Type Description System.String Properties | Improve this Doc View Source Name Declaration public virtual string Name { get; } Property Value Type Description System.String Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.DoubleConstValueSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.DoubleConstValueSource.html",
    "title": "Class DoubleConstValueSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class DoubleConstValueSource Function that returns a constant double value for every document. Inheritance System.Object ValueSource ConstNumberSource DoubleConstValueSource Inherited Members ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class DoubleConstValueSource : ConstNumberSource Constructors | Improve this Doc View Source DoubleConstValueSource(Double) Declaration public DoubleConstValueSource(double constant) Parameters Type Name Description System.Double constant Properties | Improve this Doc View Source Bool Declaration public override bool Bool { get; } Property Value Type Description System.Boolean Overrides ConstNumberSource.Bool | Improve this Doc View Source Double Declaration public override double Double { get; } Property Value Type Description System.Double Overrides ConstNumberSource.Double | Improve this Doc View Source Int32 NOTE: This was getInt() in Lucene Declaration public override int Int32 { get; } Property Value Type Description System.Int32 Overrides ConstNumberSource.Int32 | Improve this Doc View Source Int64 NOTE: This was getLong() in Lucene Declaration public override long Int64 { get; } Property Value Type Description System.Int64 Overrides ConstNumberSource.Int64 | Improve this Doc View Source Single NOTE: This was getFloat() in Lucene Declaration public override float Single { get; } Property Value Type Description System.Single Overrides ConstNumberSource.Single Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.DoubleFieldSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.DoubleFieldSource.html",
    "title": "Class DoubleFieldSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class DoubleFieldSource Obtains System.Double field values from GetDoubles(AtomicReader, String, FieldCache.IDoubleParser, Boolean) and makes those values available as other numeric types, casting as needed. Inheritance System.Object ValueSource FieldCacheSource DoubleFieldSource Inherited Members FieldCacheSource.m_field FieldCacheSource.m_cache FieldCacheSource.FieldCache FieldCacheSource.Field ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class DoubleFieldSource : FieldCacheSource Constructors | Improve this Doc View Source DoubleFieldSource(String) Declaration public DoubleFieldSource(string field) Parameters Type Name Description System.String field | Improve this Doc View Source DoubleFieldSource(String, FieldCache.IDoubleParser) Declaration public DoubleFieldSource(string field, FieldCache.IDoubleParser parser) Parameters Type Name Description System.String field Lucene.Net.Search.FieldCache.IDoubleParser parser Fields | Improve this Doc View Source m_parser Declaration protected readonly FieldCache.IDoubleParser m_parser Field Value Type Description Lucene.Net.Search.FieldCache.IDoubleParser Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides FieldCacheSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides FieldCacheSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides FieldCacheSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.DualSingleFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.DualSingleFunction.html",
    "title": "Class DualSingleFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class DualSingleFunction Abstract ValueSource implementation which wraps two ValueSource s and applies an extendible System.Single function to their values. NOTE: This was DualFloatFunction in Lucene Inheritance System.Object ValueSource DualSingleFunction DivSingleFunction PowSingleFunction Inherited Members ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public abstract class DualSingleFunction : ValueSource Constructors | Improve this Doc View Source DualSingleFunction(ValueSource, ValueSource) Declaration protected DualSingleFunction(ValueSource a, ValueSource b) Parameters Type Name Description ValueSource a the base. ValueSource b the exponent. Fields | Improve this Doc View Source m_a Declaration protected readonly ValueSource m_a Field Value Type Description ValueSource | Improve this Doc View Source m_b Declaration protected readonly ValueSource m_b Field Value Type Description ValueSource Properties | Improve this Doc View Source Name Declaration protected abstract string Name { get; } Property Value Type Description System.String Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source Func(Int32, FunctionValues, FunctionValues) Declaration protected abstract float Func(int doc, FunctionValues aVals, FunctionValues bVals) Parameters Type Name Description System.Int32 doc FunctionValues aVals FunctionValues bVals Returns Type Description System.Single | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.EnumFieldSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.EnumFieldSource.html",
    "title": "Class EnumFieldSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class EnumFieldSource Obtains System.Int32 field values from GetInt32s(AtomicReader, String, FieldCache.IInt32Parser, Boolean) and makes those values available as other numeric types, casting as needed. StrVal of the value is not the System.Int32 value, but its System.String (displayed) value Inheritance System.Object ValueSource FieldCacheSource EnumFieldSource Inherited Members FieldCacheSource.m_field FieldCacheSource.m_cache FieldCacheSource.FieldCache FieldCacheSource.Field ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class EnumFieldSource : FieldCacheSource Constructors | Improve this Doc View Source EnumFieldSource(String, FieldCache.IInt32Parser, IDictionary<Nullable<Int32>, String>, IDictionary<String, Nullable<Int32>>) Declaration public EnumFieldSource(string field, FieldCache.IInt32Parser parser, IDictionary<int?, string> enumIntToStringMap, IDictionary<string, int?> enumStringToIntMap) Parameters Type Name Description System.String field Lucene.Net.Search.FieldCache.IInt32Parser parser System.Collections.Generic.IDictionary < System.Nullable < System.Int32 >, System.String > enumIntToStringMap System.Collections.Generic.IDictionary < System.String , System.Nullable < System.Int32 >> enumStringToIntMap Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides FieldCacheSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides FieldCacheSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides FieldCacheSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.FieldCacheSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.FieldCacheSource.html",
    "title": "Class FieldCacheSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class FieldCacheSource A base class for ValueSource implementations that retrieve values for a single field from the FieldCache . Inheritance System.Object ValueSource FieldCacheSource ByteFieldSource BytesRefFieldSource DoubleFieldSource EnumFieldSource Int16FieldSource Int32FieldSource Int64FieldSource JoinDocFreqValueSource SingleFieldSource Inherited Members ValueSource.GetValues(IDictionary, AtomicReaderContext) ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public abstract class FieldCacheSource : ValueSource Constructors | Improve this Doc View Source FieldCacheSource(String) Declaration protected FieldCacheSource(string field) Parameters Type Name Description System.String field Fields | Improve this Doc View Source m_cache Declaration protected readonly IFieldCache m_cache Field Value Type Description Lucene.Net.Search.IFieldCache | Improve this Doc View Source m_field Declaration protected readonly string m_field Field Value Type Description System.String Properties | Improve this Doc View Source Field Declaration public virtual string Field { get; } Property Value Type Description System.String | Improve this Doc View Source FieldCache Declaration public virtual IFieldCache FieldCache { get; } Property Value Type Description Lucene.Net.Search.IFieldCache Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode()"
  },
  "Lucene.Net.Queries.Function.ValueSources.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.html",
    "title": "Namespace Lucene.Net.Queries.Function.ValueSources | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Namespace Lucene.Net.Queries.Function.ValueSources <!-- 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. --> A variety of functions to use with FunctionQuery. Classes BoolFunction Abstract parent class for those ValueSource implementations which apply boolean logic to their values ByteFieldSource Obtains System.Int32 field values from the FieldCache using GetInt32s(AtomicReader, String, FieldCache.IInt32Parser, Boolean) and makes those values available as other numeric types, casting as needed. * BytesRefFieldSource An implementation for retrieving FunctionValues instances for System.String based fields. ConstNumberSource ConstNumberSource is the base class for all constant numbers ConstValueSource ConstValueSource returns a constant for all documents DefFunction ValueSource implementation which only returns the values from the provided ValueSource s which are available for a particular docId. Consequently, when combined with a ConstValueSource , this function serves as a way to return a default value when the values for a field are unavailable. DivSingleFunction Function to divide \"a\" by \"b\" NOTE: This was DivFloatFunction in Lucene DocFreqValueSource DocFreqValueSource returns the number of documents containing the term. This is a Lucene.NET INTERNAL API, use at your own risk DoubleConstValueSource Function that returns a constant double value for every document. DoubleFieldSource Obtains System.Double field values from GetDoubles(AtomicReader, String, FieldCache.IDoubleParser, Boolean) and makes those values available as other numeric types, casting as needed. DualSingleFunction Abstract ValueSource implementation which wraps two ValueSource s and applies an extendible System.Single function to their values. NOTE: This was DualFloatFunction in Lucene EnumFieldSource Obtains System.Int32 field values from GetInt32s(AtomicReader, String, FieldCache.IInt32Parser, Boolean) and makes those values available as other numeric types, casting as needed. StrVal of the value is not the System.Int32 value, but its System.String (displayed) value FieldCacheSource A base class for ValueSource implementations that retrieve values for a single field from the FieldCache . IDFValueSource Function that returns Idf(Int64, Int64) for every document. Note that the configured Similarity for the field must be a subclass of Lucene.Net.Search.Similarities.TFIDFSimilarity This is a Lucene.NET INTERNAL API, use at your own risk IfFunction Depending on the System.Boolean value of the Lucene.Net.Queries.Function.ValueSources.IfFunction.ifSource function, returns the value of the Lucene.Net.Queries.Function.ValueSources.IfFunction.trueSource or Lucene.Net.Queries.Function.ValueSources.IfFunction.falseSource function. Int16FieldSource Obtains System.Int16 field values from the FieldCache using GetInt16s(AtomicReader, String, FieldCache.IInt16Parser, Boolean) and makes those values available as other numeric types, casting as needed. NOTE: This was ShortFieldSource in Lucene Int32FieldSource Obtains System.Int32 field values from GetInt32s(AtomicReader, String, FieldCache.IInt32Parser, Boolean) and makes those values available as other numeric types, casting as needed. NOTE: This was IntFieldSource in Lucene Int64FieldSource Obtains System.Int64 field values from GetInt64s(AtomicReader, String, FieldCache.IInt64Parser, Boolean) and makes those values available as other numeric types, casting as needed. NOTE: This was LongFieldSource in Lucene JoinDocFreqValueSource Use a field value and find the Document Frequency within another field. @since solr 4.0 LinearSingleFunction LinearSingleFunction implements a linear function over another ValueSource . Normally Used as an argument to a FunctionQuery NOTE: This was LinearFloatFunction in Lucene LiteralValueSource Pass a the field value through as a System.String , no matter the type // Q: doesn't this mean it's a \"str\"? MaxDocValueSource Returns the value of MaxDoc for every document. This is the number of documents including deletions. MaxSingleFunction MaxSingleFunction returns the max of it's components. NOTE: This was MaxFloatFunction in Lucene MinSingleFunction MinSingleFunction returns the min of it's components. NOTE: This was MinFloatFunction in Lucene MultiBoolFunction Abstract ValueSource implementation which wraps multiple ValueSource s and applies an extendible System.Boolean function to their values. MultiFunction Abstract parent class for ValueSource implementations that wrap multiple ValueSource s and apply their own logic. MultiFunction.Values MultiSingleFunction Abstract ValueSource implementation which wraps multiple ValueSource s and applies an extendible System.Single function to their values. NOTE: This was MultiFloatFunction in Lucene MultiValueSource A ValueSource that abstractly represents ValueSource s for poly fields, and other things. NormValueSource Function that returns DecodeNormValue(Int64) for every document. Note that the configured Similarity for the field must be a subclass of Lucene.Net.Search.Similarities.TFIDFSimilarity This is a Lucene.NET INTERNAL API, use at your own risk NumDocsValueSource Returns the value of NumDocs for every document. This is the number of documents excluding deletions. OrdFieldSource Obtains the ordinal of the field value from the default Lucene FieldCache using StringIndex. The native lucene index order is used to assign an ordinal value for each field value. Field values (terms) are lexicographically ordered by unicode value, and numbered starting at 1. Example: If there were only three field values: \"apple\",\"banana\",\"pear\" then ord(\"apple\")=1, ord(\"banana\")=2, ord(\"pear\")=3 WARNING: Ord depends on the position in an index and can thus change when other documents are inserted or deleted, or if a MultiSearcher is used. WARNING: as of Solr 1.4, ord() and rord() can cause excess memory use since they must use a FieldCache entry at the top level reader, while sorting and function queries now use entries at the segment level. Hence sorting or using a different function query, in addition to ord()/rord() will double memory use. PowSingleFunction Function to raise the base \"a\" to the power \"b\" NOTE: This was PowFloatFunction in Lucene ProductSingleFunction ProductSingleFunction returns the product of it's components. NOTE: This was ProductFloatFunction in Lucene QueryValueSource QueryValueSource returns the relevance score of the query RangeMapSingleFunction RangeMapSingleFunction implements a map function over another ValueSource whose values fall within min and max inclusive to target . Normally used as an argument to a FunctionQuery NOTE: This was RangeMapFloatFunction in Lucene ReciprocalSingleFunction ReciprocalSingleFunction implements a reciprocal function f(x) = a/(mx+b) , based on the System.Single value of a field or function as exported by ValueSource . When a and b are equal, and x>=0 , this function has a maximum value of 1 that drops as x increases. Increasing the value of a and b together results in a movement of the entire function to a flatter part of the curve. These properties make this an idea function for boosting more recent documents. Example: recip(ms(NOW,mydatefield),3.16e-11,1,1) A multiplier of 3.16e-11 changes the units from milliseconds to years (since there are about 3.16e10 milliseconds per year). Thus, a very recent date will yield a value close to 1/(0+1) or 1, a date a year in the past will get a multiplier of about 1/(1+1) or 1/2, and date two years old will yield 1/(2+1) or 1/3. NOTE: This was ReciprocalFloatFunction in Lucene ReverseOrdFieldSource Obtains the ordinal of the field value from the default Lucene FieldCache using GetTermsIndex(AtomicReader, String, Single) and reverses the order. The native lucene index order is used to assign an ordinal value for each field value. Field values (terms) are lexicographically ordered by unicode value, and numbered starting at 1. Example of reverse ordinal (rord): If there were only three field values: \"apple\",\"banana\",\"pear\" then rord(\"apple\")=3, rord(\"banana\")=2, ord(\"pear\")=1 WARNING: Ord depends on the position in an index and can thus change when other documents are inserted or deleted, or if a MultiSearcher is used. WARNING: as of Solr 1.4, ord() and rord() can cause excess memory use since they must use a FieldCache entry at the top level reader, while sorting and function queries now use entries at the segment level. Hence sorting or using a different function query, in addition to ord()/rord() will double memory use. ScaleSingleFunction Scales values to be between min and max . This implementation currently traverses all of the source values to obtain their min and max. This implementation currently cannot distinguish when documents have been deleted or documents that have no value, and 0.0 values will be used for these cases. This means that if values are normally all greater than 0.0, one can still end up with 0.0 as the min value to map from. In these cases, an appropriate map() function could be used as a workaround to change 0.0 to a value in the real range. NOTE: This was ScaleFloatFunction in Lucene SimpleBoolFunction BoolFunction implementation which applies an extendible System.Boolean function to the values of a single wrapped ValueSource . Functions this can be used for include whether a field has a value or not, or inverting the System.Boolean value of the wrapped ValueSource . SimpleSingleFunction A simple System.Single function with a single argument NOTE: This was SimpleFloatFunction in Lucene SingleFieldSource Obtains System.Single field values from GetSingles(AtomicReader, String, FieldCache.ISingleParser, Boolean) and makes those values available as other numeric types, casting as needed. NOTE: This was FloatFieldSource in Lucene SingularFunction A function with a single (one) argument. NOTE: This was SingleFunction in Lucene, changed to avoid conusion with operations on the datatype System.Single . SumSingleFunction SumSingleFunction returns the sum of its components. NOTE: This was SumFloatFunction in Lucene SumTotalTermFreqValueSource SumTotalTermFreqValueSource returns the number of tokens. (sum of term freqs across all documents, across all terms). Returns -1 if frequencies were omitted for the field, or if the codec doesn't support this statistic. This is a Lucene.NET INTERNAL API, use at your own risk TermFreqValueSource Function that returns Lucene.Net.Index.DocsEnum.Freq for the supplied term in every document. If the term does not exist in the document, returns 0. If frequencies are omitted, returns 1. TFValueSource Function that returns Tf(Single) for every document. Note that the configured Similarity for the field must be a subclass of Lucene.Net.Search.Similarities.TFIDFSimilarity This is a Lucene.NET INTERNAL API, use at your own risk TotalTermFreqValueSource TotalTermFreqValueSource returns the total term freq (sum of term freqs across all documents). Returns -1 if frequencies were omitted for the field, or if the codec doesn't support this statistic. This is a Lucene.NET INTERNAL API, use at your own risk VectorValueSource Converts individual ValueSource instances to leverage the FunctionValues *Val functions that work with multiple values, i.e. DoubleVal(Int32, Double[])"
  },
  "Lucene.Net.Queries.Function.ValueSources.IDFValueSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.IDFValueSource.html",
    "title": "Class IDFValueSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class IDFValueSource Function that returns Idf(Int64, Int64) for every document. Note that the configured Similarity for the field must be a subclass of Lucene.Net.Search.Similarities.TFIDFSimilarity This is a Lucene.NET INTERNAL API, use at your own risk Inheritance System.Object ValueSource DocFreqValueSource IDFValueSource Inherited Members DocFreqValueSource.m_field DocFreqValueSource.m_indexedField DocFreqValueSource.m_val DocFreqValueSource.m_indexedBytes DocFreqValueSource.GetDescription() DocFreqValueSource.CreateWeight(IDictionary, IndexSearcher) DocFreqValueSource.GetHashCode() DocFreqValueSource.Equals(Object) ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class IDFValueSource : DocFreqValueSource Constructors | Improve this Doc View Source IDFValueSource(String, String, String, BytesRef) Declaration public IDFValueSource(string field, string val, string indexedField, BytesRef indexedBytes) Parameters Type Name Description System.String field System.String val System.String indexedField Lucene.Net.Util.BytesRef indexedBytes Properties | Improve this Doc View Source Name Declaration public override string Name { get; } Property Value Type Description System.String Overrides DocFreqValueSource.Name Methods | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides DocFreqValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.IfFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.IfFunction.html",
    "title": "Class IfFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class IfFunction Depending on the System.Boolean value of the Lucene.Net.Queries.Function.ValueSources.IfFunction.ifSource function, returns the value of the Lucene.Net.Queries.Function.ValueSources.IfFunction.trueSource or Lucene.Net.Queries.Function.ValueSources.IfFunction.falseSource function. Inheritance System.Object ValueSource BoolFunction IfFunction Inherited Members ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class IfFunction : BoolFunction Constructors | Improve this Doc View Source IfFunction(ValueSource, ValueSource, ValueSource) Declaration public IfFunction(ValueSource ifSource, ValueSource trueSource, ValueSource falseSource) Parameters Type Name Description ValueSource ifSource ValueSource trueSource ValueSource falseSource Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.Int16FieldSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.Int16FieldSource.html",
    "title": "Class Int16FieldSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class Int16FieldSource Obtains System.Int16 field values from the FieldCache using GetInt16s(AtomicReader, String, FieldCache.IInt16Parser, Boolean) and makes those values available as other numeric types, casting as needed. NOTE: This was ShortFieldSource in Lucene Inheritance System.Object ValueSource FieldCacheSource Int16FieldSource Inherited Members FieldCacheSource.m_field FieldCacheSource.m_cache FieldCacheSource.FieldCache FieldCacheSource.Field ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax [Obsolete] public class Int16FieldSource : FieldCacheSource Constructors | Improve this Doc View Source Int16FieldSource(String) Declaration public Int16FieldSource(string field) Parameters Type Name Description System.String field | Improve this Doc View Source Int16FieldSource(String, FieldCache.IInt16Parser) Declaration public Int16FieldSource(string field, FieldCache.IInt16Parser parser) Parameters Type Name Description System.String field Lucene.Net.Search.FieldCache.IInt16Parser parser Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides FieldCacheSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides FieldCacheSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides FieldCacheSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.Int32FieldSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.Int32FieldSource.html",
    "title": "Class Int32FieldSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class Int32FieldSource Obtains System.Int32 field values from GetInt32s(AtomicReader, String, FieldCache.IInt32Parser, Boolean) and makes those values available as other numeric types, casting as needed. NOTE: This was IntFieldSource in Lucene Inheritance System.Object ValueSource FieldCacheSource Int32FieldSource Inherited Members FieldCacheSource.m_field FieldCacheSource.m_cache FieldCacheSource.FieldCache FieldCacheSource.Field ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class Int32FieldSource : FieldCacheSource Constructors | Improve this Doc View Source Int32FieldSource(String) Declaration public Int32FieldSource(string field) Parameters Type Name Description System.String field | Improve this Doc View Source Int32FieldSource(String, FieldCache.IInt32Parser) Declaration public Int32FieldSource(string field, FieldCache.IInt32Parser parser) Parameters Type Name Description System.String field Lucene.Net.Search.FieldCache.IInt32Parser parser Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides FieldCacheSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides FieldCacheSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides FieldCacheSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.Int64FieldSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.Int64FieldSource.html",
    "title": "Class Int64FieldSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class Int64FieldSource Obtains System.Int64 field values from GetInt64s(AtomicReader, String, FieldCache.IInt64Parser, Boolean) and makes those values available as other numeric types, casting as needed. NOTE: This was LongFieldSource in Lucene Inheritance System.Object ValueSource FieldCacheSource Int64FieldSource Inherited Members FieldCacheSource.m_field FieldCacheSource.m_cache FieldCacheSource.FieldCache FieldCacheSource.Field ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class Int64FieldSource : FieldCacheSource Constructors | Improve this Doc View Source Int64FieldSource(String) Declaration public Int64FieldSource(string field) Parameters Type Name Description System.String field | Improve this Doc View Source Int64FieldSource(String, FieldCache.IInt64Parser) Declaration public Int64FieldSource(string field, FieldCache.IInt64Parser parser) Parameters Type Name Description System.String field Lucene.Net.Search.FieldCache.IInt64Parser parser Fields | Improve this Doc View Source m_parser Declaration protected readonly FieldCache.IInt64Parser m_parser Field Value Type Description Lucene.Net.Search.FieldCache.IInt64Parser Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides FieldCacheSource.Equals(Object) | Improve this Doc View Source ExternalToInt64(String) NOTE: This was externalToLong() in Lucene Declaration public virtual long ExternalToInt64(string extVal) Parameters Type Name Description System.String extVal Returns Type Description System.Int64 | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides FieldCacheSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides FieldCacheSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext) | Improve this Doc View Source Int64ToObject(Int64) NOTE: This was longToObject() in Lucene Declaration public virtual object Int64ToObject(long val) Parameters Type Name Description System.Int64 val Returns Type Description System.Object | Improve this Doc View Source Int64ToString(Int64) NOTE: This was longToString() in Lucene Declaration public virtual string Int64ToString(long val) Parameters Type Name Description System.Int64 val Returns Type Description System.String | Improve this Doc View Source NewMutableValueInt64() NOTE: This was longToString() in Lucene Declaration protected virtual MutableValueInt64 NewMutableValueInt64() Returns Type Description Lucene.Net.Util.Mutable.MutableValueInt64"
  },
  "Lucene.Net.Queries.Function.ValueSources.JoinDocFreqValueSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.JoinDocFreqValueSource.html",
    "title": "Class JoinDocFreqValueSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class JoinDocFreqValueSource Use a field value and find the Document Frequency within another field. @since solr 4.0 Inheritance System.Object ValueSource FieldCacheSource JoinDocFreqValueSource Inherited Members FieldCacheSource.m_field FieldCacheSource.m_cache FieldCacheSource.FieldCache FieldCacheSource.Field ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class JoinDocFreqValueSource : FieldCacheSource Constructors | Improve this Doc View Source JoinDocFreqValueSource(String, String) Declaration public JoinDocFreqValueSource(string field, string qfield) Parameters Type Name Description System.String field System.String qfield Fields | Improve this Doc View Source m_qfield Declaration protected readonly string m_qfield Field Value Type Description System.String | Improve this Doc View Source NAME Declaration public const string NAME = \"joindf\" Field Value Type Description System.String Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides FieldCacheSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides FieldCacheSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides FieldCacheSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.LinearSingleFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.LinearSingleFunction.html",
    "title": "Class LinearSingleFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class LinearSingleFunction LinearSingleFunction implements a linear function over another ValueSource . Normally Used as an argument to a FunctionQuery NOTE: This was LinearFloatFunction in Lucene Inheritance System.Object ValueSource LinearSingleFunction Inherited Members ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class LinearSingleFunction : ValueSource Constructors | Improve this Doc View Source LinearSingleFunction(ValueSource, Single, Single) Declaration public LinearSingleFunction(ValueSource source, float slope, float intercept) Parameters Type Name Description ValueSource source System.Single slope System.Single intercept Fields | Improve this Doc View Source m_intercept Declaration protected readonly float m_intercept Field Value Type Description System.Single | Improve this Doc View Source m_slope Declaration protected readonly float m_slope Field Value Type Description System.Single | Improve this Doc View Source m_source Declaration protected readonly ValueSource m_source Field Value Type Description ValueSource Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.LiteralValueSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.LiteralValueSource.html",
    "title": "Class LiteralValueSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class LiteralValueSource Pass a the field value through as a System.String , no matter the type // Q: doesn't this mean it's a \"str\"? Inheritance System.Object ValueSource LiteralValueSource Inherited Members ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class LiteralValueSource : ValueSource Constructors | Improve this Doc View Source LiteralValueSource(String) Declaration public LiteralValueSource(string str) Parameters Type Name Description System.String str Fields | Improve this Doc View Source hash Declaration public static readonly int hash Field Value Type Description System.Int32 | Improve this Doc View Source m_bytesRef Declaration protected readonly BytesRef m_bytesRef Field Value Type Description Lucene.Net.Util.BytesRef | Improve this Doc View Source m_str Declaration protected readonly string m_str Field Value Type Description System.String Properties | Improve this Doc View Source Value returns the literal value Declaration public virtual string Value { get; } Property Value Type Description System.String Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.MaxDocValueSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.MaxDocValueSource.html",
    "title": "Class MaxDocValueSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class MaxDocValueSource Returns the value of MaxDoc for every document. This is the number of documents including deletions. Inheritance System.Object ValueSource MaxDocValueSource Inherited Members ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class MaxDocValueSource : ValueSource Properties | Improve this Doc View Source Name Declaration public virtual string Name { get; } Property Value Type Description System.String Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.MaxSingleFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.MaxSingleFunction.html",
    "title": "Class MaxSingleFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class MaxSingleFunction MaxSingleFunction returns the max of it's components. NOTE: This was MaxFloatFunction in Lucene Inheritance System.Object ValueSource MultiSingleFunction MaxSingleFunction Inherited Members MultiSingleFunction.m_sources MultiSingleFunction.GetDescription() MultiSingleFunction.GetValues(IDictionary, AtomicReaderContext) MultiSingleFunction.CreateWeight(IDictionary, IndexSearcher) MultiSingleFunction.GetHashCode() MultiSingleFunction.Equals(Object) ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class MaxSingleFunction : MultiSingleFunction Constructors | Improve this Doc View Source MaxSingleFunction(ValueSource[]) Declaration public MaxSingleFunction(ValueSource[] sources) Parameters Type Name Description ValueSource [] sources Properties | Improve this Doc View Source Name Declaration protected override string Name { get; } Property Value Type Description System.String Overrides MultiSingleFunction.Name Methods | Improve this Doc View Source Func(Int32, FunctionValues[]) Declaration protected override float Func(int doc, FunctionValues[] valsArr) Parameters Type Name Description System.Int32 doc FunctionValues [] valsArr Returns Type Description System.Single Overrides MultiSingleFunction.Func(Int32, FunctionValues[])"
  },
  "Lucene.Net.Queries.Function.ValueSources.MinSingleFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.MinSingleFunction.html",
    "title": "Class MinSingleFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class MinSingleFunction MinSingleFunction returns the min of it's components. NOTE: This was MinFloatFunction in Lucene Inheritance System.Object ValueSource MultiSingleFunction MinSingleFunction Inherited Members MultiSingleFunction.m_sources MultiSingleFunction.GetDescription() MultiSingleFunction.GetValues(IDictionary, AtomicReaderContext) MultiSingleFunction.CreateWeight(IDictionary, IndexSearcher) MultiSingleFunction.GetHashCode() MultiSingleFunction.Equals(Object) ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class MinSingleFunction : MultiSingleFunction Constructors | Improve this Doc View Source MinSingleFunction(ValueSource[]) Declaration public MinSingleFunction(ValueSource[] sources) Parameters Type Name Description ValueSource [] sources Properties | Improve this Doc View Source Name Declaration protected override string Name { get; } Property Value Type Description System.String Overrides MultiSingleFunction.Name Methods | Improve this Doc View Source Func(Int32, FunctionValues[]) Declaration protected override float Func(int doc, FunctionValues[] valsArr) Parameters Type Name Description System.Int32 doc FunctionValues [] valsArr Returns Type Description System.Single Overrides MultiSingleFunction.Func(Int32, FunctionValues[])"
  },
  "Lucene.Net.Queries.Function.ValueSources.MultiBoolFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.MultiBoolFunction.html",
    "title": "Class MultiBoolFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class MultiBoolFunction Abstract ValueSource implementation which wraps multiple ValueSource s and applies an extendible System.Boolean function to their values. Inheritance System.Object ValueSource BoolFunction MultiBoolFunction Inherited Members ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public abstract class MultiBoolFunction : BoolFunction Constructors | Improve this Doc View Source MultiBoolFunction(IList<ValueSource>) Declaration protected MultiBoolFunction(IList<ValueSource> sources) Parameters Type Name Description System.Collections.Generic.IList < ValueSource > sources Fields | Improve this Doc View Source m_sources Declaration protected readonly IList<ValueSource> m_sources Field Value Type Description System.Collections.Generic.IList < ValueSource > Properties | Improve this Doc View Source Name Declaration protected abstract string Name { get; } Property Value Type Description System.String Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source Func(Int32, FunctionValues[]) Declaration protected abstract bool Func(int doc, FunctionValues[] vals) Parameters Type Name Description System.Int32 doc FunctionValues [] vals Returns Type Description System.Boolean | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.MultiFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.MultiFunction.html",
    "title": "Class MultiFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class MultiFunction Abstract parent class for ValueSource implementations that wrap multiple ValueSource s and apply their own logic. Inheritance System.Object ValueSource MultiFunction DefFunction Inherited Members ValueSource.GetValues(IDictionary, AtomicReaderContext) ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public abstract class MultiFunction : ValueSource Constructors | Improve this Doc View Source MultiFunction(IList<ValueSource>) Declaration protected MultiFunction(IList<ValueSource> sources) Parameters Type Name Description System.Collections.Generic.IList < ValueSource > sources Fields | Improve this Doc View Source m_sources Declaration protected readonly IList<ValueSource> m_sources Field Value Type Description System.Collections.Generic.IList < ValueSource > Properties | Improve this Doc View Source Name Declaration protected abstract string Name { get; } Property Value Type Description System.String Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetDescription(String, IList<ValueSource>) Declaration public static string GetDescription(string name, IList<ValueSource> sources) Parameters Type Name Description System.String name System.Collections.Generic.IList < ValueSource > sources Returns Type Description System.String | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source ToString(String, FunctionValues[], Int32) Declaration public static string ToString(string name, FunctionValues[] valsArr, int doc) Parameters Type Name Description System.String name FunctionValues [] valsArr System.Int32 doc Returns Type Description System.String | Improve this Doc View Source ValsArr(IList<ValueSource>, IDictionary, AtomicReaderContext) Declaration public static FunctionValues[] ValsArr(IList<ValueSource> sources, IDictionary fcontext, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.Generic.IList < ValueSource > sources System.Collections.IDictionary fcontext Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues []"
  },
  "Lucene.Net.Queries.Function.ValueSources.MultiFunction.Values.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.MultiFunction.Values.html",
    "title": "Class MultiFunction.Values | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class MultiFunction.Values Inheritance System.Object FunctionValues MultiFunction.Values Inherited Members FunctionValues.ByteVal(Int32) FunctionValues.Int16Val(Int32) FunctionValues.SingleVal(Int32) FunctionValues.Int32Val(Int32) FunctionValues.Int64Val(Int32) FunctionValues.DoubleVal(Int32) FunctionValues.StrVal(Int32) FunctionValues.BoolVal(Int32) FunctionValues.BytesVal(Int32, BytesRef) FunctionValues.ObjectVal(Int32) FunctionValues.Exists(Int32) FunctionValues.OrdVal(Int32) FunctionValues.NumOrd FunctionValues.GetValueFiller() FunctionValues.ByteVal(Int32, Byte[]) FunctionValues.Int16Val(Int32, Int16[]) FunctionValues.SingleVal(Int32, Single[]) FunctionValues.Int32Val(Int32, Int32[]) FunctionValues.Int64Val(Int32, Int64[]) FunctionValues.DoubleVal(Int32, Double[]) FunctionValues.StrVal(Int32, String[]) FunctionValues.Explain(Int32) FunctionValues.GetScorer(IndexReader) FunctionValues.GetRangeScorer(IndexReader, String, String, Boolean, Boolean) System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.GetHashCode() System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) System.Object.ToString() Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class Values : FunctionValues Constructors | Improve this Doc View Source Values(MultiFunction, FunctionValues[]) Declaration public Values(MultiFunction outerInstance, FunctionValues[] valsArr) Parameters Type Name Description MultiFunction outerInstance FunctionValues [] valsArr Methods | Improve this Doc View Source ToString(Int32) Declaration public override string ToString(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.String Overrides FunctionValues.ToString(Int32)"
  },
  "Lucene.Net.Queries.Function.ValueSources.MultiSingleFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.MultiSingleFunction.html",
    "title": "Class MultiSingleFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class MultiSingleFunction Abstract ValueSource implementation which wraps multiple ValueSource s and applies an extendible System.Single function to their values. NOTE: This was MultiFloatFunction in Lucene Inheritance System.Object ValueSource MultiSingleFunction MaxSingleFunction MinSingleFunction ProductSingleFunction SumSingleFunction Inherited Members ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public abstract class MultiSingleFunction : ValueSource Constructors | Improve this Doc View Source MultiSingleFunction(ValueSource[]) Declaration protected MultiSingleFunction(ValueSource[] sources) Parameters Type Name Description ValueSource [] sources Fields | Improve this Doc View Source m_sources Declaration protected readonly ValueSource[] m_sources Field Value Type Description ValueSource [] Properties | Improve this Doc View Source Name Declaration protected abstract string Name { get; } Property Value Type Description System.String Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source Func(Int32, FunctionValues[]) Declaration protected abstract float Func(int doc, FunctionValues[] valsArr) Parameters Type Name Description System.Int32 doc FunctionValues [] valsArr Returns Type Description System.Single | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.MultiValueSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.MultiValueSource.html",
    "title": "Class MultiValueSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class MultiValueSource A ValueSource that abstractly represents ValueSource s for poly fields, and other things. Inheritance System.Object ValueSource MultiValueSource VectorValueSource Inherited Members ValueSource.GetValues(IDictionary, AtomicReaderContext) ValueSource.Equals(Object) ValueSource.GetHashCode() ValueSource.GetDescription() ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public abstract class MultiValueSource : ValueSource Properties | Improve this Doc View Source Dimension Declaration public abstract int Dimension { get; } Property Value Type Description System.Int32"
  },
  "Lucene.Net.Queries.Function.ValueSources.NormValueSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.NormValueSource.html",
    "title": "Class NormValueSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class NormValueSource Function that returns DecodeNormValue(Int64) for every document. Note that the configured Similarity for the field must be a subclass of Lucene.Net.Search.Similarities.TFIDFSimilarity This is a Lucene.NET INTERNAL API, use at your own risk Inheritance System.Object ValueSource NormValueSource Inherited Members ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class NormValueSource : ValueSource Constructors | Improve this Doc View Source NormValueSource(String) Declaration public NormValueSource(string field) Parameters Type Name Description System.String field Fields | Improve this Doc View Source m_field Declaration protected readonly string m_field Field Value Type Description System.String Properties | Improve this Doc View Source Name Declaration public virtual string Name { get; } Property Value Type Description System.String Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.NumDocsValueSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.NumDocsValueSource.html",
    "title": "Class NumDocsValueSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class NumDocsValueSource Returns the value of NumDocs for every document. This is the number of documents excluding deletions. Inheritance System.Object ValueSource NumDocsValueSource Inherited Members ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class NumDocsValueSource : ValueSource Properties | Improve this Doc View Source Name Declaration public virtual string Name { get; } Property Value Type Description System.String Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.OrdFieldSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.OrdFieldSource.html",
    "title": "Class OrdFieldSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class OrdFieldSource Obtains the ordinal of the field value from the default Lucene FieldCache using StringIndex. The native lucene index order is used to assign an ordinal value for each field value. Field values (terms) are lexicographically ordered by unicode value, and numbered starting at 1. Example: If there were only three field values: \"apple\",\"banana\",\"pear\" then ord(\"apple\")=1, ord(\"banana\")=2, ord(\"pear\")=3 WARNING: Ord depends on the position in an index and can thus change when other documents are inserted or deleted, or if a MultiSearcher is used. WARNING: as of Solr 1.4, ord() and rord() can cause excess memory use since they must use a FieldCache entry at the top level reader, while sorting and function queries now use entries at the segment level. Hence sorting or using a different function query, in addition to ord()/rord() will double memory use. Inheritance System.Object ValueSource OrdFieldSource Inherited Members ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class OrdFieldSource : ValueSource Constructors | Improve this Doc View Source OrdFieldSource(String) Declaration public OrdFieldSource(string field) Parameters Type Name Description System.String field Fields | Improve this Doc View Source m_field Declaration protected readonly string m_field Field Value Type Description System.String Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.PowSingleFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.PowSingleFunction.html",
    "title": "Class PowSingleFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class PowSingleFunction Function to raise the base \"a\" to the power \"b\" NOTE: This was PowFloatFunction in Lucene Inheritance System.Object ValueSource DualSingleFunction PowSingleFunction Inherited Members DualSingleFunction.m_a DualSingleFunction.m_b DualSingleFunction.GetDescription() DualSingleFunction.GetValues(IDictionary, AtomicReaderContext) DualSingleFunction.CreateWeight(IDictionary, IndexSearcher) DualSingleFunction.GetHashCode() DualSingleFunction.Equals(Object) ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class PowSingleFunction : DualSingleFunction Constructors | Improve this Doc View Source PowSingleFunction(ValueSource, ValueSource) Declaration public PowSingleFunction(ValueSource a, ValueSource b) Parameters Type Name Description ValueSource a the base. ValueSource b the exponent. Properties | Improve this Doc View Source Name Declaration protected override string Name { get; } Property Value Type Description System.String Overrides DualSingleFunction.Name Methods | Improve this Doc View Source Func(Int32, FunctionValues, FunctionValues) Declaration protected override float Func(int doc, FunctionValues aVals, FunctionValues bVals) Parameters Type Name Description System.Int32 doc FunctionValues aVals FunctionValues bVals Returns Type Description System.Single Overrides DualSingleFunction.Func(Int32, FunctionValues, FunctionValues)"
  },
  "Lucene.Net.Queries.Function.ValueSources.ProductSingleFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.ProductSingleFunction.html",
    "title": "Class ProductSingleFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class ProductSingleFunction ProductSingleFunction returns the product of it's components. NOTE: This was ProductFloatFunction in Lucene Inheritance System.Object ValueSource MultiSingleFunction ProductSingleFunction Inherited Members MultiSingleFunction.m_sources MultiSingleFunction.GetDescription() MultiSingleFunction.GetValues(IDictionary, AtomicReaderContext) MultiSingleFunction.CreateWeight(IDictionary, IndexSearcher) MultiSingleFunction.GetHashCode() MultiSingleFunction.Equals(Object) ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class ProductSingleFunction : MultiSingleFunction Constructors | Improve this Doc View Source ProductSingleFunction(ValueSource[]) Declaration public ProductSingleFunction(ValueSource[] sources) Parameters Type Name Description ValueSource [] sources Properties | Improve this Doc View Source Name Declaration protected override string Name { get; } Property Value Type Description System.String Overrides MultiSingleFunction.Name Methods | Improve this Doc View Source Func(Int32, FunctionValues[]) Declaration protected override float Func(int doc, FunctionValues[] valsArr) Parameters Type Name Description System.Int32 doc FunctionValues [] valsArr Returns Type Description System.Single Overrides MultiSingleFunction.Func(Int32, FunctionValues[])"
  },
  "Lucene.Net.Queries.Function.ValueSources.QueryValueSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.QueryValueSource.html",
    "title": "Class QueryValueSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class QueryValueSource QueryValueSource returns the relevance score of the query Inheritance System.Object ValueSource QueryValueSource Inherited Members ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class QueryValueSource : ValueSource Constructors | Improve this Doc View Source QueryValueSource(Query, Single) Declaration public QueryValueSource(Query q, float defVal) Parameters Type Name Description Lucene.Net.Search.Query q System.Single defVal Properties | Improve this Doc View Source DefaultValue Declaration public virtual float DefaultValue { get; } Property Value Type Description System.Single | Improve this Doc View Source Query Declaration public virtual Query Query { get; } Property Value Type Description Lucene.Net.Search.Query Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary fcontext, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary fcontext Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.RangeMapSingleFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.RangeMapSingleFunction.html",
    "title": "Class RangeMapSingleFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class RangeMapSingleFunction RangeMapSingleFunction implements a map function over another ValueSource whose values fall within min and max inclusive to target . Normally used as an argument to a FunctionQuery NOTE: This was RangeMapFloatFunction in Lucene Inheritance System.Object ValueSource RangeMapSingleFunction Inherited Members ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class RangeMapSingleFunction : ValueSource Constructors | Improve this Doc View Source RangeMapSingleFunction(ValueSource, Single, Single, ValueSource, ValueSource) Declaration public RangeMapSingleFunction(ValueSource source, float min, float max, ValueSource target, ValueSource def) Parameters Type Name Description ValueSource source System.Single min System.Single max ValueSource target ValueSource def | Improve this Doc View Source RangeMapSingleFunction(ValueSource, Single, Single, Single, Nullable<Single>) Declaration public RangeMapSingleFunction(ValueSource source, float min, float max, float target, float? def) Parameters Type Name Description ValueSource source System.Single min System.Single max System.Single target System.Nullable < System.Single > def Fields | Improve this Doc View Source m_defaultVal Declaration protected readonly ValueSource m_defaultVal Field Value Type Description ValueSource | Improve this Doc View Source m_max Declaration protected readonly float m_max Field Value Type Description System.Single | Improve this Doc View Source m_min Declaration protected readonly float m_min Field Value Type Description System.Single | Improve this Doc View Source m_source Declaration protected readonly ValueSource m_source Field Value Type Description ValueSource | Improve this Doc View Source m_target Declaration protected readonly ValueSource m_target Field Value Type Description ValueSource Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.ReciprocalSingleFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.ReciprocalSingleFunction.html",
    "title": "Class ReciprocalSingleFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class ReciprocalSingleFunction ReciprocalSingleFunction implements a reciprocal function f(x) = a/(mx+b) , based on the System.Single value of a field or function as exported by ValueSource . When a and b are equal, and x>=0 , this function has a maximum value of 1 that drops as x increases. Increasing the value of a and b together results in a movement of the entire function to a flatter part of the curve. These properties make this an idea function for boosting more recent documents. Example: recip(ms(NOW,mydatefield),3.16e-11,1,1) A multiplier of 3.16e-11 changes the units from milliseconds to years (since there are about 3.16e10 milliseconds per year). Thus, a very recent date will yield a value close to 1/(0+1) or 1, a date a year in the past will get a multiplier of about 1/(1+1) or 1/2, and date two years old will yield 1/(2+1) or 1/3. NOTE: This was ReciprocalFloatFunction in Lucene Inheritance System.Object ValueSource ReciprocalSingleFunction Inherited Members ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class ReciprocalSingleFunction : ValueSource Constructors | Improve this Doc View Source ReciprocalSingleFunction(ValueSource, Single, Single, Single) f(source) = a/(m*float(source)+b) Declaration public ReciprocalSingleFunction(ValueSource source, float m, float a, float b) Parameters Type Name Description ValueSource source System.Single m System.Single a System.Single b Fields | Improve this Doc View Source m_a Declaration protected readonly float m_a Field Value Type Description System.Single | Improve this Doc View Source m_b Declaration protected readonly float m_b Field Value Type Description System.Single | Improve this Doc View Source m_m Declaration protected readonly float m_m Field Value Type Description System.Single | Improve this Doc View Source m_source Declaration protected readonly ValueSource m_source Field Value Type Description ValueSource Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext) See Also FunctionQuery"
  },
  "Lucene.Net.Queries.Function.ValueSources.ReverseOrdFieldSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.ReverseOrdFieldSource.html",
    "title": "Class ReverseOrdFieldSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class ReverseOrdFieldSource Obtains the ordinal of the field value from the default Lucene FieldCache using GetTermsIndex(AtomicReader, String, Single) and reverses the order. The native lucene index order is used to assign an ordinal value for each field value. Field values (terms) are lexicographically ordered by unicode value, and numbered starting at 1. Example of reverse ordinal (rord): If there were only three field values: \"apple\",\"banana\",\"pear\" then rord(\"apple\")=3, rord(\"banana\")=2, ord(\"pear\")=1 WARNING: Ord depends on the position in an index and can thus change when other documents are inserted or deleted, or if a MultiSearcher is used. WARNING: as of Solr 1.4, ord() and rord() can cause excess memory use since they must use a FieldCache entry at the top level reader, while sorting and function queries now use entries at the segment level. Hence sorting or using a different function query, in addition to ord()/rord() will double memory use. Inheritance System.Object ValueSource ReverseOrdFieldSource Inherited Members ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class ReverseOrdFieldSource : ValueSource Constructors | Improve this Doc View Source ReverseOrdFieldSource(String) Declaration public ReverseOrdFieldSource(string field) Parameters Type Name Description System.String field Properties | Improve this Doc View Source Field Declaration public string Field { get; } Property Value Type Description System.String Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.ScaleSingleFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.ScaleSingleFunction.html",
    "title": "Class ScaleSingleFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class ScaleSingleFunction Scales values to be between min and max . This implementation currently traverses all of the source values to obtain their min and max. This implementation currently cannot distinguish when documents have been deleted or documents that have no value, and 0.0 values will be used for these cases. This means that if values are normally all greater than 0.0, one can still end up with 0.0 as the min value to map from. In these cases, an appropriate map() function could be used as a workaround to change 0.0 to a value in the real range. NOTE: This was ScaleFloatFunction in Lucene Inheritance System.Object ValueSource ScaleSingleFunction Inherited Members ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class ScaleSingleFunction : ValueSource Constructors | Improve this Doc View Source ScaleSingleFunction(ValueSource, Single, Single) Declaration public ScaleSingleFunction(ValueSource source, float min, float max) Parameters Type Name Description ValueSource source System.Single min System.Single max Fields | Improve this Doc View Source m_max Declaration protected readonly float m_max Field Value Type Description System.Single | Improve this Doc View Source m_min Declaration protected readonly float m_min Field Value Type Description System.Single | Improve this Doc View Source m_source Declaration protected readonly ValueSource m_source Field Value Type Description ValueSource Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.SimpleBoolFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.SimpleBoolFunction.html",
    "title": "Class SimpleBoolFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class SimpleBoolFunction BoolFunction implementation which applies an extendible System.Boolean function to the values of a single wrapped ValueSource . Functions this can be used for include whether a field has a value or not, or inverting the System.Boolean value of the wrapped ValueSource . Inheritance System.Object ValueSource BoolFunction SimpleBoolFunction Inherited Members ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public abstract class SimpleBoolFunction : BoolFunction Constructors | Improve this Doc View Source SimpleBoolFunction(ValueSource) Declaration protected SimpleBoolFunction(ValueSource source) Parameters Type Name Description ValueSource source Fields | Improve this Doc View Source m_source Declaration protected readonly ValueSource m_source Field Value Type Description ValueSource Properties | Improve this Doc View Source Name Declaration protected abstract string Name { get; } Property Value Type Description System.String Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source Func(Int32, FunctionValues) Declaration protected abstract bool Func(int doc, FunctionValues vals) Parameters Type Name Description System.Int32 doc FunctionValues vals Returns Type Description System.Boolean | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.SimpleSingleFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.SimpleSingleFunction.html",
    "title": "Class SimpleSingleFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class SimpleSingleFunction A simple System.Single function with a single argument NOTE: This was SimpleFloatFunction in Lucene Inheritance System.Object ValueSource SingularFunction SimpleSingleFunction Inherited Members SingularFunction.m_source SingularFunction.Name SingularFunction.GetDescription() SingularFunction.GetHashCode() SingularFunction.Equals(Object) SingularFunction.CreateWeight(IDictionary, IndexSearcher) ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public abstract class SimpleSingleFunction : SingularFunction Constructors | Improve this Doc View Source SimpleSingleFunction(ValueSource) Declaration protected SimpleSingleFunction(ValueSource source) Parameters Type Name Description ValueSource source Methods | Improve this Doc View Source Func(Int32, FunctionValues) Declaration protected abstract float Func(int doc, FunctionValues vals) Parameters Type Name Description System.Int32 doc FunctionValues vals Returns Type Description System.Single | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.SingleFieldSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.SingleFieldSource.html",
    "title": "Class SingleFieldSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class SingleFieldSource Obtains System.Single field values from GetSingles(AtomicReader, String, FieldCache.ISingleParser, Boolean) and makes those values available as other numeric types, casting as needed. NOTE: This was FloatFieldSource in Lucene Inheritance System.Object ValueSource FieldCacheSource SingleFieldSource Inherited Members FieldCacheSource.m_field FieldCacheSource.m_cache FieldCacheSource.FieldCache FieldCacheSource.Field ValueSource.ToString() ValueSource.CreateWeight(IDictionary, IndexSearcher) ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class SingleFieldSource : FieldCacheSource Constructors | Improve this Doc View Source SingleFieldSource(String) Declaration public SingleFieldSource(string field) Parameters Type Name Description System.String field | Improve this Doc View Source SingleFieldSource(String, FieldCache.ISingleParser) Declaration public SingleFieldSource(string field, FieldCache.ISingleParser parser) Parameters Type Name Description System.String field Lucene.Net.Search.FieldCache.ISingleParser parser Fields | Improve this Doc View Source m_parser Declaration protected readonly FieldCache.ISingleParser m_parser Field Value Type Description Lucene.Net.Search.FieldCache.ISingleParser Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides FieldCacheSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides FieldCacheSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides FieldCacheSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.SingularFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.SingularFunction.html",
    "title": "Class SingularFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class SingularFunction A function with a single (one) argument. NOTE: This was SingleFunction in Lucene, changed to avoid conusion with operations on the datatype System.Single . Inheritance System.Object ValueSource SingularFunction SimpleSingleFunction Inherited Members ValueSource.GetValues(IDictionary, AtomicReaderContext) ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public abstract class SingularFunction : ValueSource Constructors | Improve this Doc View Source SingularFunction(ValueSource) Declaration protected SingularFunction(ValueSource source) Parameters Type Name Description ValueSource source Fields | Improve this Doc View Source m_source Declaration protected readonly ValueSource m_source Field Value Type Description ValueSource Properties | Improve this Doc View Source Name Declaration protected abstract string Name { get; } Property Value Type Description System.String Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode()"
  },
  "Lucene.Net.Queries.Function.ValueSources.SumSingleFunction.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.SumSingleFunction.html",
    "title": "Class SumSingleFunction | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class SumSingleFunction SumSingleFunction returns the sum of its components. NOTE: This was SumFloatFunction in Lucene Inheritance System.Object ValueSource MultiSingleFunction SumSingleFunction Inherited Members MultiSingleFunction.m_sources MultiSingleFunction.GetDescription() MultiSingleFunction.GetValues(IDictionary, AtomicReaderContext) MultiSingleFunction.CreateWeight(IDictionary, IndexSearcher) MultiSingleFunction.GetHashCode() MultiSingleFunction.Equals(Object) ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class SumSingleFunction : MultiSingleFunction Constructors | Improve this Doc View Source SumSingleFunction(ValueSource[]) Declaration public SumSingleFunction(ValueSource[] sources) Parameters Type Name Description ValueSource [] sources Properties | Improve this Doc View Source Name Declaration protected override string Name { get; } Property Value Type Description System.String Overrides MultiSingleFunction.Name Methods | Improve this Doc View Source Func(Int32, FunctionValues[]) Declaration protected override float Func(int doc, FunctionValues[] valsArr) Parameters Type Name Description System.Int32 doc FunctionValues [] valsArr Returns Type Description System.Single Overrides MultiSingleFunction.Func(Int32, FunctionValues[])"
  },
  "Lucene.Net.Queries.Function.ValueSources.SumTotalTermFreqValueSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.SumTotalTermFreqValueSource.html",
    "title": "Class SumTotalTermFreqValueSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class SumTotalTermFreqValueSource SumTotalTermFreqValueSource returns the number of tokens. (sum of term freqs across all documents, across all terms). Returns -1 if frequencies were omitted for the field, or if the codec doesn't support this statistic. This is a Lucene.NET INTERNAL API, use at your own risk Inheritance System.Object ValueSource SumTotalTermFreqValueSource Inherited Members ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class SumTotalTermFreqValueSource : ValueSource Constructors | Improve this Doc View Source SumTotalTermFreqValueSource(String) Declaration public SumTotalTermFreqValueSource(string indexedField) Parameters Type Name Description System.String indexedField Fields | Improve this Doc View Source m_indexedField Declaration protected readonly string m_indexedField Field Value Type Description System.String Properties | Improve this Doc View Source Name Declaration public virtual string Name { get; } Property Value Type Description System.String Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.TermFreqValueSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.TermFreqValueSource.html",
    "title": "Class TermFreqValueSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class TermFreqValueSource Function that returns Lucene.Net.Index.DocsEnum.Freq for the supplied term in every document. If the term does not exist in the document, returns 0. If frequencies are omitted, returns 1. Inheritance System.Object ValueSource DocFreqValueSource TermFreqValueSource TFValueSource Inherited Members DocFreqValueSource.m_field DocFreqValueSource.m_indexedField DocFreqValueSource.m_val DocFreqValueSource.m_indexedBytes DocFreqValueSource.GetDescription() DocFreqValueSource.CreateWeight(IDictionary, IndexSearcher) DocFreqValueSource.GetHashCode() DocFreqValueSource.Equals(Object) ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class TermFreqValueSource : DocFreqValueSource Constructors | Improve this Doc View Source TermFreqValueSource(String, String, String, BytesRef) Declaration public TermFreqValueSource(string field, string val, string indexedField, BytesRef indexedBytes) Parameters Type Name Description System.String field System.String val System.String indexedField Lucene.Net.Util.BytesRef indexedBytes Properties | Improve this Doc View Source Name Declaration public override string Name { get; } Property Value Type Description System.String Overrides DocFreqValueSource.Name Methods | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides DocFreqValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.TFValueSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.TFValueSource.html",
    "title": "Class TFValueSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class TFValueSource Function that returns Tf(Single) for every document. Note that the configured Similarity for the field must be a subclass of Lucene.Net.Search.Similarities.TFIDFSimilarity This is a Lucene.NET INTERNAL API, use at your own risk Inheritance System.Object ValueSource DocFreqValueSource TermFreqValueSource TFValueSource Inherited Members DocFreqValueSource.m_field DocFreqValueSource.m_indexedField DocFreqValueSource.m_val DocFreqValueSource.m_indexedBytes DocFreqValueSource.GetDescription() DocFreqValueSource.CreateWeight(IDictionary, IndexSearcher) DocFreqValueSource.GetHashCode() DocFreqValueSource.Equals(Object) ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class TFValueSource : TermFreqValueSource Constructors | Improve this Doc View Source TFValueSource(String, String, String, BytesRef) Declaration public TFValueSource(string field, string val, string indexedField, BytesRef indexedBytes) Parameters Type Name Description System.String field System.String val System.String indexedField Lucene.Net.Util.BytesRef indexedBytes Properties | Improve this Doc View Source Name Declaration public override string Name { get; } Property Value Type Description System.String Overrides TermFreqValueSource.Name Methods | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides TermFreqValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.TotalTermFreqValueSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.TotalTermFreqValueSource.html",
    "title": "Class TotalTermFreqValueSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class TotalTermFreqValueSource TotalTermFreqValueSource returns the total term freq (sum of term freqs across all documents). Returns -1 if frequencies were omitted for the field, or if the codec doesn't support this statistic. This is a Lucene.NET INTERNAL API, use at your own risk Inheritance System.Object ValueSource TotalTermFreqValueSource Inherited Members ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class TotalTermFreqValueSource : ValueSource Constructors | Improve this Doc View Source TotalTermFreqValueSource(String, String, String, BytesRef) Declaration public TotalTermFreqValueSource(string field, string val, string indexedField, BytesRef indexedBytes) Parameters Type Name Description System.String field System.String val System.String indexedField Lucene.Net.Util.BytesRef indexedBytes Fields | Improve this Doc View Source m_field Declaration protected readonly string m_field Field Value Type Description System.String | Improve this Doc View Source m_indexedBytes Declaration protected readonly BytesRef m_indexedBytes Field Value Type Description Lucene.Net.Util.BytesRef | Improve this Doc View Source m_indexedField Declaration protected readonly string m_indexedField Field Value Type Description System.String | Improve this Doc View Source m_val Declaration protected readonly string m_val Field Value Type Description System.String Properties | Improve this Doc View Source Name Declaration public virtual string Name { get; } Property Value Type Description System.String Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSources.VectorValueSource.html": {
    "href": "Lucene.Net.Queries.Function.ValueSources.VectorValueSource.html",
    "title": "Class VectorValueSource | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class VectorValueSource Converts individual ValueSource instances to leverage the FunctionValues *Val functions that work with multiple values, i.e. DoubleVal(Int32, Double[]) Inheritance System.Object ValueSource MultiValueSource VectorValueSource Inherited Members ValueSource.ToString() ValueSource.NewContext(IndexSearcher) ValueSource.GetSortField(Boolean) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Function.ValueSources Assembly : Lucene.Net.Queries.dll Syntax public class VectorValueSource : MultiValueSource Constructors | Improve this Doc View Source VectorValueSource(IList<ValueSource>) Declaration public VectorValueSource(IList<ValueSource> sources) Parameters Type Name Description System.Collections.Generic.IList < ValueSource > sources Fields | Improve this Doc View Source m_sources Declaration protected readonly IList<ValueSource> m_sources Field Value Type Description System.Collections.Generic.IList < ValueSource > Properties | Improve this Doc View Source Dimension Declaration public override int Dimension { get; } Property Value Type Description System.Int32 Overrides MultiValueSource.Dimension | Improve this Doc View Source Name Declaration public virtual string Name { get; } Property Value Type Description System.String | Improve this Doc View Source Sources Declaration public virtual IList<ValueSource> Sources { get; } Property Value Type Description System.Collections.Generic.IList < ValueSource > Methods | Improve this Doc View Source CreateWeight(IDictionary, IndexSearcher) Declaration public override void CreateWeight(IDictionary context, IndexSearcher searcher) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Search.IndexSearcher searcher Overrides ValueSource.CreateWeight(IDictionary, IndexSearcher) | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides ValueSource.Equals(Object) | Improve this Doc View Source GetDescription() Declaration public override string GetDescription() Returns Type Description System.String Overrides ValueSource.GetDescription() | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides ValueSource.GetHashCode() | Improve this Doc View Source GetValues(IDictionary, AtomicReaderContext) Declaration public override FunctionValues GetValues(IDictionary context, AtomicReaderContext readerContext) Parameters Type Name Description System.Collections.IDictionary context Lucene.Net.Index.AtomicReaderContext readerContext Returns Type Description FunctionValues Overrides ValueSource.GetValues(IDictionary, AtomicReaderContext)"
  },
  "Lucene.Net.Queries.Function.ValueSourceScorer.html": {
    "href": "Lucene.Net.Queries.Function.ValueSourceScorer.html",
    "title": "Class ValueSourceScorer | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class ValueSourceScorer Lucene.Net.Search.Scorer which returns the result of SingleVal(Int32) as the score for a document. Inheritance System.Object Lucene.Net.Search.DocIdSetIterator Lucene.Net.Index.DocsEnum Lucene.Net.Search.Scorer ValueSourceScorer Inherited Members Lucene.Net.Search.Scorer.m_weight Lucene.Net.Search.Scorer.Weight Lucene.Net.Search.Scorer.GetChildren() Lucene.Net.Index.DocsEnum.Attributes Lucene.Net.Search.DocIdSetIterator.GetEmpty() Lucene.Net.Search.DocIdSetIterator.NO_MORE_DOCS DocIdSetIterator.SlowAdvance(Int32) System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.GetHashCode() System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) System.Object.ToString() Namespace : Lucene.Net.Queries.Function Assembly : Lucene.Net.Queries.dll Syntax public class ValueSourceScorer : Scorer Constructors | Improve this Doc View Source ValueSourceScorer(IndexReader, FunctionValues) Declaration protected ValueSourceScorer(IndexReader reader, FunctionValues values) Parameters Type Name Description Lucene.Net.Index.IndexReader reader FunctionValues values Fields | Improve this Doc View Source m_checkDeletes Declaration protected bool m_checkDeletes Field Value Type Description System.Boolean | Improve this Doc View Source m_maxDoc Declaration protected readonly int m_maxDoc Field Value Type Description System.Int32 | Improve this Doc View Source m_reader Declaration protected readonly IndexReader m_reader Field Value Type Description Lucene.Net.Index.IndexReader | Improve this Doc View Source m_values Declaration protected readonly FunctionValues m_values Field Value Type Description FunctionValues Properties | Improve this Doc View Source DocID Declaration public override int DocID { get; } Property Value Type Description System.Int32 Overrides Lucene.Net.Search.DocIdSetIterator.DocID | Improve this Doc View Source Freq Declaration public override int Freq { get; } Property Value Type Description System.Int32 Overrides Lucene.Net.Index.DocsEnum.Freq | Improve this Doc View Source Reader Declaration public virtual IndexReader Reader { get; } Property Value Type Description Lucene.Net.Index.IndexReader Methods | Improve this Doc View Source Advance(Int32) Declaration public override int Advance(int target) Parameters Type Name Description System.Int32 target Returns Type Description System.Int32 Overrides DocIdSetIterator.Advance(Int32) | Improve this Doc View Source GetCost() Declaration public override long GetCost() Returns Type Description System.Int64 Overrides Lucene.Net.Search.DocIdSetIterator.GetCost() | Improve this Doc View Source GetScore() Declaration public override float GetScore() Returns Type Description System.Single Overrides Lucene.Net.Search.Scorer.GetScore() | Improve this Doc View Source Matches(Int32) Declaration public virtual bool Matches(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Boolean | Improve this Doc View Source MatchesValue(Int32) Declaration public virtual bool MatchesValue(int doc) Parameters Type Name Description System.Int32 doc Returns Type Description System.Boolean | Improve this Doc View Source NextDoc() Declaration public override int NextDoc() Returns Type Description System.Int32 Overrides Lucene.Net.Search.DocIdSetIterator.NextDoc() | Improve this Doc View Source SetCheckDeletes(Boolean) Declaration public virtual void SetCheckDeletes(bool checkDeletes) Parameters Type Name Description System.Boolean checkDeletes"
  },
  "Lucene.Net.Queries.html": {
    "href": "Lucene.Net.Queries.html",
    "title": "Namespace Lucene.Net.Queries | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Namespace Lucene.Net.Queries <!-- 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. --> Filters and Queries that add to core Lucene. Classes BooleanFilter A container Lucene.Net.Search.Filter that allows Boolean composition of Lucene.Net.Search.Filter s. Lucene.Net.Search.Filter s are allocated into one of three logical constructs; SHOULD, MUST NOT, MUST The results Lucene.Net.Search.Filter BitSet is constructed as follows: SHOULD Filters are OR'd together The resulting Lucene.Net.Search.Filter is NOT'd with the NOT Lucene.Net.Search.Filter s The resulting Lucene.Net.Search.Filter is AND'd with the MUST Lucene.Net.Search.Filter s BoostingQuery The BoostingQuery class can be used to effectively demote results that match a given query. Unlike the \"NOT\" clause, this still selects documents that contain undesirable terms, but reduces their overall score: Query balancedQuery = new BoostingQuery(positiveQuery, negativeQuery, 0.01f); In this scenario the positiveQuery contains the mandatory, desirable criteria which is used to select all matching documents, and the negativeQuery contains the undesirable elements which are simply used to lessen the scores. Documents that match the negativeQuery have their score multiplied by the supplied \"boost\" parameter, so this should be less than 1 to achieve a demoting effect This code was originally made available here: [WWW] http://marc.theaimsgroup.com/?l=lucene-user&m=108058407130459&w=2 and is documented here: http://wiki.apache.org/lucene-java/CommunityContributions ChainedFilter Allows multiple Lucene.Net.Search.Filter s to be chained. Logical operations such as NOT and XOR are applied between filters. One operation can be used for all filters, or a specific operation can be declared for each filter. Order in which filters are called depends on the position of the filter in the chain. It's probably more efficient to place the most restrictive filters/least computationally-intensive filters first. CommonTermsQuery A query that executes high-frequency terms in a optional sub-query to prevent slow queries due to \"common\" terms like stopwords. This query builds 2 queries off the Add(Term) added terms: low-frequency terms are added to a required boolean clause and high-frequency terms are added to an optional boolean clause. The optional clause is only executed if the required \"low-frequency\" clause matches. Scores produced by this query will be slightly different than plain BooleanQuery scorer mainly due to differences in the Coord(Int32, Int32) number of leaf queries in the required boolean clause. In most cases, high-frequency terms are unlikely to significantly contribute to the document score unless at least one of the low-frequency terms are matched. This query can improve query execution times significantly if applicable. CommonTermsQuery has several advantages over stopword filtering at index or query time since a term can be \"classified\" based on the actual document frequency in the index and can prevent slow queries even across domains without specialized stopword files. Note: if the query only contains high-frequency terms the query is rewritten into a plain conjunction query ie. all high-frequency terms need to match in order to match a document. Collection initializer note: To create and populate a CommonTermsQuery in a single statement, you can use the following example as a guide: var query = new CommonTermsQuery() { new Term(\"field\", \"microsoft\"), new Term(\"field\", \"office\") }; CustomScoreProvider An instance of this subclass should be returned by GetCustomScoreProvider(AtomicReaderContext) , if you want to modify the custom score calculation of a CustomScoreQuery . Since Lucene 2.9, queries operate on each segment of an index separately, so the protected m_context field can be used to resolve doc IDs, as the supplied doc ID is per-segment and without knowledge of the Lucene.Net.Index.IndexReader you cannot access the document or Lucene.Net.Search.IFieldCache . This is a Lucene.NET EXPERIMENTAL API, use at your own risk @since 2.9.2 CustomScoreQuery Query that sets document score as a programmatic function of several (sub) scores: the score of its subQuery (any query) (optional) the score of its FunctionQuery (or queries). Subclasses can modify the computation by overriding GetCustomScoreProvider(AtomicReaderContext) . This is a Lucene.NET EXPERIMENTAL API, use at your own risk FilterClause A Lucene.Net.Search.Filter that wrapped with an indication of how that filter is used when composed with another filter. (Follows the boolean logic in BooleanClause for composition of queries.) TermFilter A filter that includes documents that match with a specific term. TermsFilter Constructs a filter for docs matching any of the terms added to this class. Unlike a RangeFilter this can be used for filtering on multiple terms that are not necessarily in a sequence. An example might be a collection of primary keys from a database query result or perhaps a choice of \"category\" labels picked by the end user. As a filter, this is much faster than the equivalent query (a BooleanQuery with many \"should\" TermQuery s)"
  },
  "Lucene.Net.Queries.Mlt.html": {
    "href": "Lucene.Net.Queries.Mlt.html",
    "title": "Namespace Lucene.Net.Queries.Mlt | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Namespace Lucene.Net.Queries.Mlt <!-- 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. --> Document similarity query generators. Classes MoreLikeThis Generate \"more like this\" similarity queries. Based on this mail: Lucene does let you access the document frequency of terms, with DocFreq(Term) . Term frequencies can be computed by re-tokenizing the text, which, for a single document, is usually fast enough. But looking up the DocFreq(Term) of every term in the document is probably too slow. You can use some heuristics to prune the set of terms, to avoid calling DocFreq(Term) too much, or at all. Since you're trying to maximize a tf*idf score, you're probably most interested in terms with a high tf. Choosing a tf threshold even as low as two or three will radically reduce the number of terms under consideration. Another heuristic is that terms with a high idf (i.e., a low df) tend to be longer. So you could threshold the terms by the number of characters, not selecting anything less than, e.g., six or seven characters. With these sorts of heuristics you can usually find small set of, e.g., ten or fewer terms that do a pretty good job of characterizing a document. It all depends on what you're trying to do. If you're trying to eek out that last percent of precision and recall regardless of computational difficulty so that you can win a TREC competition, then the techniques I mention above are useless. But if you're trying to provide a \"more like this\" button on a search results page that does a decent job and has good performance, such techniques might be useful. An efficient, effective \"more-like-this\" query generator would be a great contribution, if anyone's interested. I'd imagine that it would take a Reader or a String (the document's text), analyzer Analyzer, and return a set of representative terms using heuristics like those above. The frequency and length thresholds could be parameters, etc. Doug Initial Usage This class has lots of options to try to make it efficient and flexible. The simplest possible usage is as follows. The bold fragment is specific to this class. IndexReader ir = ... IndexSearcher is = ... MoreLikeThis mlt = new MoreLikeThis(ir); TextReader target = ... // orig source of doc you want to find similarities to Query query = mlt.Like(target); Hits hits = is.Search(query); // now the usual iteration thru 'hits' - the only thing to watch for is to make sure //you ignore the doc if it matches your 'target' document, as it should be similar to itself Thus you: do your normal, Lucene setup for searching, create a MoreLikeThis, get the text of the doc you want to find similarities to then call one of the Like(TextReader, String) calls to generate a similarity query call the searcher to find the similar docs More Advanced Usage You may want to use the setter for FieldNames so you can examine multiple fields (e.g. body and title) for similarity. Depending on the size of your index and the size and makeup of your documents you may want to call the other set methods to control how the similarity queries are generated: MinTermFreq MinDocFreq MaxDocFreq SetMaxDocFreqPct(Int32) MinWordLen MaxWordLen MaxQueryTerms MaxNumTokensParsed StopWords MoreLikeThisQuery A simple wrapper for MoreLikeThis for use in scenarios where a Lucene.Net.Search.Query object is required eg in custom QueryParser extensions. At query.Rewrite() time the reader is used to construct the actual MoreLikeThis object and obtain the real Lucene.Net.Search.Query object."
  },
  "Lucene.Net.Queries.Mlt.MoreLikeThis.html": {
    "href": "Lucene.Net.Queries.Mlt.MoreLikeThis.html",
    "title": "Class MoreLikeThis | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class MoreLikeThis Generate \"more like this\" similarity queries. Based on this mail: Lucene does let you access the document frequency of terms, with DocFreq(Term) . Term frequencies can be computed by re-tokenizing the text, which, for a single document, is usually fast enough. But looking up the DocFreq(Term) of every term in the document is probably too slow. You can use some heuristics to prune the set of terms, to avoid calling DocFreq(Term) too much, or at all. Since you're trying to maximize a tf*idf score, you're probably most interested in terms with a high tf. Choosing a tf threshold even as low as two or three will radically reduce the number of terms under consideration. Another heuristic is that terms with a high idf (i.e., a low df) tend to be longer. So you could threshold the terms by the number of characters, not selecting anything less than, e.g., six or seven characters. With these sorts of heuristics you can usually find small set of, e.g., ten or fewer terms that do a pretty good job of characterizing a document. It all depends on what you're trying to do. If you're trying to eek out that last percent of precision and recall regardless of computational difficulty so that you can win a TREC competition, then the techniques I mention above are useless. But if you're trying to provide a \"more like this\" button on a search results page that does a decent job and has good performance, such techniques might be useful. An efficient, effective \"more-like-this\" query generator would be a great contribution, if anyone's interested. I'd imagine that it would take a Reader or a String (the document's text), analyzer Analyzer, and return a set of representative terms using heuristics like those above. The frequency and length thresholds could be parameters, etc. Doug Initial Usage This class has lots of options to try to make it efficient and flexible. The simplest possible usage is as follows. The bold fragment is specific to this class. IndexReader ir = ... IndexSearcher is = ... MoreLikeThis mlt = new MoreLikeThis(ir); TextReader target = ... // orig source of doc you want to find similarities to Query query = mlt.Like(target); Hits hits = is.Search(query); // now the usual iteration thru 'hits' - the only thing to watch for is to make sure //you ignore the doc if it matches your 'target' document, as it should be similar to itself Thus you: do your normal, Lucene setup for searching, create a MoreLikeThis, get the text of the doc you want to find similarities to then call one of the Like(TextReader, String) calls to generate a similarity query call the searcher to find the similar docs More Advanced Usage You may want to use the setter for FieldNames so you can examine multiple fields (e.g. body and title) for similarity. Depending on the size of your index and the size and makeup of your documents you may want to call the other set methods to control how the similarity queries are generated: MinTermFreq MinDocFreq MaxDocFreq SetMaxDocFreqPct(Int32) MinWordLen MaxWordLen MaxQueryTerms MaxNumTokensParsed StopWords Inheritance System.Object MoreLikeThis Inherited Members System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.GetHashCode() System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) System.Object.ToString() Namespace : Lucene.Net.Queries.Mlt Assembly : Lucene.Net.Queries.dll Syntax public sealed class MoreLikeThis Remarks Changes: Mark Harwood 29/02/04 Some bugfixing, some refactoring, some optimisation. bugfix: retrieveTerms(int docNum) was not working for indexes without a termvector -added missing code bugfix: No significant terms being created for fields with a termvector - because was only counting one occurrence per term/field pair in calculations(ie not including frequency info from TermVector) refactor: moved common code into isNoiseWord() optimise: when no termvector support available - used maxNumTermsParsed to limit amount of tokenization Constructors | Improve this Doc View Source MoreLikeThis(IndexReader) Constructor requiring an Lucene.Net.Index.IndexReader . Declaration public MoreLikeThis(IndexReader ir) Parameters Type Name Description Lucene.Net.Index.IndexReader ir | Improve this Doc View Source MoreLikeThis(IndexReader, TFIDFSimilarity) Declaration public MoreLikeThis(IndexReader ir, TFIDFSimilarity sim) Parameters Type Name Description Lucene.Net.Index.IndexReader ir Lucene.Net.Search.Similarities.TFIDFSimilarity sim Fields | Improve this Doc View Source DEFAULT_BOOST Boost terms in query based on score. Declaration public static readonly bool DEFAULT_BOOST Field Value Type Description System.Boolean See Also ApplyBoost | Improve this Doc View Source DEFAULT_FIELD_NAMES Default field names. Null is used to specify that the field names should be looked up at runtime from the provided reader. Declaration public static readonly string[] DEFAULT_FIELD_NAMES Field Value Type Description System.String [] | Improve this Doc View Source DEFAULT_MAX_DOC_FREQ Ignore words which occur in more than this many docs. Declaration public static readonly int DEFAULT_MAX_DOC_FREQ Field Value Type Description System.Int32 See Also MaxDocFreq SetMaxDocFreqPct(Int32) | Improve this Doc View Source DEFAULT_MAX_NUM_TOKENS_PARSED Default maximum number of tokens to parse in each example doc field that is not stored with TermVector support. Declaration public static readonly int DEFAULT_MAX_NUM_TOKENS_PARSED Field Value Type Description System.Int32 See Also MaxNumTokensParsed | Improve this Doc View Source DEFAULT_MAX_QUERY_TERMS Return a Query with no more than this many terms. Declaration public static readonly int DEFAULT_MAX_QUERY_TERMS Field Value Type Description System.Int32 See Also MaxClauseCount MaxQueryTerms | Improve this Doc View Source DEFAULT_MAX_WORD_LENGTH Ignore words greater than this length or if 0 then this has no effect. Declaration public static readonly int DEFAULT_MAX_WORD_LENGTH Field Value Type Description System.Int32 See Also MaxWordLen | Improve this Doc View Source DEFAULT_MIN_DOC_FREQ Ignore words which do not occur in at least this many docs. Declaration public static readonly int DEFAULT_MIN_DOC_FREQ Field Value Type Description System.Int32 See Also MinDocFreq | Improve this Doc View Source DEFAULT_MIN_TERM_FREQ Ignore terms with less than this frequency in the source doc. Declaration public static readonly int DEFAULT_MIN_TERM_FREQ Field Value Type Description System.Int32 See Also MinTermFreq | Improve this Doc View Source DEFAULT_MIN_WORD_LENGTH Ignore words less than this length or if 0 then this has no effect. Declaration public static readonly int DEFAULT_MIN_WORD_LENGTH Field Value Type Description System.Int32 See Also MinWordLen | Improve this Doc View Source DEFAULT_STOP_WORDS Default set of stopwords. If null means to allow stop words. Declaration public static readonly ISet<string> DEFAULT_STOP_WORDS Field Value Type Description System.Collections.Generic.ISet < System.String > See Also StopWords Properties | Improve this Doc View Source Analyzer Gets or Sets an analyzer that will be used to parse source doc with. The default analyzer is not set. An analyzer is not required for generating a query with the Like(Int32) method, all other 'like' methods require an analyzer. Declaration public Analyzer Analyzer { get; set; } Property Value Type Description Lucene.Net.Analysis.Analyzer | Improve this Doc View Source ApplyBoost Gets or Sets whether to boost terms in query based on \"score\" or not. The default is DEFAULT_BOOST . Declaration public bool ApplyBoost { get; set; } Property Value Type Description System.Boolean | Improve this Doc View Source BoostFactor Gets or Sets the boost factor used when boosting terms Declaration public float BoostFactor { get; set; } Property Value Type Description System.Single | Improve this Doc View Source FieldNames Gets or Sets the field names that will be used when generating the 'More Like This' query. The default field names that will be used is DEFAULT_FIELD_NAMES . Set this to null for the field names to be determined at runtime from the Lucene.Net.Index.IndexReader provided in the constructor. Declaration public string[] FieldNames { get; set; } Property Value Type Description System.String [] | Improve this Doc View Source MaxDocFreq Gets or Sets the maximum frequency in which words may still appear. Words that appear in more than this many docs will be ignored. The default frequency is DEFAULT_MAX_DOC_FREQ . Declaration public int MaxDocFreq { get; set; } Property Value Type Description System.Int32 | Improve this Doc View Source MaxNumTokensParsed Declaration public int MaxNumTokensParsed { get; set; } Property Value Type Description System.Int32 Gets or Sets the maximum number of tokens to parse in each example doc field that is not stored with TermVector support See Also DEFAULT_MAX_NUM_TOKENS_PARSED | Improve this Doc View Source MaxQueryTerms Gets or Sets the maximum number of query terms that will be included in any generated query. The default is DEFAULT_MAX_QUERY_TERMS . Declaration public int MaxQueryTerms { get; set; } Property Value Type Description System.Int32 | Improve this Doc View Source MaxWordLen Gets or Sets the maximum word length above which words will be ignored. Set this to 0 for no maximum word length. The default is DEFAULT_MAX_WORD_LENGTH . Declaration public int MaxWordLen { get; set; } Property Value Type Description System.Int32 | Improve this Doc View Source MinDocFreq Gets or Sets the frequency at which words will be ignored which do not occur in at least this many docs. The default frequency is DEFAULT_MIN_DOC_FREQ . Declaration public int MinDocFreq { get; set; } Property Value Type Description System.Int32 | Improve this Doc View Source MinTermFreq Gets or Sets the frequency below which terms will be ignored in the source doc. The default frequency is the DEFAULT_MIN_TERM_FREQ . Declaration public int MinTermFreq { get; set; } Property Value Type Description System.Int32 | Improve this Doc View Source MinWordLen Gets or Sets the minimum word length below which words will be ignored. Set this to 0 for no minimum word length. The default is DEFAULT_MIN_WORD_LENGTH . Declaration public int MinWordLen { get; set; } Property Value Type Description System.Int32 | Improve this Doc View Source Similarity For idf() calculations. Declaration public TFIDFSimilarity Similarity { get; set; } Property Value Type Description Lucene.Net.Search.Similarities.TFIDFSimilarity | Improve this Doc View Source StopWords Gets or Sets the set of stopwords. Any word in this set is considered \"uninteresting\" and ignored. Even if your Lucene.Net.Analysis.Analyzer allows stopwords, you might want to tell the MoreLikeThis code to ignore them, as for the purposes of document similarity it seems reasonable to assume that \"a stop word is never interesting\". Declaration public ISet<string> StopWords { get; set; } Property Value Type Description System.Collections.Generic.ISet < System.String > Methods | Improve this Doc View Source DescribeParams() Describe the parameters that control how the \"more like this\" query is formed. Declaration public string DescribeParams() Returns Type Description System.String | Improve this Doc View Source Like(Int32) Return a query that will return docs like the passed lucene document ID. Declaration public Query Like(int docNum) Parameters Type Name Description System.Int32 docNum the documentID of the lucene doc to generate the 'More Like This\" query for. Returns Type Description Lucene.Net.Search.Query a query that will return docs like the passed lucene document ID. | Improve this Doc View Source Like(TextReader, String) Return a query that will return docs like the passed System.IO.TextReader . Declaration public Query Like(TextReader r, string fieldName) Parameters Type Name Description System.IO.TextReader r System.String fieldName Returns Type Description Lucene.Net.Search.Query a query that will return docs like the passed System.IO.TextReader . | Improve this Doc View Source RetrieveInterestingTerms(Int32) Declaration public string[] RetrieveInterestingTerms(int docNum) Parameters Type Name Description System.Int32 docNum Returns Type Description System.String [] See Also RetrieveInterestingTerms(TextReader, String) | Improve this Doc View Source RetrieveInterestingTerms(TextReader, String) Convenience routine to make it easy to return the most interesting words in a document. More advanced users will call RetrieveTerms(TextReader, String) directly. Declaration public string[] RetrieveInterestingTerms(TextReader r, string fieldName) Parameters Type Name Description System.IO.TextReader r the source document System.String fieldName field passed to analyzer to use when analyzing the content Returns Type Description System.String [] the most interesting words in the document See Also RetrieveTerms(TextReader, String) MaxQueryTerms | Improve this Doc View Source RetrieveTerms(Int32) Find words for a more-like-this query former. Declaration public PriorityQueue<object[]> RetrieveTerms(int docNum) Parameters Type Name Description System.Int32 docNum the id of the lucene document from which to find terms Returns Type Description Lucene.Net.Util.PriorityQueue < System.Object []> Exceptions Type Condition System.IO.IOException | Improve this Doc View Source RetrieveTerms(TextReader, String) Find words for a more-like-this query former. The result is a priority queue of arrays with one entry for every word in the document. Each array has 6 elements. The elements are: The word ( System.String ) The top field that this word comes from ( System.String ) The score for this word ( System.Single ) The IDF value ( System.Single ) The frequency of this word in the index ( System.Int32 ) The frequency of this word in the source document ( System.Int32 ) This is a somewhat \"advanced\" routine, and in general only the 1st entry in the array is of interest. This method is exposed so that you can identify the \"interesting words\" in a document. For an easier method to call see RetrieveInterestingTerms(TextReader, String) . Declaration public PriorityQueue<object[]> RetrieveTerms(TextReader r, string fieldName) Parameters Type Name Description System.IO.TextReader r the reader that has the content of the document System.String fieldName field passed to the analyzer to use when analyzing the content Returns Type Description Lucene.Net.Util.PriorityQueue < System.Object []> the most interesting words in the document ordered by score, with the highest scoring, or best entry, first Exceptions Type Condition System.IO.IOException See Also RetrieveInterestingTerms(TextReader, String) | Improve this Doc View Source SetMaxDocFreqPct(Int32) Set the maximum percentage in which words may still appear. Words that appear in more than this many percent of all docs will be ignored. Declaration public void SetMaxDocFreqPct(int maxPercentage) Parameters Type Name Description System.Int32 maxPercentage the maximum percentage of documents (0-100) that a term may appear in to be still considered relevant"
  },
  "Lucene.Net.Queries.Mlt.MoreLikeThisQuery.html": {
    "href": "Lucene.Net.Queries.Mlt.MoreLikeThisQuery.html",
    "title": "Class MoreLikeThisQuery | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class MoreLikeThisQuery A simple wrapper for MoreLikeThis for use in scenarios where a Lucene.Net.Search.Query object is required eg in custom QueryParser extensions. At query.Rewrite() time the reader is used to construct the actual MoreLikeThis object and obtain the real Lucene.Net.Search.Query object. Inheritance System.Object Lucene.Net.Search.Query MoreLikeThisQuery Inherited Members Lucene.Net.Search.Query.Boost Lucene.Net.Search.Query.ToString() Lucene.Net.Search.Query.CreateWeight(Lucene.Net.Search.IndexSearcher) Query.ExtractTerms(ISet<Term>) Lucene.Net.Search.Query.Clone() System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries.Mlt Assembly : Lucene.Net.Queries.dll Syntax public class MoreLikeThisQuery : Query Constructors | Improve this Doc View Source MoreLikeThisQuery(String, String[], Analyzer, String) Declaration public MoreLikeThisQuery(string likeText, string[] moreLikeFields, Analyzer analyzer, string fieldName) Parameters Type Name Description System.String likeText System.String [] moreLikeFields fields used for similarity measure Lucene.Net.Analysis.Analyzer analyzer System.String fieldName Properties | Improve this Doc View Source Analyzer Declaration public virtual Analyzer Analyzer { get; set; } Property Value Type Description Lucene.Net.Analysis.Analyzer | Improve this Doc View Source LikeText Declaration public virtual string LikeText { get; set; } Property Value Type Description System.String | Improve this Doc View Source MaxQueryTerms Declaration public virtual int MaxQueryTerms { get; set; } Property Value Type Description System.Int32 | Improve this Doc View Source MinDocFreq Declaration public virtual int MinDocFreq { get; set; } Property Value Type Description System.Int32 | Improve this Doc View Source MinTermFrequency Declaration public virtual int MinTermFrequency { get; set; } Property Value Type Description System.Int32 | Improve this Doc View Source MoreLikeFields Declaration public virtual string[] MoreLikeFields { get; set; } Property Value Type Description System.String [] | Improve this Doc View Source PercentTermsToMatch Declaration public virtual float PercentTermsToMatch { get; set; } Property Value Type Description System.Single | Improve this Doc View Source StopWords Declaration public virtual ISet<string> StopWords { get; set; } Property Value Type Description System.Collections.Generic.ISet < System.String > Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object obj) Parameters Type Name Description System.Object obj Returns Type Description System.Boolean Overrides Query.Equals(Object) | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides Lucene.Net.Search.Query.GetHashCode() | Improve this Doc View Source Rewrite(IndexReader) Declaration public override Query Rewrite(IndexReader reader) Parameters Type Name Description Lucene.Net.Index.IndexReader reader Returns Type Description Lucene.Net.Search.Query Overrides Lucene.Net.Search.Query.Rewrite(Lucene.Net.Index.IndexReader) | Improve this Doc View Source ToString(String) ToString(String) Declaration public override string ToString(string field) Parameters Type Name Description System.String field Returns Type Description System.String Overrides Query.ToString(String)"
  },
  "Lucene.Net.Queries.TermFilter.html": {
    "href": "Lucene.Net.Queries.TermFilter.html",
    "title": "Class TermFilter | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class TermFilter A filter that includes documents that match with a specific term. Inheritance System.Object Lucene.Net.Search.Filter TermFilter Inherited Members Filter.NewAnonymous(Func<AtomicReaderContext, IBits, DocIdSet>) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries Assembly : Lucene.Net.Queries.dll Syntax public sealed class TermFilter : Filter Constructors | Improve this Doc View Source TermFilter(Term) Declaration public TermFilter(Term term) Parameters Type Name Description Lucene.Net.Index.Term term The term documents need to have in order to be a match for this filter. Properties | Improve this Doc View Source Term Gets the term this filter includes documents with. Declaration public Term Term { get; } Property Value Type Description Lucene.Net.Index.Term Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object o) Parameters Type Name Description System.Object o Returns Type Description System.Boolean Overrides System.Object.Equals(System.Object) | Improve this Doc View Source GetDocIdSet(AtomicReaderContext, IBits) Declaration public override DocIdSet GetDocIdSet(AtomicReaderContext context, IBits acceptDocs) Parameters Type Name Description Lucene.Net.Index.AtomicReaderContext context Lucene.Net.Util.IBits acceptDocs Returns Type Description Lucene.Net.Search.DocIdSet Overrides Lucene.Net.Search.Filter.GetDocIdSet(Lucene.Net.Index.AtomicReaderContext, Lucene.Net.Util.IBits) | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides System.Object.GetHashCode() | Improve this Doc View Source ToString() Declaration public override string ToString() Returns Type Description System.String Overrides System.Object.ToString()"
  },
  "Lucene.Net.Queries.TermsFilter.html": {
    "href": "Lucene.Net.Queries.TermsFilter.html",
    "title": "Class TermsFilter | Apache Lucene.NET 4.8.0-beta00013 Documentation",
    "keywords": "Class TermsFilter Constructs a filter for docs matching any of the terms added to this class. Unlike a RangeFilter this can be used for filtering on multiple terms that are not necessarily in a sequence. An example might be a collection of primary keys from a database query result or perhaps a choice of \"category\" labels picked by the end user. As a filter, this is much faster than the equivalent query (a BooleanQuery with many \"should\" TermQuery s) Inheritance System.Object Lucene.Net.Search.Filter TermsFilter Inherited Members Filter.NewAnonymous(Func<AtomicReaderContext, IBits, DocIdSet>) System.Object.Equals(System.Object, System.Object) System.Object.GetType() System.Object.MemberwiseClone() System.Object.ReferenceEquals(System.Object, System.Object) Namespace : Lucene.Net.Queries Assembly : Lucene.Net.Queries.dll Syntax public sealed class TermsFilter : Filter Constructors | Improve this Doc View Source TermsFilter(Term[]) Creates a new TermsFilter from the given array. The array can contain duplicate terms and multiple fields. Declaration public TermsFilter(params Term[] terms) Parameters Type Name Description Lucene.Net.Index.Term [] terms | Improve this Doc View Source TermsFilter(IList<Term>) Creates a new TermsFilter from the given list. The list can contain duplicate terms and multiple fields. Declaration public TermsFilter(IList<Term> terms) Parameters Type Name Description System.Collections.Generic.IList < Lucene.Net.Index.Term > terms | Improve this Doc View Source TermsFilter(String, BytesRef[]) Creates a new TermsFilter from the given Lucene.Net.Util.BytesRef array for a single field. Declaration public TermsFilter(string field, params BytesRef[] terms) Parameters Type Name Description System.String field Lucene.Net.Util.BytesRef [] terms | Improve this Doc View Source TermsFilter(String, IList<BytesRef>) Creates a new TermsFilter from the given Lucene.Net.Util.BytesRef list for a single field. Declaration public TermsFilter(string field, IList<BytesRef> terms) Parameters Type Name Description System.String field System.Collections.Generic.IList < Lucene.Net.Util.BytesRef > terms Methods | Improve this Doc View Source Equals(Object) Declaration public override bool Equals(object obj) Parameters Type Name Description System.Object obj Returns Type Description System.Boolean Overrides System.Object.Equals(System.Object) | Improve this Doc View Source GetDocIdSet(AtomicReaderContext, IBits) Declaration public override DocIdSet GetDocIdSet(AtomicReaderContext context, IBits acceptDocs) Parameters Type Name Description Lucene.Net.Index.AtomicReaderContext context Lucene.Net.Util.IBits acceptDocs Returns Type Description Lucene.Net.Search.DocIdSet Overrides Lucene.Net.Search.Filter.GetDocIdSet(Lucene.Net.Index.AtomicReaderContext, Lucene.Net.Util.IBits) | Improve this Doc View Source GetHashCode() Declaration public override int GetHashCode() Returns Type Description System.Int32 Overrides System.Object.GetHashCode() | Improve this Doc View Source ToString() Declaration public override string ToString() Returns Type Description System.String Overrides System.Object.ToString()"
  }
}