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_DocumentWriter_ 00008 #define _lucene_index_DocumentWriter_ 00009 00010 #if defined(_LUCENE_PRAGMA_ONCE) 00011 # pragma once 00012 #endif 00013 00014 #include "CLucene/analysis/AnalysisHeader.h" 00015 #include "CLucene/document/Document.h" 00016 #include "CLucene/store/Directory.h" 00017 #include "FieldInfos.h" 00018 #include "IndexWriter.h" 00019 #include "CLucene/util/VoidMap.h" 00020 #include "CLucene/document/Field.h" 00021 #include "TermInfo.h" 00022 #include "CLucene/search/Similarity.h" 00023 #include "TermInfosWriter.h" 00024 #include "FieldsWriter.h" 00025 #include "Term.h" 00026 00027 CL_NS_DEF(index) 00028 00029 00030 class DocumentWriter :LUCENE_BASE{ 00031 public: 00032 class Posting :LUCENE_BASE{ // info about a Term in a doc 00033 public: 00034 Term* term; // the Term 00035 int32_t freq; // its frequency in doc 00036 Array<int32_t> positions; // positions it occurs at 00037 Array<TermVectorOffsetInfo> offsets; 00038 00039 Posting(Term* t, const int32_t position, TermVectorOffsetInfo* offset); 00040 ~Posting(); 00041 }; 00042 00043 private: 00044 CL_NS(analysis)::Analyzer* analyzer; 00045 CL_NS(store)::Directory* directory; 00046 FieldInfos* fieldInfos; //array 00047 const int32_t maxFieldLength; 00048 CL_NS(search)::Similarity* similarity; 00049 int32_t termIndexInterval; 00050 00051 // Keys are Terms, values are Postings. 00052 // Used to buffer a document before it is written to the index. 00053 typedef CL_NS(util)::CLHashtable<Term*,Posting*,Term::Compare, Term::Equals> PostingTableType; 00054 PostingTableType postingTable; 00055 int32_t* fieldLengths; //array 00056 int32_t* fieldPositions; //array 00057 int32_t* fieldOffsets; //array 00058 float_t* fieldBoosts; //array 00059 00060 Term* termBuffer; 00061 public: 00069 DocumentWriter(CL_NS(store)::Directory* d, CL_NS(analysis)::Analyzer* a, CL_NS(search)::Similarity* similarity, const int32_t maxFieldLength); 00070 00071 DocumentWriter(CL_NS(store)::Directory* directory, CL_NS(analysis)::Analyzer* analyzer, IndexWriter* writer); 00072 ~DocumentWriter(); 00073 00074 void addDocument(const char* segment, CL_NS(document)::Document* doc); 00075 00076 00077 private: 00078 // Tokenizes the fields of a document into Postings. 00079 void invertDocument(const CL_NS(document)::Document* doc); 00080 00081 void addPosition(const TCHAR* field, const TCHAR* text, const int32_t position, TermVectorOffsetInfo* offset); 00082 00083 void sortPostingTable(Posting**& array, int32_t& arraySize); 00084 00085 static void quickSort(Posting**& postings, const int32_t lo, const int32_t hi); 00086 00087 void writePostings(Posting** postings, const int32_t postingsLength, const char* segment); 00088 00089 void writeNorms(const char* segment); 00090 00091 void clearPostingTable(); 00092 }; 00093 00094 CL_NS_END 00095 #endif