l'ajout d'un document à un accident provoque d'index Lucene
Question
Je suis en train d'indexer un fichier mp3 avec un seul cadre ID3. en utilisant CLucene et TagLib. le code suivant fonctionne très bien:
...
TagLib::MPEG::File file("/home/user/Depeche Mode - Personal Jesus.mp3");
if (file.ID3v2Tag()) {
TagLib::ID3v2::FrameList frameList = file.ID3v2Tag()->frameList();
lucene::document::Document *document = new lucene::document::Document;
TagLib::ID3v2::FrameList::ConstIterator frame = frameList.begin();
std::wstring field_name((*frame)->frameID().begin(), (*frame)->frameID().end());
const wchar_t *fieldName = field_name.c_str();
const wchar_t *fieldValue = (*frame)->toString().toWString().c_str();
lucene::document::Field field(fieldName, fieldValue, true, true, true, false);
document->add(field);
writer->addDocument(document);
}
...
mais celui-ci fait le plantage de l'application:
...
TagLib::MPEG::File file("/home/user/Depeche Mode - Personal Jesus.mp3");
if (file.ID3v2Tag()) {
TagLib::ID3v2::FrameList frameList = file.ID3v2Tag()->frameList();
lucene::document::Document *document = new lucene::document::Document;
for (TagLib::ID3v2::FrameList::ConstIterator frame = frameList.begin(); frame != frameList.end(); frame++) {
std::wstring field_name((*frame)->frameID().begin(), (*frame)->frameID().end());
const wchar_t *fieldName = field_name.c_str();
const wchar_t *fieldValue = (*frame)->toString().toWString().c_str();
lucene::document::Field field(fieldName, fieldValue, true, true, true, false);
document->add(field);
}
writer->addDocument(document);
}
...
pourquoi?
La solution
Ceci est une question de portée - au moment où vous appelez writer-> addDocument, les champs vous y avez ajoutés sont libérés. Utilisez plutôt ce code:
document->add(* new lucene::document::Field(fieldName, fieldValue, true, true, true, false));
Vous voudrez peut-être regarder cl_demo et cl_test pour voir quelques exemples de code.
Autres conseils
Ne pas vous devez construire un nouveau Lucene :: :: Document champ par tag vous ajoutez? Il semble que vous réutilisez la même adresse pour ce qui est problématique. Je suppose qu'un débogueur pourrait vous en dire plus.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow