1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 using System; 19 using Lucene.Net.Documents; 20 using Document = Lucene.Net.Documents.Document; 21 using CorruptIndexException = Lucene.Net.Index.CorruptIndexException; 22 using Term = Lucene.Net.Index.Term; 23 24 namespace Lucene.Net.Search 25 { 26 27 /// <summary> An abstract base class for search implementations. Implements the main search 28 /// methods. 29 /// 30 /// <p/> 31 /// Note that you can only access hits from a Searcher as long as it is not yet 32 /// closed, otherwise an IOException will be thrown. 33 /// </summary> 34 public abstract class Searcher : System.MarshalByRefObject, Searchable, System.IDisposable 35 { Searcher()36 protected Searcher() 37 { 38 InitBlock(); 39 } InitBlock()40 private void InitBlock() 41 { 42 similarity = Net.Search.Similarity.Default; 43 } 44 45 /// <summary>Search implementation with arbitrary sorting. Finds 46 /// the top <c>n</c> hits for <c>query</c>, applying 47 /// <c>filter</c> if non-null, and sorting the hits by the criteria in 48 /// <c>sort</c>. 49 /// 50 /// <p/>NOTE: this does not compute scores by default; use 51 /// <see cref="IndexSearcher.SetDefaultFieldSortScoring(bool,bool)" /> to enable scoring. 52 /// 53 /// </summary> 54 /// <throws> BooleanQuery.TooManyClauses </throws> Search(Query query, Filter filter, int n, Sort sort)55 public virtual TopFieldDocs Search(Query query, Filter filter, int n, Sort sort) 56 { 57 return Search(CreateWeight(query), filter, n, sort); 58 } 59 60 /// <summary>Lower-level search API. 61 /// 62 /// <p/><see cref="Collector.Collect(int)" /> is called for every matching document. 63 /// 64 /// <p/>Applications should only use this if they need <i>all</i> of the matching 65 /// documents. The high-level search API (<see cref="Searcher.Search(Query, int)" /> 66 /// ) is usually more efficient, as it skips non-high-scoring hits. 67 /// <p/>Note: The <c>score</c> passed to this method is a raw score. 68 /// In other words, the score will not necessarily be a float whose value is 69 /// between 0 and 1. 70 /// </summary> 71 /// <throws> BooleanQuery.TooManyClauses </throws> Search(Query query, Collector results)72 public virtual void Search(Query query, Collector results) 73 { 74 Search(CreateWeight(query), null, results); 75 } 76 77 /// <summary>Lower-level search API. 78 /// 79 /// <p/><see cref="Collector.Collect(int)" /> is called for every matching 80 /// document. 81 /// <br/>Collector-based access to remote indexes is discouraged. 82 /// 83 /// <p/>Applications should only use this if they need <i>all</i> of the 84 /// matching documents. The high-level search API (<see cref="Searcher.Search(Query, Filter, int)" />) 85 /// is usually more efficient, as it skips 86 /// non-high-scoring hits. 87 /// 88 /// </summary> 89 /// <param name="query">to match documents 90 /// </param> 91 /// <param name="filter">if non-null, used to permit documents to be collected. 92 /// </param> 93 /// <param name="results">to receive hits 94 /// </param> 95 /// <throws> BooleanQuery.TooManyClauses </throws> Search(Query query, Filter filter, Collector results)96 public virtual void Search(Query query, Filter filter, Collector results) 97 { 98 Search(CreateWeight(query), filter, results); 99 } 100 101 /// <summary>Finds the top <c>n</c> 102 /// hits for <c>query</c>, applying <c>filter</c> if non-null. 103 /// 104 /// </summary> 105 /// <throws> BooleanQuery.TooManyClauses </throws> Search(Query query, Filter filter, int n)106 public virtual TopDocs Search(Query query, Filter filter, int n) 107 { 108 return Search(CreateWeight(query), filter, n); 109 } 110 111 /// <summary>Finds the top <c>n</c> 112 /// hits for <c>query</c>. 113 /// 114 /// </summary> 115 /// <throws> BooleanQuery.TooManyClauses </throws> Search(Query query, int n)116 public virtual TopDocs Search(Query query, int n) 117 { 118 return Search(query, null, n); 119 } 120 121 /// <summary>Returns an Explanation that describes how <c>doc</c> scored against 122 /// <c>query</c>. 123 /// 124 /// <p/>This is intended to be used in developing Similarity implementations, 125 /// and, for good performance, should not be displayed with every hit. 126 /// Computing an explanation is as expensive as executing the query over the 127 /// entire index. 128 /// </summary> Explain(Query query, int doc)129 public virtual Explanation Explain(Query query, int doc) 130 { 131 return Explain(CreateWeight(query), doc); 132 } 133 134 /// <summary>The Similarity implementation used by this searcher. </summary> 135 private Similarity similarity; 136 137 /// <summary>Expert: Gets or Sets the Similarity implementation used by this Searcher. 138 /// 139 /// </summary> 140 /// <seealso cref="Lucene.Net.Search.Similarity.Default"> 141 /// </seealso> 142 public virtual Similarity Similarity 143 { 144 get { return this.similarity; } 145 set { this.similarity = value; } 146 } 147 148 /// <summary> creates a weight for <c>query</c></summary> 149 /// <returns> new weight 150 /// </returns> CreateWeight(Query query)151 public /*protected internal*/ virtual Weight CreateWeight(Query query) 152 { 153 return query.Weight(this); 154 } 155 156 // inherit javadoc DocFreqs(Term[] terms)157 public virtual int[] DocFreqs(Term[] terms) 158 { 159 int[] result = new int[terms.Length]; 160 for (int i = 0; i < terms.Length; i++) 161 { 162 result[i] = DocFreq(terms[i]); 163 } 164 return result; 165 } 166 Search(Weight weight, Filter filter, Collector results)167 public abstract void Search(Weight weight, Filter filter, Collector results); 168 169 [Obsolete("Use Dispose() instead")] Close()170 public void Close() 171 { 172 Dispose(); 173 } 174 Dispose()175 public void Dispose() 176 { 177 Dispose(true); 178 } 179 Dispose(bool disposing)180 protected abstract void Dispose(bool disposing); 181 DocFreq(Term term)182 public abstract int DocFreq(Term term); 183 public abstract int MaxDoc { get; } Search(Weight weight, Filter filter, int n)184 public abstract TopDocs Search(Weight weight, Filter filter, int n); Doc(int i)185 public abstract Document Doc(int i); Doc(int docid, FieldSelector fieldSelector)186 public abstract Document Doc(int docid, FieldSelector fieldSelector); Rewrite(Query query)187 public abstract Query Rewrite(Query query); Explain(Weight weight, int doc)188 public abstract Explanation Explain(Weight weight, int doc); Search(Weight weight, Filter filter, int n, Sort sort)189 public abstract TopFieldDocs Search(Weight weight, Filter filter, int n, Sort sort); 190 /* End patch for GCJ bug #15411. */ 191 } 192 }