blob: be0ad38a9301f58e01b37380cde3fef448079794 [file] [log] [blame]
/*
* 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 Document = Lucene.Net.Documents.Document;
using FieldSelector = Lucene.Net.Documents.FieldSelector;
using CorruptIndexException = Lucene.Net.Index.CorruptIndexException;
using IndexReader = Lucene.Net.Index.IndexReader;
using Term = Lucene.Net.Index.Term;
using Directory = Lucene.Net.Store.Directory;
namespace Lucene.Net.Search
{
/// <summary>Implements search over a single IndexReader.
///
/// <p>Applications usually need only call the inherited {@link #Search(Query)}
/// or {@link #search(Query,Filter)} methods. For performance reasons it is
/// recommended to open only one IndexSearcher and use it for all of your searches.
///
/// <p>Note that you can only access Hits from an IndexSearcher as long as it is
/// not yet closed, otherwise an IOException will be thrown.
/// </summary>
public class IndexSearcher : Searcher
{
private class AnonymousClassHitCollector : HitCollector
{
public AnonymousClassHitCollector(System.Collections.BitArray bits, Lucene.Net.Search.HitCollector results, IndexSearcher enclosingInstance)
{
InitBlock(bits, results, enclosingInstance);
}
private void InitBlock(System.Collections.BitArray bits, Lucene.Net.Search.HitCollector results, IndexSearcher enclosingInstance)
{
this.bits = bits;
this.results = results;
this.enclosingInstance = enclosingInstance;
}
private System.Collections.BitArray bits;
private Lucene.Net.Search.HitCollector results;
private IndexSearcher enclosingInstance;
public IndexSearcher Enclosing_Instance
{
get
{
return enclosingInstance;
}
}
public override void Collect(int doc, float score)
{
if (bits.Get(doc))
{
// skip docs not in bits
results.Collect(doc, score);
}
}
}
internal IndexReader reader;
private bool closeReader;
public IndexReader Reader
{
get { return reader; }
}
/// <summary>Creates a searcher searching the index in the named directory.</summary>
/// <throws> CorruptIndexException if the index is corrupt </throws>
/// <throws> IOException if there is a low-level IO error </throws>
public IndexSearcher(System.String path) : this(IndexReader.Open(path), true)
{
}
/// <summary>Creates a searcher searching the index in the provided directory.</summary>
/// <throws> CorruptIndexException if the index is corrupt </throws>
/// <throws> IOException if there is a low-level IO error </throws>
public IndexSearcher(Directory directory) : this(IndexReader.Open(directory), true)
{
}
/// <summary>Creates a searcher searching the provided index. </summary>
public IndexSearcher(IndexReader r) : this(r, false)
{
}
private IndexSearcher(IndexReader r, bool closeReader)
{
reader = r;
this.closeReader = closeReader;
}
/// <summary>Return the {@link IndexReader} this searches. </summary>
public virtual IndexReader GetIndexReader()
{
return reader;
}
/// <summary> Note that the underlying IndexReader is not closed, if
/// IndexSearcher was constructed with IndexSearcher(IndexReader r).
/// If the IndexReader was supplied implicitly by specifying a directory, then
/// the IndexReader gets closed.
/// </summary>
public override void Close()
{
if (closeReader)
reader.Close();
}
// inherit javadoc
public override int DocFreq(Term term)
{
return reader.DocFreq(term);
}
// inherit javadoc
public override Document Doc(int i)
{
return reader.Document(i);
}
// inherit javadoc
public override Document Doc(int i, FieldSelector fieldSelector)
{
return reader.Document(i, fieldSelector);
}
// inherit javadoc
public override int MaxDoc()
{
return reader.MaxDoc();
}
// inherit javadoc
public override TopDocs Search(Weight weight, Filter filter, int nDocs)
{
if (nDocs <= 0)
// null might be returned from hq.top() below.
throw new System.ArgumentException("nDocs must be > 0");
TopDocCollector collector = new TopDocCollector(nDocs);
Search(weight, filter, collector);
return collector.TopDocs();
}
// inherit javadoc
public override TopFieldDocs Search(Weight weight, Filter filter, int nDocs, Sort sort)
{
TopFieldDocCollector collector = new TopFieldDocCollector(reader, sort, nDocs);
Search(weight, filter, collector);
return (TopFieldDocs) collector.TopDocs();
}
// inherit javadoc
public override void Search(Weight weight, Filter filter, HitCollector results)
{
HitCollector collector = results;
if (filter != null)
{
System.Collections.BitArray bits = filter.Bits(reader);
collector = new AnonymousClassHitCollector(bits, results, this);
}
Scorer scorer = weight.Scorer(reader);
if (scorer == null)
return ;
scorer.Score(collector);
}
public override Query Rewrite(Query original)
{
Query query = original;
for (Query rewrittenQuery = query.Rewrite(reader); rewrittenQuery != query; rewrittenQuery = query.Rewrite(reader))
{
query = rewrittenQuery;
}
return query;
}
public override Explanation Explain(Weight weight, int doc)
{
return weight.Explain(reader, doc);
}
}
}