إضافة مستند إلى مؤشر Lucene يسبب تعطل
سؤال
أحاول فهرسة ملف MP3 مع إطار ID3 واحد فقط. باستخدام كلوسين و taglib. الرمز التالي يعمل بشكل جيد:
...
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);
}
...
لكن هذا واحد يجعل تعطل التطبيق:
...
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);
}
...
لماذا هذا؟!
المحلول
هذه مشكلة نطاق - بحلول الوقت الذي تتصل فيه كاتب -> AddDocument ، يتم تحرير الحقول التي أضفتها إليها. استخدم هذا الرمز بدلاً من ذلك:
document->add(* new lucene::document::Field(fieldName, fieldValue, true, true, true, false));
قد ترغب في إلقاء نظرة على CL_DEMO و CL_TEST لرؤية بعض عينات التعليمات البرمجية.
نصائح أخرى
ألا تحتاج إلى إنشاء Lucene :: Document :: حقل لكل علامة تضيفه؟ يبدو أنك تعيد استخدام العنوان نفسه لهذا الغرض ، وهو أمر يمثل مشكلة. أعتقد أن تصحيح الأخطاء يمكن أن يخبرك أكثر.
لا تنتمي إلى StackOverflow