?? indexreader.cpp
字號:
return directory->fileExists("segments");
}
TermDocs* IndexReader::termDocs(Term* term) const {
//Func - Returns an enumeration of all the documents which contain
// term. For each document, the document number, the frequency of
// the term in that document is also provided, for use in search scoring.
// Thus, this method implements the mapping:
//
// Term => <docNum, freq>*
// The enumeration is ordered by document number. Each document number
// is greater than all that precede it in the enumeration.
//Pre - term != NULL
//Post - A reference to TermDocs containing an enumeration of all found documents
// has been returned
CND_PRECONDITION(term != NULL, "term is NULL");
//Reference an instantiated TermDocs instance
TermDocs* _termDocs = termDocs();
//Seek all documents containing term
_termDocs->seek(term);
//return the enumaration
return _termDocs;
}
TermPositions* IndexReader::termPositions(Term* term) const{
//Func - Returns an enumeration of all the documents which contain term. For each
// document, in addition to the document number and frequency of the term in
// that document, a list of all of the ordinal positions of the term in the document
// is available. Thus, this method implements the mapping:
//
// Term => <docNum, freq,<pos 1, pos 2, ...pos freq-1>>*
//
// This positional information faciliates phrase and proximity searching.
// The enumeration is ordered by document number. Each document number is greater than
// all that precede it in the enumeration.
//Pre - term != NULL
//Post - A reference to TermPositions containing an enumeration of all found documents
// has been returned
CND_PRECONDITION(term != NULL, "term is NULL");
//Reference an instantiated termPositions instance
TermPositions* _termPositions = termPositions();
//Seek all documents containing term
_termPositions->seek(term);
//return the enumeration
return _termPositions;
}
void IndexReader::deleteDocument(const int32_t docNum) {
//Func - Deletes the document numbered docNum. Once a document is deleted it will not appear
// in TermDocs or TermPostitions enumerations. Attempts to read its field with the document
// method will result in an error. The presence of this document may still be reflected in
// the docFreq statistic, though this will be corrected eventually as the index is further modified.
//Pre - docNum >= 0
//Post - If successful the document identified by docNum has been deleted. If no writelock
// could be obtained an exception has been thrown stating that the index was locked or has no write access
SCOPED_LOCK_MUTEX(THIS_LOCK)
CND_PRECONDITION(docNum >= 0, "docNum is negative");
if (directoryOwner)
aquireWriteLock();
//Have the document identified by docNum deleted
doDelete(docNum);
hasChanges = true;
}
/**
* Commit changes resulting from delete, undeleteAll, or setNorm operations
*
* @throws IOException
*/
void IndexReader::commit(){
SCOPED_LOCK_MUTEX(THIS_LOCK)
if(hasChanges){
if(directoryOwner){
{
SCOPED_LOCK_MUTEX(directory->THIS_LOCK) // in- & inter-process sync
LuceneLock* commitLock = directory->makeLock("commit.lock");
IndexReaderCommitLockWith cl(commitLock,this);
cl.run();
_CLDELETE(commitLock);
}
if (writeLock != NULL) {
writeLock->release(); // release write lock
_CLDELETE(writeLock);
}
}else
doCommit();
}
hasChanges = false;
}
void IndexReader::undeleteAll(){
SCOPED_LOCK_MUTEX(THIS_LOCK)
if(directoryOwner)
aquireWriteLock();
doUndeleteAll();
hasChanges = true;
}
int32_t IndexReader::deleteDocuments(Term* term) {
//Func - Deletes all documents containing term. This is useful if one uses a
// document field to hold a unique ID string for the document. Then to delete such
// a document, one merely constructs a term with the appropriate field and the unique
// ID string as its text and passes it to this method.
//Pre - term != NULL
//Post - All documents containing term have been deleted. The number of deleted documents
// has been returned
CND_PRECONDITION(term != NULL, "term is NULL");
//Search for the documents contain term
TermDocs* docs = termDocs(term);
//Check if documents have been found
if ( docs == NULL ){
return 0;
}
//initialize
int32_t Counter = 0;
try {
//iterate through the found documents
while (docs->next()) {
//Delete the document
deleteDocument(docs->doc());
Counter++;
}
}_CLFINALLY(
//Close the enumeration
docs->close();
);
//Delete the enumeration of found documents
_CLVDELETE( docs ); //todo: not a clucene object... should be
//Return the number of deleted documents
return Counter;
}
void IndexReader::close() {
//Func - Closes files associated with this index and also saves any new deletions to disk.
// No other methods should be called after this has been called.
//Pre - true
//Post - All files associated with this index have been deleted and new deletions have been
// saved to disk
SCOPED_LOCK_MUTEX(THIS_LOCK)
CloseCallbackMap::iterator iter = closeCallbacks.begin();
for ( ;iter!=closeCallbacks.end();iter++){
CloseCallback callback = *iter->first;
callback(this,iter->second);
}
commit();
doClose();
if(closeDirectory){
directory->close();
_CLDECDELETE(directory);
}
}
bool IndexReader::isLocked(Directory* directory) {
//Func - Static method
// Checks if the index in the directory is currently locked.
//Pre - directory is a valid reference to a directory to check for a lock
//Post - Returns true if the index in the named directory is locked otherwise false
//Check the existence of the file write.lock and return true when it does and false
//when it doesn't
LuceneLock* l1 = directory->makeLock("write.lock");
LuceneLock* l2 = directory->makeLock("commit.lock");
bool ret = l1->isLocked() || l2->isLocked();
_CLDELETE(l1);
_CLDELETE(l2);
return ret;
}
bool IndexReader::isLocked(const char* directory) {
//Func - Static method
// Checks if the index in the named directory is currently locked.
//Pre - directory != NULL and contains the directory to check for a lock
//Post - Returns true if the index in the named directory is locked otherwise false
CND_PRECONDITION(directory != NULL, "directory is NULL");
//Create a buffer of length CL_MAXDIR
char f[CL_MAX_PATH+12]; //add 12 in case that directory is already 260 long
//Copy the directory string to the buffer
strcpy(f,directory);
//Cat the name of the write.lock file to buffer
strcat ( f,"/write.lock" );
Directory* dir = FSDirectory::getDirectory(directory,false);
bool ret = isLocked(dir);
dir->close();
_CLDECDELETE(dir);
return ret;
}
void IndexReader::unlock(const char* path){
FSDirectory* dir = FSDirectory::getDirectory(path,false);
unlock(dir);
dir->close();
_CLDECDELETE(dir);
}
void IndexReader::unlock(Directory* directory){
//Func - Static method
// Forcibly unlocks the index in the named directory->
// Caution: this should only be used by failure recovery code,
// when it is known that no other process nor thread is in fact
// currently accessing this index.
//Pre - directory is a valid reference to a directory
//Post - The directory has been forcibly unlocked
LuceneLock* lock;
lock = directory->makeLock("write.lock");
lock->release();
_CLDELETE(lock);
lock = directory->makeLock("commit.lock");
lock->release();
_CLDELETE(lock);
}
void IndexReader::addCloseCallback(CloseCallback callback, void* parameter){
closeCallbacks.put(callback, parameter);
}
//Constructor
IndexReader::IndexReaderLockWith::IndexReaderLockWith(CL_NS(store)::LuceneLock* lock, CL_NS(store)::Directory* dir):
CL_NS(store)::LuceneLockWith(lock,LUCENE_COMMIT_LOCK_TIMEOUT)
{
this->directory = dir;
}
//Constructor
IndexReader::IndexReaderCommitLockWith::IndexReaderCommitLockWith( CL_NS(store)::LuceneLock* lock, IndexReader* r ):
CL_NS(store)::LuceneLockWith(lock,LUCENE_COMMIT_LOCK_TIMEOUT),
reader(r)
{
}
void* IndexReader::IndexReaderCommitLockWith::doBody(){
reader->doCommit();
reader->segmentInfos->write(reader->getDirectory());
return NULL;
}
CL_NS_END
?? 快捷鍵說明
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -