FirteX-高性能全文索引和检索平台API Documentation |
00001 // 00002 // Copyright(C) 2005--2006 Institute of Computing Tech, Chinese Academy of Sciences. 00003 // All rights reserved. 00004 // This file is part of FirteX (www.firtex.org) 00005 // 00006 // Use of the FirteX is subject to the terms of the software license set forth in 00007 // the LICENSE file included with this software, and also available at 00008 // http://www.firtex.org/license.html 00009 // 00010 // Author : 郭瑞杰(GuoRuijie) 00011 // Email : ruijieguo@software.ict.ac.cn 00012 // Created : 2005/11/20 00013 // 00014 00015 #ifndef __DOCUMENT_H 00016 #define __DOCUMENT_H 00017 00018 #if _MSC_VER > 1000 00019 #pragma once 00020 #endif // _MSC_VER > 1000 00021 00022 #include "../utility/StdHeader.h" 00023 #include "Field.h" 00024 #include "DocumentSchema.h" 00025 #include "../utility/Config.h" 00026 #include <assert.h> 00027 #include <string> 00028 #include <map> 00029 #include <vector> 00030 00031 using namespace std; 00032 00033 namespace firtex 00034 { 00035 namespace document 00036 { 00037 class CDocument 00038 { 00039 public: 00040 CDocument(); 00041 ~CDocument(); 00042 public: 00046 void docID(docid_t did){m_docid = did;} 00047 docid_t docID(){return m_docid;} 00048 00053 float getBoost(){return m_fBoost;} 00054 void setBoost(float fBoost){m_fBoost = fBoost;} 00055 public: 00060 void setSchema(const CDocumentSchema& schema); 00061 00066 void setSchema(CDocumentSchema* schema); 00067 00071 CDocumentSchema* getSchema(){return m_pDocSchema;} 00072 00078 void appendSchema(const CDocumentSchema& schema,bool bTail = true); 00079 00084 int addField(CField* pField); 00085 00093 inline void addField(fieldid_t id,const char* value); 00094 inline void addField(fieldid_t id,const wchar_t* value); 00095 inline void addField(fieldid_t id,char* value,size_t len,bool bNoCopy); 00096 inline void addField(fieldid_t id,wchar_t* value,size_t len,bool bNoCopy); 00097 inline void addField(fieldid_t id,const str_t& value,bool bNoCopy); 00098 inline void addField(fieldid_t id,const wstr_t& value,bool bNoCopy); 00099 inline void addField(fieldid_t id,CReader* reader,bool bDelete); 00100 inline void addField(fieldid_t id,const CNumber& number); 00101 inline void addField(fieldid_t id,const numbervar& number); 00102 inline void addField(fieldid_t id,const datarecord& datarec,bool bNoCopy); 00103 00108 void removeField(const tchar* name); 00109 00114 void removeField(CField* pField); 00115 public: 00116 CField* operator[](int order); 00117 CField* operator[](const tchar* name); 00118 00124 CField* getField(const tchar* name); 00125 CField* getField(int order); 00126 00131 bool isModified(){return m_bModified;} 00132 00137 void setModify(bool bMod = true){m_bModified = bMod;} 00138 00142 void clear(); 00143 00147 void startIterator(){m_fieldIterator = m_fields.begin();} 00148 bool hasNext(){return (m_fieldIterator != m_fields.end());} 00149 CField* next(){return *m_fieldIterator++;} 00150 protected: 00151 void applySchema(); 00152 private: 00153 docid_t m_docid; 00154 vector<CField*> m_fields; 00155 CField** m_ppFields; //用于根据schemaid快速定位 00156 int m_numSchemas; //m_ppFields数组大小 00157 CDocumentSchema* m_pDocSchema; //文档的schema信息 00158 bool m_bSchemaOwner; 00159 00160 float m_fBoost; 00161 bool m_bModified; 00162 vector<CField*>::iterator m_fieldIterator; 00163 }; 00165 //Inline functions 00166 inline int CDocument::addField(CField* pField) 00167 { 00168 m_fields.push_back(pField); 00169 setModify(); 00170 return (int)(m_fields.size()-1); 00171 } 00172 inline CField* CDocument::getField(int order) 00173 { 00174 if (order < 0 || order >=(int) m_fields.size()) 00175 return NULL; 00176 return m_fields[order]; 00177 } 00178 inline CField* CDocument::operator[](int order) 00179 { 00180 return getField(order); 00181 } 00182 inline CField* CDocument::operator[](const tchar* name) 00183 { 00184 return getField(name); 00185 } 00186 00187 inline void CDocument::addField(fieldid_t id,const char* value) 00188 { 00189 assert(id >=0 && id < m_numSchemas); 00190 m_ppFields[id]->textValue((char*)value,strlen(value),false); 00191 } 00192 inline void CDocument::addField(fieldid_t id,const wchar_t* value) 00193 { 00194 assert(id >=0 && id < m_numSchemas); 00195 m_ppFields[id]->textValue((wchar_t*)value,wcslen(value),false); 00196 } 00197 inline void CDocument::addField(fieldid_t id,char* value,size_t len,bool bNoCopy) 00198 { 00199 assert(id >=0 && id < m_numSchemas); 00200 m_ppFields[id]->textValue(value,len,bNoCopy); 00201 } 00202 inline void CDocument::addField(fieldid_t id,wchar_t* value,size_t len,bool bNoCopy) 00203 { 00204 assert(id >=0 && id < m_numSchemas); 00205 m_ppFields[id]->textValue(value,len,bNoCopy); 00206 } 00207 00208 inline void CDocument::addField(fieldid_t id,const str_t& value,bool bNoCopy) 00209 { 00210 assert(id >=0 && id < m_numSchemas); 00211 m_ppFields[id]->textValue(value,bNoCopy); 00212 00213 } 00214 inline void CDocument::addField(fieldid_t id,const wstr_t& value,bool bNoCopy) 00215 { 00216 assert(id >=0 && id < m_numSchemas); 00217 m_ppFields[id]->textValue(value,bNoCopy); 00218 } 00219 inline void CDocument::addField(fieldid_t id,CReader* reader,bool bDelete) 00220 { 00221 assert(id >=0 && id < m_numSchemas); 00222 m_ppFields[id]->readerValue(reader,bDelete); 00223 } 00224 inline void CDocument::addField(fieldid_t id,const CNumber& number) 00225 { 00226 assert(id >=0 && id < m_numSchemas); 00227 if(m_ppFields[id]->isAnalyzed()) 00228 { 00229 FIRTEX_CLOG(level::warn) << "CDocument::addField(fieldid_t id,const CNumber& number):Number value can't analyze,discard it." <<endl; 00230 return; 00231 } 00232 m_ppFields[id]->numberValue(number); 00233 } 00234 inline void CDocument::addField(fieldid_t id,const numbervar& number) 00235 { 00236 assert(id >=0 && id < m_numSchemas); 00237 if(m_ppFields[id]->isAnalyzed()) 00238 { 00239 FIRTEX_CLOG(level::warn) << "CDocument::addField(fieldid_t id,const numbervar& number):Number value can't analyze,discard it." <<endl; 00240 return; 00241 } 00242 m_ppFields[id]->numberValue(number); 00243 } 00244 inline void CDocument::addField(fieldid_t id,const datarecord& datarec,bool bNoCopy) 00245 { 00246 assert(id >=0 && id < m_numSchemas); 00247 if(m_ppFields[id]->isAnalyzed()) 00248 { 00249 FIRTEX_CLOG(level::warn) << "CDocument::addField(fieldid_t id,const datarecord& datarec,bool bNoCopy):Binary value can't analyze,discard it." <<endl; 00250 return; 00251 } 00252 m_ppFields[id]->binaryValue(datarec,bNoCopy); 00253 } 00254 } 00255 } 00256 00257 #endif
http://www.firtex.org http://www.sourceforge.net/projects/firtex