2015-07-06 2 views
0

Когда я пытаюсь добавить новые документы к типу индекса, я теряю существующие документы, которые перезаписываются новыми добавленными. Проблема может быть связана с идентификатором каждого добавленного документа?Elastica добавляет документы, переопределяет существующие

Вот код:

 $elasticaClient = new \Elastica\Client(array(
       'host' => $this->container->getParameter('elastic_host'), 
       'port' => $this->container->getParameter('elastic_port') 
      )); 
    $elasticaIndex = $elasticaClient->getIndex('app'); 
      $elasticaIndex->create(
      array(
       'number_of_shards' => 4, 
       'number_of_replicas' => 1, 
       'analysis' => array(
        'analyzer' => array(
         'indexAnalyzer' => array(
          'type' => 'custom', 
          'tokenizer' => 'standard', 
          'filter' => array('lowercase', 'mySnowball') 
         ), 
         'searchAnalyzer' => array(
          'type' => 'custom', 
          'tokenizer' => 'standard', 
          'filter' => array('standard', 'lowercase', 'mySnowball') 
         ) 
        ), 
        'filter' => array(
         'mySnowball' => array(
          'type' => 'snowball', 
          'language' => 'German' 
         ) 
        ) 
       ) 
      ), 
      true 
     ); 
    $elasticaType = $elasticaIndex->getType('type'); 
     $mapping = new \Elastica\Type\Mapping(); 
     $mapping->setType($elasticaType); 
     $mapping->setParam('index_analyzer', 'indexAnalyzer'); 
     $mapping->setParam('search_analyzer', 'searchAnalyzer'); 
     $mapping->setProperties(array(
      'id'  => array('type' => 'string'), 
      'title'  => array('type' => 'string'), 
      'duration'  => array('type' => 'string'), 
      'start'  => array('type' => 'string'), 
      'end'  => array('type' => 'string'), 
     )); 

     // Send mapping to type 
     $mapping->send(); 

    $documents = array(); 
      foreach($medias as $media) { 
       $id = uniqid() ; 
       $documents[] = new \Elastica\Document(
        $id, 
        array(
        'id'  => $id, 
        'title' => $media['title'], 
        'duration' => $media['duration'], 
        'start' => $media['start'], 
        'end'  => $media['end'], 

        ) 
       ); 
      } 

$elasticaType->addDocuments($documents); 
$elasticaType->getIndex()->refresh(); 

Пожалуйста, мне нужна ваша помощь. Спасибо

ответ

3

PHP does not recommend используя uniqid для этого прецедента. Поскольку вы хотите случайный, безопасный идентификатор, пусть Elasticsearch сделает это за вас. В Elastica Document construct method указано, что поле id является необязательным. Так что не передавайте его и пусть Elasticsearch выдаст id.