mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-04-15 05:32:21 +00:00
Refactoring CLucene
There are some issues with document deletion and support for the latest release of CLucene which may be related to having concurrent IndexWriters and IndexReaders. This refactoring works fine on Linux. Pushed for safety for any users that may be experiencing issues when deleting rides. Further investigation is required on mac and windows builds.
This commit is contained in:
@@ -408,7 +408,7 @@ any 0.9 branch should work fine, let us know if you experience any issues. You m
|
||||
that the libclucene0ldbl runtime is already installed, this is fine and typical since
|
||||
clucene is a very popular search library.
|
||||
|
||||
$ sudo apt-get install clucene-core
|
||||
$ sudo apt-get install libclucene-dev
|
||||
$ sudo apt-get install libclucene0ldbl
|
||||
|
||||
By default, and this is deliberate, the clucene install places the config headers into
|
||||
|
||||
@@ -35,7 +35,7 @@ Lucene::Lucene(MainWindow *parent) : QObject(parent), main(parent)
|
||||
main->home.mkdir("index");
|
||||
|
||||
// make index directory if needed
|
||||
QDir dir(main->home.canonicalPath() + "/index");
|
||||
dir = QDir(main->home.canonicalPath() + "/index");
|
||||
|
||||
try {
|
||||
|
||||
@@ -54,9 +54,6 @@ Lucene::Lucene(MainWindow *parent) : QObject(parent), main(parent)
|
||||
delete create;
|
||||
}
|
||||
|
||||
// now lets open using a mnodifier since the API is much simpler
|
||||
writer = new IndexWriter(dir.canonicalPath().toLocal8Bit().data(), &analyzer, false); // for updates
|
||||
|
||||
} catch (CLuceneError &e) {
|
||||
|
||||
qDebug()<<"clucene error!"<<e.what();
|
||||
@@ -65,12 +62,6 @@ Lucene::Lucene(MainWindow *parent) : QObject(parent), main(parent)
|
||||
|
||||
Lucene::~Lucene()
|
||||
{
|
||||
try {
|
||||
|
||||
writer->flush();
|
||||
writer->close();
|
||||
//XXXdelete writer; Causes a SEGV !?
|
||||
} catch(CLuceneError &e) {}
|
||||
}
|
||||
|
||||
bool Lucene::importRide(SummaryMetrics *, RideFile *ride, QColor , unsigned long, bool)
|
||||
@@ -99,7 +90,17 @@ bool Lucene::importRide(SummaryMetrics *, RideFile *ride, QColor , unsigned long
|
||||
deleteRide(ride->getTag("Filename", ""));
|
||||
|
||||
// now add to index
|
||||
try { writer->addDocument(&doc); } catch (CLuceneError &e) {}
|
||||
try {
|
||||
|
||||
// now lets open using a mnodifier since the API is much simpler
|
||||
IndexWriter *writer = new IndexWriter(dir.canonicalPath().toLocal8Bit().data(), &analyzer, false); // for updates
|
||||
writer->addDocument(&doc);
|
||||
writer->close();
|
||||
delete writer;
|
||||
|
||||
} catch (CLuceneError &e) {
|
||||
qDebug()<<"add document clucene error!"<<e.what();
|
||||
}
|
||||
|
||||
doc.clear();
|
||||
|
||||
@@ -110,16 +111,31 @@ bool Lucene::deleteRide(QString name)
|
||||
{
|
||||
std::wstring cname = name.toStdWString();
|
||||
|
||||
try { writer->deleteDocuments(new Term(_T("Filename"), cname.c_str())); } catch (CLuceneError &e) {}
|
||||
try {
|
||||
|
||||
IndexReader *reader = IndexReader::open(dir.canonicalPath().toLocal8Bit().data());
|
||||
reader->deleteDocuments(new Term(_T("Filename"), cname.c_str()));
|
||||
reader->close();
|
||||
delete reader;
|
||||
|
||||
} catch (CLuceneError &e) {
|
||||
qDebug()<<"deleteDocuments clucene error!"<<e.what();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void Lucene::optimise()
|
||||
{
|
||||
try {
|
||||
writer->flush();
|
||||
|
||||
IndexWriter *writer = new IndexWriter(dir.canonicalPath().toLocal8Bit().data(), &analyzer, false); // for updates
|
||||
writer->optimize();
|
||||
} catch(CLuceneError &e) {}
|
||||
writer->close();
|
||||
delete writer;
|
||||
|
||||
} catch(CLuceneError &e) {
|
||||
qDebug()<<"optimise clucene error!"<<e.what();
|
||||
}
|
||||
}
|
||||
|
||||
int Lucene::search(QString query)
|
||||
@@ -135,18 +151,21 @@ int Lucene::search(QString query)
|
||||
|
||||
if (lquery == NULL) return 0;
|
||||
|
||||
reader = IndexReader::open(writer->getDirectory()); // for querying against
|
||||
searcher = new IndexSearcher(reader); // to perform searches
|
||||
IndexReader *reader = IndexReader::open(dir.canonicalPath().toLocal8Bit().data());
|
||||
IndexSearcher *searcher = new IndexSearcher(reader); // to perform searches
|
||||
|
||||
// go find hits
|
||||
hits = searcher->search(lquery);
|
||||
filenames.clear();
|
||||
|
||||
for (unsigned int i=0; i< hits->length(); i++) {
|
||||
for (int i=0; i< hits->length(); i++) {
|
||||
Document *d = &hits->doc(i);
|
||||
filenames << QString::fromWCharArray(d->get(_T("Filename")));
|
||||
}
|
||||
|
||||
searcher->close();
|
||||
reader->close();
|
||||
|
||||
delete hits;
|
||||
delete lquery;
|
||||
delete searcher;
|
||||
|
||||
@@ -63,12 +63,10 @@ signals:
|
||||
|
||||
private:
|
||||
MainWindow *main;
|
||||
QDir dir;
|
||||
|
||||
// CLucene objects
|
||||
SimpleAnalyzer analyzer;
|
||||
IndexWriter* writer;
|
||||
IndexReader* reader;
|
||||
IndexSearcher* searcher;
|
||||
|
||||
// Query results
|
||||
Hits *hits; // null when no results
|
||||
|
||||
Reference in New Issue
Block a user