To use this feature you have to call the following command in the
elasticsearch directory:
./bin/plugin -install elasticsearch/elasticsearch-mapper-attachments/1.6.0
This installs the tika file analysis plugin. More infos about supported formats
can be found here: {@link http://tika.apache.org/0.7/formats.html} /** * Transforms an object into an elastica object having the required keys * * @param object $object the object to convert * @param array $fields the keys we want to have in the returned array * * @return Document **/ public function transform($object, array $fields) { $identifier = $this->propertyAccessor->getValue($object, $this->options['identifier']); $document = new Document($identifier); foreach ($fields as $key => $mapping) { if ($key == '_parent') { $property = null !== $mapping['property'] ? $mapping['property'] : $mapping['type']; $value = $this->propertyAccessor->getValue($object, $property); $document->setParent($this->propertyAccessor->getValue($value, $mapping['identifier'])); continue; } $value = $this->propertyAccessor->getValue($object, $key); if (isset($mapping['type']) && in_array($mapping['type'], array('nested', 'object')) && isset($mapping['properties']) && !empty($mapping['properties'])) { /* $value is a nested document or object. Transform $value into * an array of documents, respective the mapped properties. */ $document->set($key, $this->transformNested($value, $mapping['properties'])); continue; } if (isset($mapping['type']) && $mapping['type'] == 'attachment') { // $value is an attachment. Add it to the document. if ($value instanceof \SplFileInfo) { $document->addFile($key, $value->getPathName()); } else { $document->addFileContent($key, $value); } continue; } $document->set($key, $this->normalizeValue($value)); } return $document; }
/** * @group unit */ public function testAddFile() { $fileName = '/dev/null'; if (!file_exists($fileName)) { $this->markTestSkipped("File {$fileName} does not exist."); } $doc = new Document(); $returnValue = $doc->addFile('key', $fileName); $this->assertInstanceOf('Elastica\\Document', $returnValue); }
public function testExcludeFileSource() { $indexMapping = array('file' => array('type' => 'attachment', 'store' => 'yes'), 'text' => array('type' => 'string', 'store' => 'yes'), 'title' => array('type' => 'string', 'store' => 'yes')); $indexParams = array('index' => array('number_of_shards' => 1, 'number_of_replicas' => 0)); $index = $this->_createIndex(); $type = new Type($index, 'content'); $mapping = Mapping::create($indexMapping); $mapping->setSource(array('excludes' => array('file'))); $mapping->setType($type); $index->create($indexParams, true); $type->setMapping($mapping); $docId = 1; $text = 'Basel World'; $title = 'No Title'; $doc1 = new Document($docId); $doc1->addFile('file', BASE_PATH . '/data/test.docx'); $doc1->set('text', $text); $doc1->set('title', $title); $type->addDocument($doc1); // Optimization necessary, as otherwise source still in realtime get $index->optimize(); $data = $type->getDocument($docId)->getData(); $this->assertEquals($data['title'], $title); $this->assertEquals($data['text'], $text); $this->assertFalse(isset($data['file'])); }
public function testAddFile() { $doc = new Document(); $returnValue = $doc->addFile('key', '/dev/null'); $this->assertInstanceOf('Elastica\\Document', $returnValue); }
/** * Transforms the given object to an elastica document * * @param object $object the object to convert * @param array $fields the keys we want to have in the returned array * @param string $identifier the identifier for the new document * @return Document */ protected function transformObjectToDocument($object, array $fields, $identifier = '') { $document = new Document($identifier); foreach ($fields as $key => $mapping) { if ($key == '_parent') { $property = null !== $mapping['property'] ? $mapping['property'] : $mapping['type']; $value = $this->propertyAccessor->getValue($object, $property); $document->setParent($this->propertyAccessor->getValue($value, $mapping['identifier'])); continue; } $path = isset($mapping['property_path']) ? $mapping['property_path'] : $key; if (false === $path) { continue; } $value = $this->propertyAccessor->getValue($object, $path); if (isset($mapping['type']) && in_array($mapping['type'], array('nested', 'object')) && isset($mapping['properties']) && !empty($mapping['properties'])) { /* $value is a nested document or object. Transform $value into * an array of documents, respective the mapped properties. */ $document->set($key, $this->transformNested($value, $mapping['properties'])); continue; } if (isset($mapping['type']) && $mapping['type'] == 'attachment') { // $value is an attachment. Add it to the document. if ($value instanceof \SplFileInfo) { $document->addFile($key, $value->getPathName()); } else { $document->addFileContent($key, $value); } continue; } $document->set($key, $this->normalizeValue($value)); } if ($this->dispatcher) { $event = new TransformEvent($document, $fields, $object); $this->dispatcher->dispatch(TransformEvent::POST_TRANSFORM, $event); $document = $event->getDocument(); } return $document; }