public static function addInformationObjectIndex(QubitInformationObject $informationObject, $language, $options = array()) { // Only ROOT node should have no parent, don't index if (null === $informationObject->parent) { return; } $doc = new Zend_Search_Lucene_Document(); // Reference elements $doc->addField(Zend_Search_Lucene_Field::Keyword('id', $informationObject->id)); $doc->addField(Zend_Search_Lucene_Field::Keyword('slug', $informationObject->slug)); $doc->addField(Zend_Search_Lucene_Field::Keyword('culture', $language)); $doc->addField(Zend_Search_Lucene_Field::Keyword('className', 'QubitInformationObject')); $doc->addField(Zend_Search_Lucene_Field::UnIndexed('parentId', $informationObject->parentId)); $doc->addField(Zend_Search_Lucene_Field::Keyword('parent', $informationObject->parent->slug)); $doc->addField(Zend_Search_Lucene_Field::UnIndexed('collectionRootId', $informationObject->getCollectionRoot()->id)); $doc->addField(Zend_Search_Lucene_Field::Keyword('collectionRootSlug', $informationObject->getCollectionRoot()->slug)); $doc->addField(Zend_Search_Lucene_Field::UnIndexed('collectionRootTitle', $informationObject->getCollectionRoot()->getTitle())); // Digital object information if ($digitalObject = $informationObject->getDigitalObject()) { $doc->addField(Zend_Search_Lucene_Field::Keyword('hasDigitalObject', 'true')); $doc->addField(Zend_Search_Lucene_Field::Keyword('do_mediaTypeId', $digitalObject->mediaTypeId)); if (null !== $digitalObject->thumbnail) { $doc->addField(Zend_Search_Lucene_Field::UnIndexed('do_thumbnail_FullPath', $digitalObject->thumbnail->getFullPath())); } // $doc->addField(Zend_Search_Lucene_Field::Unstored('mediatype', $digitalObject->getMediaType()->getName(array('culture' => $language)))); // $doc->addField(Zend_Search_Lucene_Field::Unstored('filename', $digitalObject->getName())); // $doc->addField(Zend_Search_Lucene_Field::Unstored('mimetype', $digitalObject->mimeType)); } else { $doc->addField(Zend_Search_Lucene_Field::Keyword('hasDigitalObject', 'false')); } // Title // include an i18n fallback for proper search result display in case the title field was not translated if (0 < strlen($informationObject->getTitle(array('culture' => $language)))) { $titleField = Zend_Search_Lucene_Field::Text('title', $informationObject->getTitle(array('culture' => $language))); } else { $titleField = Zend_Search_Lucene_Field::Text('title', $informationObject->getTitle(array('sourceCulture' => true))); } // Boost the hit relevance for the title field $titleField->boost = 10; $doc->addField($titleField); // Publication status $doc->addField(Zend_Search_Lucene_Field::Text('publicationStatusId', $informationObject->getPublicationStatus()->status->id)); $doc->addField(Zend_Search_Lucene_Field::Text('scopeAndContent', $informationObject->getScopeAndContent(array('culture' => $language)))); $doc->addField(Zend_Search_Lucene_Field::Text('referenceCode', $informationObject->referenceCode)); // Store dates as serialized array $dates = array(); foreach ($informationObject->getDates() as $date) { $save_date['id'] = $date->id; $save_date['rendered'] = Qubit::renderDateStartEnd($date->getDate(array('cultureFallback' => true)), $date->startDate, $date->endDate); $save_date['type'] = $date->getType(array('cultureFallback' => true))->__toString(); if (isset($date->actor)) { $save_date['actor'] = $date->actor->__toString(); } $dates[] = $save_date; } $doc->addField(Zend_Search_Lucene_Field::UnIndexed('dates', serialize($dates))); // CREATOR $creatorField = Zend_Search_Lucene_Field::Unstored('creator', $informationObject->getCreatorsNameString(array('culture' => $language))); // Boost the hit relevance for the creator field $creatorField->boost = 8; $doc->addField($creatorField); $doc->addField(Zend_Search_Lucene_Field::Unstored('creatorhistory', $informationObject->getCreatorsHistoryString(array('culture' => $language)))); // Level of Description if (null !== $informationObject->getLevelOfDescription()) { $doc->addField(Zend_Search_Lucene_Field::Text('levelOfDescription', $informationObject->getLevelOfDescription()->getName(array('culture' => $language)))); } else { $doc->addField(Zend_Search_Lucene_Field::UnIndexed('levelOfDescription', null)); } // Repository $repository = $informationObject->getRepository(array('inherit' => true)); if (null !== $repository) { $doc->addField(Zend_Search_Lucene_Field::Keyword('repositoryId', $repository->id)); $doc->addField(Zend_Search_Lucene_Field::Keyword('repositorySlug', $repository->slug)); $doc->addField(Zend_Search_Lucene_Field::Text('repositoryName', $repository->getAuthorizedFormOfName(array('culture' => $language)))); } else { $doc->addField(Zend_Search_Lucene_Field::UnIndexed('repositoryId', null)); $doc->addField(Zend_Search_Lucene_Field::UnIndexed('repositorySlug', null)); $doc->addField(Zend_Search_Lucene_Field::UnIndexed('repositoryName', null)); } // Identifier $identifierField = Zend_Search_Lucene_Field::Text('identifier', $informationObject->getIdentifier()); $identifierField->boost = 5; $doc->addField($identifierField); // I18n fields $doc->addField(Zend_Search_Lucene_Field::Unstored('alternatetitle', $informationObject->getAlternateTitle(array('culture' => $language)))); $doc->addField(Zend_Search_Lucene_Field::Unstored('edition', $informationObject->getEdition(array('culture' => $language)))); $doc->addField(Zend_Search_Lucene_Field::Unstored('extentandmedium', $informationObject->getExtentAndMedium(array('culture' => $language)))); $doc->addField(Zend_Search_Lucene_Field::Unstored('archivalhistory', $informationObject->getArchivalHistory(array('culture' => $language)))); $doc->addField(Zend_Search_Lucene_Field::Unstored('acquisition', $informationObject->getAcquisition(array('culture' => $language)))); $doc->addField(Zend_Search_Lucene_Field::Unstored('appraisal', $informationObject->getAppraisal(array('culture' => $language)))); $doc->addField(Zend_Search_Lucene_Field::Unstored('accruals', $informationObject->getAccruals(array('culture' => $language)))); $doc->addField(Zend_Search_Lucene_Field::Unstored('arrangement', $informationObject->getArrangement(array('culture' => $language)))); $doc->addField(Zend_Search_Lucene_Field::Unstored('accessconditions', $informationObject->getAccessConditions(array('culture' => $language)))); $doc->addField(Zend_Search_Lucene_Field::Unstored('reproductionconditions', $informationObject->getReproductionConditions(array('culture' => $language)))); $doc->addField(Zend_Search_Lucene_Field::Unstored('physicalcharacteristics', $informationObject->getPhysicalCharacteristics(array('culture' => $language)))); $doc->addField(Zend_Search_Lucene_Field::Unstored('findingaids', $informationObject->getFindingAids(array('culture' => $language)))); $doc->addField(Zend_Search_Lucene_Field::Unstored('locationoforiginals', $informationObject->getLocationOfOriginals(array('culture' => $language)))); $doc->addField(Zend_Search_Lucene_Field::Unstored('locationofcopies', $informationObject->getLocationOfCopies(array('culture' => $language)))); $doc->addField(Zend_Search_Lucene_Field::Unstored('relatedunitsofdescription', $informationObject->getRelatedUnitsOfDescription(array('culture' => $language)))); // Subjects $subjectField = Zend_Search_Lucene_Field::Unstored('subject', $informationObject->getAccessPointsString(QubitTaxonomy::SUBJECT_ID, array('culture' => $language))); // Boost the hit relevance for the subject field $subjectField->boost = 5; $doc->addField($subjectField); // Place $placeField = Zend_Search_Lucene_Field::Unstored('place', $informationObject->getAccessPointsString(QubitTaxonomy::PLACE_ID, array('culture' => $language))); // Boost the hit relevance for the place field $placeField->boost = 3; $doc->addField($placeField); // Names $nameField = Zend_Search_Lucene_Field::Unstored('name', $informationObject->getNameAccessPointsString(array('culture' => $language))); // Boost the hit relevance for the place field $nameField->boost = 3; $doc->addField($nameField); $cultureInfo = sfCultureInfo::getInstance($language); $languages = $cultureInfo->getLanguages(); $scripts = $cultureInfo->getScripts(); // Languages if (0 < count($properties = $informationObject->getProperties($name = 'language'))) { $languageCodes = unserialize($properties->offsetGet(0)->getValue(array('sourceCulture' => true))); if (0 < count($languageCodes)) { $languageString = ''; foreach ($languageCodes as $languageCode) { $languageString .= $languages[$languageCode] . ' '; } $doc->addField(Zend_Search_Lucene_Field::Unstored('language', rtrim($languageString))); } } // Scripts if (0 < count($properties = $informationObject->getProperties($name = 'script'))) { $scriptCodes = unserialize($properties->offsetGet(0)->getValue(array('sourceCulture' => true))); if (0 < count($scriptCodes)) { $scriptString = ''; foreach ($scriptCodes as $scriptCode) { $scriptString .= $scripts[$scriptCode] . ' '; } $doc->addField(Zend_Search_Lucene_Field::Unstored('script', rtrim($scriptString))); } } // Notes if (0 < count($notes = $informationObject->getNotes())) { $noteString = ''; foreach ($notes as $note) { $noteString .= $note->getContent(array('culture' => $language)) . ' '; } $doc->addField(Zend_Search_Lucene_Field::Unstored('notes', $noteString)); } // Exclude control area fields for now, maybe add a seperate index for administrative data? // (institution_responsible_identifier, rules, sources, revision_history) // To come: // Add all dynamic metadata fields to index self::getInstance()->getEngine()->getIndex()->addDocument($doc); }