CLucene - a full-featured, c++ search engine
API Documentation
00001 /*------------------------------------------------------------------------------ 00002 * Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team 00003 * 00004 * Distributable under the terms of either the Apache License (Version 2.0) or 00005 * the GNU Lesser General Public License, as specified in the COPYING file. 00006 ------------------------------------------------------------------------------*/ 00007 #ifndef _lucene_search_SearchHeader_ 00008 #define _lucene_search_SearchHeader_ 00009 00010 #if defined(_LUCENE_PRAGMA_ONCE) 00011 # pragma once 00012 #endif 00013 00014 #include "CLucene/index/IndexReader.h" 00015 #include "CLucene/index/Term.h" 00016 #include "Filter.h" 00017 #include "CLucene/document/Document.h" 00018 #include "Sort.h" 00019 #include "CLucene/util/VoidList.h" 00020 #include "Explanation.h" 00021 #include "Similarity.h" 00022 00023 CL_NS_DEF(search) 00024 00025 //predefine classes 00026 class Scorer; 00027 class Query; 00028 class Hits; 00029 class Sort; 00030 class FieldDoc; 00031 class TopFieldDocs; 00032 00035 struct ScoreDoc { 00039 int32_t doc; 00040 00042 float_t score; 00043 }; 00044 00047 class TopDocs:LUCENE_BASE { 00048 public: 00052 int32_t totalHits; 00053 00055 ScoreDoc* scoreDocs; 00056 int32_t scoreDocsLength; 00057 00059 TopDocs(const int32_t th, ScoreDoc* sds, int32_t scoreDocsLength); 00060 ~TopDocs(); 00061 }; 00062 00063 // Lower-level search API. 00064 // @see Searcher#search(Query,HitCollector) 00065 class HitCollector: LUCENE_BASE { 00066 public: 00091 virtual void collect(const int32_t doc, const float_t score) = 0; 00092 virtual ~HitCollector(){} 00093 }; 00094 00104 class Weight: LUCENE_BASE { 00105 public: 00106 virtual ~Weight(){ 00107 }; 00108 00110 virtual Query* getQuery() = 0; 00111 00113 virtual float_t getValue() = 0; 00114 00116 virtual float_t sumOfSquaredWeights() = 0; 00117 00119 virtual void normalize(float_t norm) = 0; 00120 00122 virtual Scorer* scorer(CL_NS(index)::IndexReader* reader) = 0; 00123 00125 virtual void explain(CL_NS(index)::IndexReader* reader, int32_t doc, Explanation* ret) = 0; 00126 00127 virtual TCHAR* toString(){ 00128 return STRDUP_TtoT(_T("Weight")); 00129 } 00130 }; 00131 00132 class HitDoc:LUCENE_BASE { 00133 public: 00134 float_t score; 00135 int32_t id; 00136 CL_NS(document)::Document* doc; 00137 00138 HitDoc* next; // in doubly-linked cache 00139 HitDoc* prev; // in doubly-linked cache 00140 00141 HitDoc(const float_t s, const int32_t i); 00142 ~HitDoc(); 00143 }; 00144 00145 00146 00147 // A ranked list of documents, used to hold search results. 00148 class Hits:LUCENE_BASE { 00149 private: 00150 Query* query; 00151 Searcher* searcher; 00152 Filter* filter; 00153 const Sort* sort; 00154 00155 size_t _length; // the total number of hits 00156 CL_NS(util)::CLVector<HitDoc*, CL_NS(util)::Deletor::Object<HitDoc> > hitDocs; // cache of hits retrieved 00157 00158 HitDoc* first; // head of LRU cache 00159 HitDoc* last; // tail of LRU cache 00160 int32_t numDocs; // number cached 00161 int32_t maxDocs; // max to cache 00162 00163 public: 00164 Hits(Searcher* s, Query* q, Filter* f, const Sort* sort=NULL); 00165 ~Hits(); 00166 00168 int32_t length() const; 00169 00176 CL_NS(document)::Document& doc(const int32_t n); 00177 00179 int32_t id (const int32_t n); 00180 00182 float_t score(const int32_t n); 00183 00184 private: 00185 // Tries to add new documents to hitDocs. 00186 // Ensures that the hit numbered <code>_min</code> has been retrieved. 00187 void getMoreDocs(const size_t _min); 00188 00189 HitDoc* getHitDoc(const size_t n); 00190 00191 void addToFront(HitDoc* hitDoc); 00192 00193 void remove(const HitDoc* hitDoc); 00194 00195 }; 00196 00202 class Searchable: LUCENE_BASE { 00203 public: 00204 virtual ~Searchable(){ 00205 } 00206 00221 virtual void _search(Query* query, Filter* filter, HitCollector* results) = 0; 00222 00227 virtual void close() = 0; 00228 00233 virtual int32_t docFreq(const CL_NS(index)::Term* term) const = 0; 00234 00239 virtual int32_t maxDoc() const = 0; 00240 00249 virtual TopDocs* _search(Query* query, Filter* filter, const int32_t n) = 0; 00250 00255 virtual bool doc(int32_t i, CL_NS(document)::Document* d) = 0; 00256 _CL_DEPRECATED( doc(i, document) ) CL_NS(document)::Document* doc(const int32_t i); 00257 00259 virtual Query* rewrite(Query* query) = 0; 00260 00269 virtual void explain(Query* query, int32_t doc, Explanation* ret) = 0; 00270 00279 virtual TopFieldDocs* _search(Query* query, Filter* filter, const int32_t n, const Sort* sort) = 0; 00280 }; 00281 00282 00283 00287 class Searcher:public Searchable { 00288 private: 00290 Similarity* similarity; 00291 00292 public: 00293 Searcher(){ 00294 similarity = Similarity::getDefault(); 00295 } 00296 virtual ~Searcher(){ 00297 } 00298 00299 // Returns the documents matching <code>query</code>. 00300 Hits* search(Query* query) { 00301 return search(query, (Filter*)NULL ); 00302 } 00303 00304 // Returns the documents matching <code>query</code> and 00305 // <code>filter</code>. 00306 Hits* search(Query* query, Filter* filter) { 00307 return _CLNEW Hits(this, query, filter); 00308 } 00309 00313 Hits* search(Query* query, const Sort* sort){ 00314 return _CLNEW Hits(this, query, NULL, sort); 00315 } 00316 00320 Hits* search(Query* query, Filter* filter, const Sort* sort){ 00321 return _CLNEW Hits(this, query, filter, sort); 00322 } 00323 00337 void _search(Query* query, HitCollector* results) { 00338 Searchable::_search(query, NULL, results); 00339 } 00340 00345 void setSimilarity(Similarity* similarity) { 00346 this->similarity = similarity; 00347 } 00348 00353 Similarity* getSimilarity(){ 00354 return this->similarity; 00355 } 00356 }; 00357 00377 class Query :LUCENE_BASE { 00378 private: 00379 // query boost factor 00380 float_t boost; 00381 protected: 00382 Query(const Query& clone); 00383 public: 00384 Query(); 00385 virtual ~Query(); 00386 00391 void setBoost(float_t b); 00392 00397 float_t getBoost() const; 00398 00400 Weight* weight(Searcher* searcher); 00401 00403 virtual Query* rewrite(CL_NS(index)::IndexReader* reader); 00404 00410 virtual Query* combine(Query** queries); 00411 00417 static Query* mergeBooleanQueries(Query** queries); 00418 00423 Similarity* getSimilarity(Searcher* searcher); 00424 00426 virtual Query* clone() const = 0; 00427 virtual const TCHAR* getQueryName() const = 0; 00428 bool instanceOf(const TCHAR* other) const; 00429 00436 virtual TCHAR* toString(const TCHAR* field) const = 0; 00437 00438 virtual bool equals(Query* other) const = 0; 00439 virtual size_t hashCode() const = 0; 00440 00442 TCHAR* toString() const; 00443 00444 00450 virtual Weight* _createWeight(Searcher* searcher); 00451 00452 }; 00453 00454 00455 CL_NS_END 00456 #endif