diff options
Diffstat (limited to 'src/core/Search/Searcher.cs')
-rw-r--r-- | src/core/Search/Searcher.cs | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/src/core/Search/Searcher.cs b/src/core/Search/Searcher.cs new file mode 100644 index 0000000..a545e11 --- /dev/null +++ b/src/core/Search/Searcher.cs @@ -0,0 +1,192 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using Lucene.Net.Documents; +using Document = Lucene.Net.Documents.Document; +using CorruptIndexException = Lucene.Net.Index.CorruptIndexException; +using Term = Lucene.Net.Index.Term; + +namespace Lucene.Net.Search +{ + + /// <summary> An abstract base class for search implementations. Implements the main search + /// methods. + /// + /// <p/> + /// Note that you can only access hits from a Searcher as long as it is not yet + /// closed, otherwise an IOException will be thrown. + /// </summary> + public abstract class Searcher : System.MarshalByRefObject, Searchable, System.IDisposable + { + protected Searcher() + { + InitBlock(); + } + private void InitBlock() + { + similarity = Net.Search.Similarity.Default; + } + + /// <summary>Search implementation with arbitrary sorting. Finds + /// the top <c>n</c> hits for <c>query</c>, applying + /// <c>filter</c> if non-null, and sorting the hits by the criteria in + /// <c>sort</c>. + /// + /// <p/>NOTE: this does not compute scores by default; use + /// <see cref="IndexSearcher.SetDefaultFieldSortScoring(bool,bool)" /> to enable scoring. + /// + /// </summary> + /// <throws> BooleanQuery.TooManyClauses </throws> + public virtual TopFieldDocs Search(Query query, Filter filter, int n, Sort sort) + { + return Search(CreateWeight(query), filter, n, sort); + } + + /// <summary>Lower-level search API. + /// + /// <p/><see cref="Collector.Collect(int)" /> is called for every matching document. + /// + /// <p/>Applications should only use this if they need <i>all</i> of the matching + /// documents. The high-level search API (<see cref="Searcher.Search(Query, int)" /> + /// ) is usually more efficient, as it skips non-high-scoring hits. + /// <p/>Note: The <c>score</c> passed to this method is a raw score. + /// In other words, the score will not necessarily be a float whose value is + /// between 0 and 1. + /// </summary> + /// <throws> BooleanQuery.TooManyClauses </throws> + public virtual void Search(Query query, Collector results) + { + Search(CreateWeight(query), null, results); + } + + /// <summary>Lower-level search API. + /// + /// <p/><see cref="Collector.Collect(int)" /> is called for every matching + /// document. + /// <br/>Collector-based access to remote indexes is discouraged. + /// + /// <p/>Applications should only use this if they need <i>all</i> of the + /// matching documents. The high-level search API (<see cref="Searcher.Search(Query, Filter, int)" />) + /// is usually more efficient, as it skips + /// non-high-scoring hits. + /// + /// </summary> + /// <param name="query">to match documents + /// </param> + /// <param name="filter">if non-null, used to permit documents to be collected. + /// </param> + /// <param name="results">to receive hits + /// </param> + /// <throws> BooleanQuery.TooManyClauses </throws> + public virtual void Search(Query query, Filter filter, Collector results) + { + Search(CreateWeight(query), filter, results); + } + + /// <summary>Finds the top <c>n</c> + /// hits for <c>query</c>, applying <c>filter</c> if non-null. + /// + /// </summary> + /// <throws> BooleanQuery.TooManyClauses </throws> + public virtual TopDocs Search(Query query, Filter filter, int n) + { + return Search(CreateWeight(query), filter, n); + } + + /// <summary>Finds the top <c>n</c> + /// hits for <c>query</c>. + /// + /// </summary> + /// <throws> BooleanQuery.TooManyClauses </throws> + public virtual TopDocs Search(Query query, int n) + { + return Search(query, null, n); + } + + /// <summary>Returns an Explanation that describes how <c>doc</c> scored against + /// <c>query</c>. + /// + /// <p/>This is intended to be used in developing Similarity implementations, + /// and, for good performance, should not be displayed with every hit. + /// Computing an explanation is as expensive as executing the query over the + /// entire index. + /// </summary> + public virtual Explanation Explain(Query query, int doc) + { + return Explain(CreateWeight(query), doc); + } + + /// <summary>The Similarity implementation used by this searcher. </summary> + private Similarity similarity; + + /// <summary>Expert: Gets or Sets the Similarity implementation used by this Searcher. + /// + /// </summary> + /// <seealso cref="Lucene.Net.Search.Similarity.Default"> + /// </seealso> + public virtual Similarity Similarity + { + get { return this.similarity; } + set { this.similarity = value; } + } + + /// <summary> creates a weight for <c>query</c></summary> + /// <returns> new weight + /// </returns> + public /*protected internal*/ virtual Weight CreateWeight(Query query) + { + return query.Weight(this); + } + + // inherit javadoc + public virtual int[] DocFreqs(Term[] terms) + { + int[] result = new int[terms.Length]; + for (int i = 0; i < terms.Length; i++) + { + result[i] = DocFreq(terms[i]); + } + return result; + } + + public abstract void Search(Weight weight, Filter filter, Collector results); + + [Obsolete("Use Dispose() instead")] + public void Close() + { + Dispose(); + } + + public void Dispose() + { + Dispose(true); + } + + protected abstract void Dispose(bool disposing); + + public abstract int DocFreq(Term term); + public abstract int MaxDoc { get; } + public abstract TopDocs Search(Weight weight, Filter filter, int n); + public abstract Document Doc(int i); + public abstract Document Doc(int docid, FieldSelector fieldSelector); + public abstract Query Rewrite(Query query); + public abstract Explanation Explain(Weight weight, int doc); + public abstract TopFieldDocs Search(Weight weight, Filter filter, int n, Sort sort); + /* End patch for GCJ bug #15411. */ + } +}
\ No newline at end of file |