📄 searchheader.h
字号:
/*------------------------------------------------------------------------------
* Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team
*
* Distributable under the terms of either the Apache License (Version 2.0) or
* the GNU Lesser General Public License, as specified in the COPYING file.
------------------------------------------------------------------------------*/
#ifndef _lucene_search_SearchHeader_
#define _lucene_search_SearchHeader_
#if defined(_LUCENE_PRAGMA_ONCE)
# pragma once
#endif
#include "CLucene/index/IndexReader.h"
#include "CLucene/index/Term.h"
#include "Filter.h"
#include "CLucene/document/Document.h"
#include "Sort.h"
#include "CLucene/util/VoidList.h"
#include "CLucene/debug/pool.h"
#include "Explanation.h"
#include "Similarity.h"
CL_NS_DEF(search)
//predefine classes
class Scorer;
class Query;
class Hits;
class Sort;
/** Expert: Returned by low-level search implementations.
* @see Searcher#search(Query,Filter,int32_t) */
class TopDocs:LUCENE_BASE {
public:
#ifndef LUCENE_HIDE_INTERNAL
//internal
bool deleteScoreDocs;
#endif
/** Expert: The total number of hits for the query.
* @see Hits#length()
*/
const int32_t totalHits;
/** Expert: The top hits for the query. */
const ScoreDoc** scoreDocs;
const int32_t scoreDocsLength;
/** Expert: Constructs a TopDocs. TopDocs takes ownership of the ScoreDoc array*/
TopDocs(const int32_t th, const ScoreDoc **sds, int32_t scoreDocsLength);
~TopDocs();
};
// Lower-level search API.
// @see Searcher#search(Query,HitCollector)
class HitCollector: LUCENE_BASE {
public:
/** Called once for every non-zero scoring document, with the document number
* and its score.
*
* <P>If, for example, an application wished to collect all of the hits for a
* query in a BitSet, then it might:<pre>
* Searcher searcher = new IndexSearcher(indexReader);
* final BitSet bits = new BitSet(indexReader.maxDoc());
* searcher.search(query, new HitCollector() {
* public void collect(int32_t doc, float score) {
* bits.set(doc);
* }
* });
* </pre>
*
* <p>Note: This is called in an inner search loop. For good search
* performance, implementations of this method should not call
* {@link Searcher#doc(int32_t)} or
* {@link IndexReader#document(int32_t)} on every
* document number encountered. Doing so can slow searches by an order
* of magnitude or more.
* <p>Note: The <code>score</code> 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.
*/
virtual void collect(const int32_t doc, const float_t score) = 0;
virtual ~HitCollector(){}
};
/**
* Expert: Returned by low-level sorted search implementations.
*
* @see Searchable#search(Query,Filter,int32_t,Sort)
*/
class TopFieldDocs: public TopDocs {
public:
/// The fields which were used to sort results by.
const SortField** fields;
/** Creates one of these objects.
* @param totalHits Total number of hits for the query.
* @param scoreDocs The top hits for the query.
* @param fields The sort criteria used to find the top hits.
*/
TopFieldDocs (int32_t totalHits, const ScoreDoc** scoreDocs, int32_t scoreDocsLen, const SortField** fields):
TopDocs (totalHits, scoreDocs, scoreDocsLen)
{
this->fields = fields;
}
~TopFieldDocs();
};
/** Expert: Calculate query weights and build query scorers.
*
* <p>A Weight is constructed by a query, given a Searcher ({@link
* Query#createWeight(Searcher)}). The {@link #sumOfSquaredWeights()} method
* is then called on the top-level query to compute the query normalization
* factor (@link Similarity#queryNorm(float_t)}). This factor is then passed to
* {@link #normalize(float_t)}. At this point the weighting is complete and a
* scorer may be constructed by calling {@link #scorer(IndexReader)}.
*/
class Weight: LUCENE_BASE {
public:
virtual ~Weight(){
};
/** The query that this concerns. */
virtual Query* getQuery() = 0;
/** The weight for this query. */
virtual float_t getValue() = 0;
/** The sum of squared weights of contained query clauses. */
virtual float_t sumOfSquaredWeights() = 0;
/** Assigns the query normalization factor to this. */
virtual void normalize(float_t norm) = 0;
/** Constructs a scorer for this. */
virtual Scorer* scorer(CL_NS(index)::IndexReader* reader) = 0;
/** An explanation of the score computation for the named document. */
virtual Explanation* explain(CL_NS(index)::IndexReader* reader, int32_t doc) = 0;
virtual TCHAR* toString(){
return STRDUP_TtoT(_T("Weight"));
}
};
LUCENE_MP_DEFINE(HitDoc)
class HitDoc:LUCENE_POOLEDBASE(HitDoc) {
public:
float_t score;
int32_t id;
CL_NS(document)::Document* doc;
HitDoc* next; // in doubly-linked cache
HitDoc* prev; // in doubly-linked cache
HitDoc(const float_t s, const int32_t i);
~HitDoc();
};
// A ranked list of documents, used to hold search results.
class Hits:LUCENE_BASE {
private:
Query* query;
Searcher* searcher;
Filter* filter;
const Sort* sort;
int32_t _length; // the total number of hits
CL_NS(util)::CLVector<HitDoc*, CL_NS(util)::Deletor::Object<HitDoc> > hitDocs; // cache of hits retrieved
HitDoc* first; // head of LRU cache
HitDoc* last; // tail of LRU cache
int32_t numDocs; // number cached
int32_t maxDocs; // max to cache
public:
Hits(Searcher* s, Query* q, Filter* f, const Sort* sort=NULL);
~Hits();
/** Returns the total number of hits available in this set. */
int32_t length() const;
/** Returns the stored fields of the n<sup>th</sup> document in this set.
<p>Documents are cached, so that repeated requests for the same element may
return the same Document object.
*
* @memory Memory belongs to the hits object. Don't delete the return value.
*/
CL_NS(document)::Document& doc(const int32_t n);
/** Returns the id for the nth document in this set. */
int32_t id (const int32_t n);
/** Returns the score for the nth document in this set. */
float_t score(const int32_t n);
private:
// Tries to add new documents to hitDocs.
// Ensures that the hit numbered <code>min</code> has been retrieved.
void getMoreDocs(const int32_t Min);
HitDoc* getHitDoc(const int32_t n);
void addToFront(HitDoc* hitDoc);
void remove(const HitDoc* hitDoc);
};
/** The interface for search implementations.
*
* <p>Implementations provide search over a single index, over multiple
* indices, and over indices on remote servers.
*/
class Searchable: LUCENE_BASE {
public:
virtual ~Searchable(){
}
/** Lower-level search API.
*
* <p>{@link HitCollector#collect(int32_t,float_t)} is called for every non-zero
* scoring document.
*
* <p>Applications should only use this if they need <i>all</i> of the
* matching documents. The high-level search API ({@link
* Searcher#search(Query)}) is usually more efficient, as it skips
* non-high-scoring hits.
*
* @param query to match documents
* @param filter if non-null, a bitset used to eliminate some documents
* @param results to receive hits
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -