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_index_termvector_h 00008 #define _lucene_index_termvector_h 00009 00010 #if defined(_LUCENE_PRAGMA_ONCE) 00011 # pragma once 00012 #endif 00013 00014 #include "FieldInfos.h" 00015 00016 CL_NS_DEF(index) 00017 00018 //predefine classes 00019 struct TermVectorOffsetInfo; 00020 class TermPositionVector; 00021 00025 class TermFreqVector:LUCENE_BASE { 00026 public: 00027 virtual ~TermFreqVector(){ 00028 } 00029 00035 virtual const TCHAR* getField() = 0; 00036 00040 virtual int32_t size() = 0; 00041 00045 virtual const TCHAR** getTerms() = 0; 00046 00047 00056 virtual const Array<int32_t>* getTermFrequencies() = 0; 00057 00058 00064 virtual int32_t indexOf(const TCHAR* term) = 0; 00065 00066 00076 virtual void indexesOf(const TCHAR** terms, const int32_t start, const int32_t len, Array<int32_t>& ret) = 0; 00077 00081 virtual TermPositionVector* __asTermPositionVector()=0; 00082 }; 00083 00084 00108 class TermVectorsWriter:LUCENE_BASE { 00109 private: 00110 class TVField:LUCENE_BASE { 00111 public: 00112 int32_t number; 00113 int64_t tvfPointer; 00114 int32_t length; // number of distinct term positions 00115 bool storePositions; 00116 bool storeOffsets; 00117 00118 TVField(int32_t number, bool storePos, bool storeOff): 00119 tvfPointer(0),length(0){ 00120 this->number = number; 00121 this->storePositions = storePos; 00122 this->storeOffsets = storeOff; 00123 } 00124 ~TVField(){} 00125 }; 00126 00127 class TVTerm:LUCENE_BASE { 00128 const TCHAR* termText; 00129 int32_t termTextLen; //textlen cache 00130 00131 public: 00132 TVTerm(); 00133 ~TVTerm(); 00134 00135 int32_t freq; 00136 Array<int32_t>* positions; 00137 Array<TermVectorOffsetInfo>* offsets; 00138 00139 const TCHAR* getTermText() const; 00140 size_t getTermTextLen(); 00141 void setTermText(const TCHAR* val); 00142 }; 00143 00144 00145 CL_NS(store)::IndexOutput* tvx, *tvd, *tvf; 00146 CL_NS(util)::CLVector<TVField*,CL_NS(util)::Deletor::Object<TVField> > fields; 00147 CL_NS(util)::CLVector<TVTerm*,CL_NS(util)::Deletor::Object<TVTerm> > terms; 00148 FieldInfos* fieldInfos; 00149 00150 TVField* currentField; 00151 int64_t currentDocPointer; 00152 00153 void addTermInternal(const TCHAR* termText, const int32_t freq, 00154 Array<int32_t>* positions, Array<TermVectorOffsetInfo>* offsets); 00155 00156 void writeField(); 00157 void writeDoc(); 00158 00159 void openField(int32_t fieldNumber, bool storePositionWithTermVector, 00160 bool storeOffsetWithTermVector); 00161 public: 00162 LUCENE_STATIC_CONSTANT(int32_t, FORMAT_VERSION = 2); 00163 00164 //The size in bytes that the FORMAT_VERSION will take up at the beginning of each file 00165 LUCENE_STATIC_CONSTANT(int32_t, FORMAT_SIZE = 4); 00166 00167 LUCENE_STATIC_CONSTANT(uint8_t, STORE_POSITIONS_WITH_TERMVECTOR = 0x1); 00168 LUCENE_STATIC_CONSTANT(uint8_t, STORE_OFFSET_WITH_TERMVECTOR = 0x2); 00169 00170 static const char* LUCENE_TVX_EXTENSION; 00171 static const char* LUCENE_TVD_EXTENSION; 00172 static const char* LUCENE_TVF_EXTENSION; 00173 00174 TermVectorsWriter(CL_NS(store)::Directory* directory, const char* segment, 00175 FieldInfos* fieldInfos); 00176 00177 ~TermVectorsWriter(); 00178 void openDocument(); 00179 void closeDocument(); 00180 00182 void close(); 00183 bool isDocumentOpen() const; 00184 00190 void openField(const TCHAR* field); 00191 00195 void closeField(); 00196 00198 bool isFieldOpen() const; 00199 00207 void addAllDocVectors(Array<TermFreqVector*>& vectors); 00208 00216 void addTerm(const TCHAR* termText, int32_t freq, 00217 Array<int32_t>* positions = NULL, Array<TermVectorOffsetInfo>* offsets = NULL); 00218 }; 00219 00222 class SegmentTermVector: public virtual TermFreqVector { 00223 private: 00224 const TCHAR* field; 00225 TCHAR** terms; 00226 int32_t termsLen; //cache 00227 Array<int32_t>* termFreqs; 00228 00229 int32_t binarySearch(TCHAR** a, const int32_t arraylen, const TCHAR* key) const; 00230 public: 00231 //note: termFreqs must be the same length as terms 00232 SegmentTermVector(const TCHAR* field, TCHAR** terms, Array<int32_t>* termFreqs); 00233 virtual ~SegmentTermVector(); 00234 00239 const TCHAR* getField(); 00240 TCHAR* toString() const; 00241 int32_t size(); 00242 const TCHAR** getTerms(); 00243 const Array<int32_t>* getTermFrequencies(); 00244 int32_t indexOf(const TCHAR* termText); 00245 void indexesOf(const TCHAR** termNumbers, const int32_t start, const int32_t len, Array<int32_t>& ret); 00246 00247 virtual TermPositionVector* __asTermPositionVector(); 00248 }; 00249 00250 00251 00255 class TermVectorsReader:LUCENE_BASE { 00256 private: 00257 FieldInfos* fieldInfos; 00258 00259 CL_NS(store)::IndexInput* tvx; 00260 CL_NS(store)::IndexInput* tvd; 00261 CL_NS(store)::IndexInput* tvf; 00262 int64_t _size; 00263 00264 int32_t tvdFormat; 00265 int32_t tvfFormat; 00266 00267 00268 int32_t checkValidFormat(CL_NS(store)::IndexInput* in); 00269 00270 void readTermVectors(const TCHAR** fields, const int64_t* tvfPointers, const int32_t len, Array<TermFreqVector*>& _return); 00271 00279 SegmentTermVector* readTermVector(const TCHAR* field, const int64_t tvfPointer); 00280 00281 int64_t size(); 00282 00283 00284 DEFINE_MUTEX(THIS_LOCK) 00285 TermVectorsReader(const TermVectorsReader& copy); 00286 public: 00287 TermVectorsReader(CL_NS(store)::Directory* d, const char* segment, FieldInfos* fieldInfos); 00288 ~TermVectorsReader(); 00289 00290 void close(); 00291 TermVectorsReader* clone() const; 00292 00300 TermFreqVector* get(const int32_t docNum, const TCHAR* field); 00301 00302 00310 bool get(int32_t docNum, Array<TermFreqVector*>& result); 00311 }; 00312 00313 00314 struct TermVectorOffsetInfo { 00315 int startOffset; 00316 int endOffset; 00317 public: 00318 static Array<TermVectorOffsetInfo> EMPTY_OFFSET_INFO; 00319 TermVectorOffsetInfo(); 00320 ~TermVectorOffsetInfo(); 00321 TermVectorOffsetInfo(int32_t startOffset, int32_t endOffset); 00322 int32_t getEndOffset() const; 00323 void setEndOffset(int32_t endOffset); 00324 int32_t getStartOffset() const; 00325 void setStartOffset(int32_t startOffset); 00326 bool equals(TermVectorOffsetInfo* o); 00327 size_t hashCode() const; 00328 }; 00329 00330 00335 class TermPositionVector: public virtual TermFreqVector { 00336 public: 00337 00343 virtual Array<int32_t>* getTermPositions(int32_t index) = 0; 00344 00354 virtual Array<TermVectorOffsetInfo>* getOffsets(int32_t index) = 0; 00355 00356 virtual ~TermPositionVector(){ 00357 } 00358 }; 00359 00360 00361 class SegmentTermPositionVector: public SegmentTermVector, public TermPositionVector { 00362 protected: 00363 Array< Array<int32_t> >* positions; 00364 Array< Array<TermVectorOffsetInfo> >* offsets; 00365 static Array<int32_t> EMPTY_TERM_POS; 00366 public: 00367 SegmentTermPositionVector(const TCHAR* field, TCHAR** terms, Array<int32_t>* termFreqs, Array< Array<int32_t> >* positions, Array< Array<TermVectorOffsetInfo> >* offsets); 00368 ~SegmentTermPositionVector(); 00369 00377 Array<TermVectorOffsetInfo>* getOffsets(int32_t index); 00378 00384 Array<int32_t>* getTermPositions(int32_t index); 00385 00386 const TCHAR* getField(){ return SegmentTermVector::getField(); } 00387 TCHAR* toString() const{ return SegmentTermVector::toString(); } 00388 int32_t size(){ return SegmentTermVector::size(); } 00389 const TCHAR** getTerms(){ return SegmentTermVector::getTerms(); } 00390 const Array<int32_t>* getTermFrequencies(){ return SegmentTermVector::getTermFrequencies(); } 00391 int32_t indexOf(const TCHAR* termText){ return SegmentTermVector::indexOf(termText); } 00392 void indexesOf(const TCHAR** termNumbers, const int32_t start, const int32_t len, Array<int32_t>& ret) 00393 { SegmentTermVector::indexesOf(termNumbers, start, len, ret); } 00394 00395 virtual TermPositionVector* __asTermPositionVector(); 00396 }; 00397 00398 CL_NS_END 00399 #endif