Ganhe Rápido nos Jogos Populares do Cassino Online 580bet! |
Cassino bet 7k: Diversão e Grandes Vitórias Esperam por Você! |
Aposte e Vença no Cassino leao – Jogos Fáceis e Populares! |
Jogos Populares e Grandes Prêmios no Cassino Online luck 2! |
Descubra os Jogos Mais Populares no Cassino john bet e Ganhe! |
7755 bet: Apostas Fáceis, Grandes Oportunidades de Vitória! |
Jogue no Cassino Online cbet e Aumente suas Chances de Ganhar! |
Ganhe Prêmios Incríveis com Jogos Populares no Cassino bet7! |
Cassino pk55: Onde a Sorte Está ao Seu Lado! |
Experimente o Cassino 8800 bet e Ganhe com Jogos Populares! |
Ganhe Facilmente no Cassino Online doce! |
Aposte e Vença no Cassino bet 4! |
Jogos Populares e Grandes Premiações na f12bet! |
Descubra a Diversão e Vitória no Cassino bet7! |
Aposte nos Jogos Mais Populares do Cassino ggbet! |
Ganhe Prêmios Rápidos no Cassino Online bet77! |
Jogos Fáceis e Rápidos no Cassino mrbet! |
Jogue e Ganhe com Facilidade no Cassino bet61! |
Cassino tvbet: Onde a Sorte Está Ao Seu Lado! |
Aposte nos Melhores Jogos do Cassino Online pgwin! |
Ganhe Grande no Cassino today com Jogos Populares! |
Cassino fuwin: Grandes Vitórias Esperam por Você! |
Experimente os Melhores Jogos no Cassino brwin! |
Jogue e Ganhe no Cassino bet7k – Simples e Rápido! |
Cassino tv bet: Vença com Jogos Populares e Simples! |
Ganhe no Cassino Online allwin com Facilidade! |
Aposte nos Jogos Mais Famosos no Cassino stake! |
bwin 789: Aposta Fácil, Vitória Garantida! |
Descubra os Jogos Populares do Cassino lvbet e Vença! |
Jogue no Cassino blaze e Ganhe Grandes Prêmios! |
Cassino dj bet: Simples, Divertido e Lucrativo! |
Aposte e Ganhe no Cassino umbet – Diversão Garantida! |
Ganhe Rápido nos Jogos do Cassino Online b1bet! |
20bet: Jogue e Ganhe com Facilidade e Diversão! |
Cassino bk bet: Entre Agora e Ganhe Grandes Prêmios! |
Jogue no Cassino h2bet e Conquiste Grandes Vitórias! |
Ganhe no Cassino 7kbet com Jogos Populares e Fáceis! |
Aposte e Conquiste Prêmios no Cassino Online fbbet! |
Diversão e Prêmios Fáceis no Cassino 9d bet! |
Cassino Online 9k bet: Jogos Populares, Grandes Oportunidades! |
Jogue no Cassino 73 bet e Aumente Suas Chances de Vitória! |
Cassino ktobet: Onde Você Pode Ganhar Facilmente! |
Ganhe Rápido com os Jogos Populares do Cassino 74 bet! |
Aposte nos Melhores Jogos e Ganhe no Cassino betpix! |
betvip: Onde a Sorte Encontra os Melhores Jogadores! |
Jogue no Cassino batbet e Ganhe Prêmios Instantâneos! |
Ganhe Agora nos Jogos do Cassino Online onabet! |
Cassino f12bet: Diversão e Vitórias Esperam por Você! |
Aposte Agora no Cassino codbet e Ganhe com Facilidade! |
Jogos Populares do Cassino winbra para Você Ganhar! |
Ganhe Grande com os Jogos Mais Populares no b2xbet! |
Cassino obabet: Jogue Agora e Conquiste Grandes Vitórias! |
Experimente a Diversão e Ganhe no Cassino Online brlwin! |
Jogue nos Melhores Jogos e Vença no Cassino onebra! |
Ganhe Prêmios Fáceis e Rápidos no Cassino winbrl! |
Aposte nos Jogos Populares do Cassino omgbet e Ganhe! |
Cassino queens: Grandes Oportunidades de Vitória! |
Ganhe Facilmente com os Jogos do Cassino Online brdice! |
brapub: Aposte Agora e Conquiste Grandes Vitórias! |
Aposte e Ganhe com Facilidade no Cassino Online flames! |
Ganhe Dinheiro Fácil nos Jogos do Cassino betano! |
Cassino aajogo: Jogos Populares e Grandes Prêmios! |
Jogue e Vença no Cassino iribet – Onde a Sorte Está! |
Aposte no Cassino pixbet e Ganhe Prêmios Fantásticos! |
Ganhe Grande nos Jogos Populares do Cassino betsul! |
Cassino Online fezbet: Onde Você Sempre Pode Ganhar! |
Aposte nos Melhores Jogos e Ganhe no Cassino curso beta! |
betway: Jogue e Ganhe Agora com Facilidade! |
Experimente o Cassino Online bkbet e Ganhe Rápido! |
Ganhe Dinheiro Jogando nos Jogos Populares do Cassino peixe beta! |
Jogue no Cassino bet365 e Ganhe de Forma Simples e Rápida! |
Ganhe No Cassino pixbet: Jogos Populares, Grandes Prêmios! |
Aposte Agora e Conquiste Vitórias no Cassino 4 play bet! |
Ganhe no Cassino Online 365bet: Diversão e Vitória! |
Cassino brxbet: Aposte com Facilidade e Ganhe Prêmios! |
Aposte no Cassino 939 bet e Vença Agora Mesmo! |
Cassino seubet: Ganhe Jogando os Melhores Jogos! |
Jogue no Cassino Online cnc bet e Aumente Suas Chances! |
Ganhe com Facilidade nos Jogos Populares do gbg bet! |
Jogue e Vença no Cassino 522bet – O Melhor para Você! |
Cassino Online brl bet: Apostas Fáceis, Grandes Vitórias! |
Ganhe com Facilidade no Cassino Online pagbet! |
Aposte no Cassino jonbet e Experimente a Diversão! |
jqk bet: Jogue e Ganhe com Prêmios Instantâneos! |
Ganhe Dinheiro Fácil nos Jogos do Cassino 166bet! |
Cassino Online abc bet: Onde os Jogos Populares Levam à Vitória! |
Aposte e Ganhe Agora nos Jogos do Cassino bggbet! |
Jogos Populares e Grandes Oportunidades de Vitória na obabet! |
Cassino 136bet: Onde Você Pode Ganhar Rápido e Fácil! |
Ganhe Agora nos Jogos Populares do Cassino mmabet! |
Aposte Agora no Cassino win bet e Conquiste Grandes Vitórias! |
Jogue nos Jogos Mais Populares e Ganhe no Cassino ir6 bet! |
Cassino 667bet: Jogue e Conquiste Vitórias Rápidas! |
Ganhe no Cassino Online qqq bet com Jogos Simples e Populares! |
193 bet: Apostas Fáceis, Grandes Chances de Ganhar! |
Ganhe Prêmios Rápidos e Simples no Cassino dobrowin! |
Aposte nos Melhores Jogos e Vença no Cassino betleao! |
Jogue e Ganhe no Cassino moverbet com Facilidade! |
Ganhe Agora no Cassino Online winzada 777 com Jogos Populares! |
supremo: Apostas Fáceis e Grandes Vitórias! |
Aposte nos Jogos Populares do Cassino casadeapostas e Vença! |
Cassino dobrowin: Grandes Premiações com Jogos Fáceis! |
Ganhe no Cassino betleao com Jogos Populares e Simples! |
Jogue e Vença Agora no Cassino moverbet! |
wazamba: Aposte e Ganhe Grande nos Jogos Populares! |
Cassino Online fezbet: Simples, Divertido e Lucrativo! |
Ganhe Agora nos Jogos Populares do Cassino betsson! |
Aposte e Vença no Cassino lvbet – Jogue e Ganhe! |
dobrowin: Onde Você Joga e Ganha Com Facilidade! |
Ganhe Rápido e Fácil no Cassino Online betsul! |
Ganhe Fácil no Cassino Online pixbet! |
Aposte e Vença com Jogos Populares no bwin! |
Jogos Fáceis, Grandes Vitórias no Cassino betobet! |
dobrowin: Apostas Simples, Grandes Premiações! |
Ganhe Agora nos Jogos Populares do Cassino bet7! |
Aposte nos Melhores Jogos e Ganhe no Cassino betcris! |
|
Jogue e Conquiste Grandes Prêmios no blaze! |
Ganhe Rápido com Jogos Populares no Cassino 888! |
Cassino betano: O Melhor Lugar para Apostar e Ganhar! |
Jogue Agora e Ganhe no Cassino Online stake! |
stake: Onde a Sorte Encontra os Melhores Jogadores! |
Ganhe Facilmente com os Jogos do Cassino esportesdasorte! |
Aposte e Vença no Cassino Online betmotion! |
Jogue nos Jogos Populares e Ganhe no rivalry! |
Aposte no novibet e Ganhe Grandes Prêmios! |
Cassino pinnacle: Grandes Vitórias com Jogos Populares! |
Ganhe Agora com os Jogos do Cassino cbet! |
Aposte e Conquiste Vitórias no dobrowin! |
betleao: Onde Grandes Vitórias São Fáceis de Alcançar! |
Ganhe Prêmios Rápidos no Cassino moverbet! |
Jogos Populares e Grandes Oportunidades no Cassino gogowin! |
jogos win: Vença com Jogos Populares e Rápidos! |
Aposte no Cassino campobet e Ganhe Grande! |
Ganhe Facilmente com os Jogos do Cassino mesk bet! |
Cassino infinity bet: Onde Jogadores Conquistam Prêmios! |
Jogue Agora no Cassino betfury e Ganhe Facilmente! |
Aposte com Facilidade e Ganhe no doce! |
Ganhe Jogando os Melhores Jogos no bet7k! |
Jogue e Vença no Cassino Online jogowin! |
lobo888: Aposte Agora e Ganhe Grandes Vitórias! |
Ganhe Agora no Cassino iribet com Facilidade! |
Jogue e Conquiste Prêmios no Cassino Online leao! |
dobrowin: Onde a Sorte Está ao Seu Lado! |
Aposte e Ganhe Grandes Prêmios no allwin! |
Ganhe Grandes Prêmios Jogando no aajogo! |
Jogos Populares e Grandes Oportunidades no pgwin! |
Ganhe Fácil com os Jogos Populares do Cassino greenbets! |
Aposte no brapub e Vença com Jogos Populares! |
Cassino moverbet: Aposte Agora e Ganhe Facilmente! |
Ganhe Agora com os Jogos Populares do onebra! |
Jogue e Vença Agora no Cassino flames! |
Ganhe Rápido com os Jogos do Cassino brdice! |
brwin: Jogos Populares e Grandes Vitórias! |
Aposte nos Jogos Populares e Ganhe no poplottery! |
queens: Grandes Prêmios Esperam por Você! |
Jogue Agora no winbrl e Ganhe Fácil! |
Aposte e Ganhe Prêmios Rápidos no Cassino omgbet! |
Ganhe no winbra com Jogos Populares e Simples! |
Aposte e Ganhe no Cassino goinbet Agora! |
Jogue Agora e Ganhe no codbet com Facilidade! |
betleao: Onde a Sorte Se Encontra com Você! |
Ganhe Rápido e Fácil no Cassino fuwin! |
allwin568: Aposte Agora e Ganhe com Facilidade! |
Ganhe Grande no Cassino wingdus! |
Aposte no juntosbet e Conquiste Grandes Vitórias! |
today: Onde Jogadores Ganham com Facilidade! |
Jogue no talon777 e Ganhe com Simplicidade! |
Ganhe Agora no Cassino Online brlwin com Facilidade! |
Aposte e Vença no fazobetai – O Cassino dos Vencedores! |
pinup bet: Ganhe Rápido com os Melhores Jogos! |
Aposte nos Melhores Jogos no bet sport e Ganhe! |
Ganhe no bet esporte com Jogos Fáceis e Populares! |
mrbet: O Cassino Online Onde Você Ganha Fácil! |
Ganhe no Cassino premier bet com Jogos Populares e Fáceis! |
Jogue e Vença no Cassino apostebet Agora! |
Aposte e Ganhe no spicy bet com Jogos Fáceis! |
Ganhe no prosport bet com Jogos Simples e Populares! |
Aposte e Conquiste Grandes Vitórias no bet nacional! |
Jogue Agora no luck e Ganhe Prêmios Rápidos! |
jogodeouro: Apostas Fáceis e Grandes Oportunidades de Vitória! |
Ganhe no heads bet com Facilidade nos Jogos Populares! |
Aposte no marjack bet e Ganhe Agora com Facilidade! |
Jogue no apostaganha e Ganhe Prêmios Instantâneos! |
gbg bet: Onde Você Sempre Ganha! |
Ganhe Fácil no Cassino esoccer bet com Jogos Populares! |
Aposte e Ganhe Grande no Cassino Online esport bet! |
Ganhe Agora com Jogos Populares no realbet! |
Jogue no aposte e ganhe e Conquiste Vitórias Rápidas! |
aviator aposta: Apostas Fáceis, Prêmios Incríveis! |
Ganhe no bet vitoria com Facilidade e Diversão! |
Aposte e Ganhe no imperador bet – Apostas Populares! |
Jogue no realsbet e Ganhe Prêmios Rápidos e Fáceis! |
Ganhe Agora com os Jogos do Cassino bet favorita! |
Cassino esportenet: Grandes Vitórias Esperam por Você! |
Aposte no flames bet e Conquiste Grandes Prêmios! |
Ganhe Fácil no pague bet com Jogos Populares! |
Jogue Agora no betsury e Ganhe Grande! |
doce888: Onde Você Joga e Ganha com Facilidade! |
Ganhe Grande no Cassino obabet Agora! |
Jogue no winzada e Ganhe Prêmios Fantásticos! |
Aposte e Ganhe no Cassino globalbet – O Melhor Lugar! |
bet77: Onde Jogos Populares Levam à Vitória! |
Ganhe Rápido com os Jogos do Cassino Online lottoland! |
Aposte e Vença Agora no 7gamesbet! |
Jogue no dicasbet e Conquiste Vitórias Fáceis! |
Ganhe Agora com os Jogos do Cassino esportivabet! |
Aposte no tvbet e Ganhe Rápido! |
sportbet: Apostas Fáceis com Grandes Resultados! |
Ganhe Grande no Cassino misterjackbet com Jogos Populares! |
Jogue no Cassino esportebet e Ganhe de Forma Simples e Rápida! |
Ganhe Rápido no Cassino Online nacionalbet! |
Aposte e Vença no simplesbet com Jogos Populares! |
betestrela: Cassino Online Fácil de Jogar e Ganhar! |
Jogos Populares, Grandes Premiações no batbet! |
Ganhe Fácil no Pk55 – O Cassino Online dos Vencedores! |
Aposte e Conquiste Vitórias no Cassino Bet61! |
Upsports Bet: Diversão e Grandes Ganhos com Jogos Populares! |
Ganhe Agora no roleta online com Jogos Simples e Populares! |
Jogue no roleta e Vença com Facilidade! |
Cassino Online poker online: Onde Você Pode Ganhar Agora! |
poker: Onde Jogadores Conquistam Grandes Vitórias! |
Ganhe Fácil no Cassino Online blackjack online com Jogos Populares! |
Aposte no bingo e Ganhe Rápido com Jogos Famosos! |
Ceará: Apostas Rápidas, Vitórias Imediatas! |
Ganhe Prêmios Fantásticos com Jogos Populares no Paysandu! |
Juventude: O Melhor Cassino Online para Ganhar! |
Jogue e Vença no Cassino Online Bahia com Facilidade! |
Sport: Grandes Oportunidades de Ganhar nos Jogos Populares! |
Aposte no Cassino Cuiabá e Conquiste Grandes Prêmios! |
Ganhe Rápido no Coritiba – Apostas Fáceis, Grandes Prêmios! |
Jogos Fáceis e Grandes Vitórias no Criciúma! |
Aposte no Vitória e Ganhe Com Facilidade nos Jogos Populares! |
Fortaleza: Onde a Sorte Está ao Seu Lado! |
Ganhe no Corinthians – Simples, Rápido e Divertido! |
Jogue Agora e Vença no Cassino São Paulo! |
Ganhe Agora no Cassino Online Vasco com Jogos Populares! |
Aposte e Ganhe no Cassino Online Grêmio! |
Fluminense: Onde Você Joga e Ganha com Facilidade! |
Ganhe no Cassino Cruzeiro com Jogos Populares e Fáceis! |
Botafogo: Ganhe Rápido com Jogos Populares! |
Cassino Flamengo: Vença Agora com Facilidade! |
Ganhe Agora com Jogos Populares no Cassino bingo slots! |
slots slots: Cassino Online Rápido e Simples de Ganhar! |
Aposte nos Jogos Populares e Ganhe no Cassino hacker do slot! |
pg slot demo: O Cassino Online Mais Fácil de Ganhar! |
Jogue e Vença Agora no slot win – Cassino Online Fácil! |
pg slot soft: Ganhe Grandes Prêmios com Jogos Fáceis! |
Cassino arne slot: Onde Você Pode Ganhar com Facilidade! |
Aposte Agora e Vença no Cassino Online riqueza slots! |
slots 777: Jogos Populares, Grandes Vitórias! |
Ganhe Agora no pg slot com Facilidade nos Jogos Populares! |
Jogue e Ganhe no 777 slot game com Apostas Simples! |
slot pg soft: Aposte Agora e Ganhe Rápido! |
Aposte e Vença nos Jogos Populares do Cassino hacker slot! |
Ganhe no 777 slots – Diversão e Grandes Prêmios! |
Jogue e Conquiste Vitórias no slot-pg-soft com Facilidade! |
Ganhe Prêmios Fáceis no Cassino Online fortune ox demo grátis! |
demo fortune ox: Apostas Fáceis e Grandes Oportunidades! |
Jogue no fortune mouse demo e Ganhe com Facilidade nos Jogos Populares! |
fortune ox demo: Onde a Sorte Está ao Seu Lado para Ganhar! |
Ganhe Grande no Cassino jogo fortune tiger com Jogos Populares! |
Cassino Online fortune tiger grátis: Ganhe Fácil e Rápido! |
Jogue Agora e Ganhe Prêmios Rápidos no fortune tiger baixar! |
fortune tiger demo grátis: O Cassino Mais Fácil para Ganhar! |
Aposte e Ganhe Rápido com Jogos Populares no fortune tiger demo! |
Ganhe Fácil no fortune tiger 777 com Jogos Simples e Rápidos!
ONGR Docs

Mapping

Elasticsearch bundle requires mapping definitions for it to work with complex operations, like insert and update documents, do a full-text search, etc.

Mapping configuration

Here's an example of configuration containing the definitions of filter and analyzer:

ongr_elasticsearch:
    analysis:
        filter:
            incremental_filter:
                type: edge_ngram
                min_gram: 1
                max_gram: 20
        analyzer:
            incrementalAnalyzer:  #-> analyzer name
                type: custom
                tokenizer: standard
                filter:
                    - lowercase
                    - incremental_filter
    managers:
        default:
            index:
                index_name: your_index_name
                hosts:
                    - 127.0.0.1:9200
            mappings:
                - AppBundle

From 5.0 version mapping was enchased, and now you can change documents directory. See the example below:

#...
    managers:
        custom_dir:
            index:
                index_name: your_index_name
                hosts:
                    - 127.0.0.1:9200
            mappings:
                AppBundle: ~ #Document dir will be Document.
                CustomBundle:
                    document_dir: Entity #For this bundle will search documents in the Entity.
                    
        default:
            index:
                index_name: your_index_name
                hosts:
                    - 127.0.0.1:9200
            mappings:
                - AppBundle

Both mappings are valid. In the above example, you can change the directory for the particular bundles where to find documents. Default dir remains Document.

At the very top, you can see analysis node. It represents Elasticsearch analysis. You can define here analyzers, tokenizers, token filters and character filters. Once you define any analysis, then it can be used in any document mapping.

e.g. let's say you want to use incremental analyzer and custom lowercase filter analyzer in your index. The elasticsearch settings mapping would like this:

//PUT my_index
{
    "settings": {
        "analysis": {
            "filter": {
                "incremental_filter": {
                    "type": "edge_ngram",
                    "min_gram": "1",
                    "max_gram": "100"
                }
            },
            "analyzer": {
                "keywordAnalyzer": {
                "filter": [
                    "lowercase"
                ],
                "type": "custom",
                "tokenizer": "keyword"
            },
            "incrementalAnalyzer": {
                "filter": [
                    "lowercase",
                    "asciifolding",
                    "incremental_filter"
                ],
                "type": "custom",
                "tokenizer": "standard"
                }
            }
        }
    }
}

The representation of this particular example in the elasticsearch configuration:

ongr_elasticsearch:
    analysis:
        analyzer:
            keywordAnalyzer:
                type: custom
                tokenizer: keyword
                filter: [lowercase]
            incrementalAnalyzer:
                type: custom
                tokenizer: standard
                filter:
                    - lowercase
                    - asciifolding
                    - incremental_filter
        filter:
            incremental_filter:
                type: edge_ngram
                min_gram: 1
                max_gram: 100
    managers:
        default:
            index:
                index_name: your_index_name
                hosts:
                    - 127.0.0.1:9200
            mappings:
                - AppBundle

Document class annotations

Lets start with a document class example.

// src/AppBundle/Document/Content.php

namespace AppBundle\Document;

use ONGR\ElasticsearchBundle\Annotation as ES;

/**
 * @ES\Document(type="product")
 */
class Product
{
    /**
     * @ES\Property(type="text", name="title_in_es")
     */
    private $title;

    /**
     * Sets title
     *
     * @param string $title
     */
    public function setTitle($title)
    {
        $this->title = $title;
    }

    /**
     * Returns title
     *
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }
}

It is not mandatory to have private properties, and public will work as well. However, we firmly recommend using private according to OOP best practices.

Document annotation configuration

Properties annotations

For defining type properties, there is a @ES\Property annotation. The only required attribute is type - Elasticsearch field type to specify what kind of information will be indexed. By default, the field name is generated from property name by converting it to "snake case" string. You can specify a custom name by setting the name attribute.

Read more about elasticsearch supported types in the official documentation.

To add a custom setting for the property like analyzer include it in the options variable. Analyzers names must be defined in config.yml under the analysis node (read more in the topic above). Here's an example how to add it:

// src/AppBundle/Document/Product.php
namespace AppBundle\Document;

use ONGR\ElasticsearchBundle\Annotation as ES;

/**
 * @ES\Document()
 */
class Product
{
    // ...

    /**
     * @ES\Property(
        type="text",
        options={"analyzer":"incrementalAnalyzer"}
      )
     */
    private $title;
    
    //....

options container accepts any parameters in annotation array format. We leave mapping validation to elasticsearch and elasticsearch-php client. If there will be invalid format annotations reader will throw exception, otherwise elasticsearch-php or elasticsearch database will throw an exception if something is wrong.

Object and Nested types

To define a nested or object type you have to use @ES\Embedded annotation and create a separate class for this annotation. Here's an example, lets assume we have a Product type with Variant object field.

// src/AppBundle/Document/Product.php

namespace AppBundle\Document;

use ONGR\ElasticsearchBundle\Annotation as ES;

/**
 * @ES\Document()
 */
class Product
{
    /**
     * @ES\Property(type="string")
     */
    private $title;

    /**
     * @var ContentMetaObject
     *
     * @ES\Embedded(class="AppBundle:CategoryObject")
     */
    private $category;

    //...
}

And the Category object will look like:

// src/AppBundle/Document/CategoryObject.php

namespace AppBundle\Document;

use ONGR\ElasticsearchBundle\Annotation as ES;

/**
 * @ES\Object
 */
class CategoryObject
{
    /**
     * @ES\Property(type="string")
     */
    private $title;

    //...
}

Class name can be anything, we called it CategoryObject to make it more readable. Notice that it is an object, not a document.

For this particular example the mapping in elasticsearch will look like this:

 {
    "product": {
        "properties": {
            "title": {
                "type": "text"
            },
            "category": {
                "type": "object",
                "properties": {
                    "title": {
                        "type": "string"
                    }
                }
            }
        }
    }
}
Saving documents with relations

To insert a document with mapping from example above you have to create 2 objects:

 
  $category = new CategoryObject();
  $category->setTitle('Jeans');
  
  $product = new Product();
  $product->setTitle('Orange Jeans');
  $product->setCategoryObject($category);
  
  //manager to work with elasticsearch index
  $manager->persist($product);
  $manager->commit();
 
Multiple objects

As shown in the example above, by ElasticsearchBundle default, only a single object will be saved in the document. Meanwhile, Elasticsearch database doesn't care if in an object is stored as a single value or as an array. If it is necessary to store multiple objects (array), you have to add multiple=true to the annotation. While initiating a document with multiple items you need to initialize property with the new instance of ArrayCollection().

Here's an example:

// src/AppBundle/Document/Product.php

namespace AppBundle\Document;

use Doctrine\Common\Collections\ArrayCollection;
use ONGR\ElasticsearchBundle\Annotation as ES;

/**
 * @ES\Document()
 */
class Product
{
    /**
     * @ES\Property(type="string")
     */
    private $title;

    /**
     * @var ContentMetaObject
     *
     * @ES\Embedded(class="AppBundle:VariantObject", multiple=true)
     */
    private $variants;
    
    public function __construct()
    {
        $this->variants = new ArrayCollection();
    }
    
    /**
     * Adds variant to the collection.
     *
     * @param VariantObject $variant
     * @return $this
     */
    public function addVariant(VariantObject $variant)
    {
        $this->variants[] = $variant;

        return $this;
    }
    
    //...
}

And the object:

// src/AppBundle/Document/VariantObject.php

namespace AppBundle\Document;

use ONGR\ElasticsearchBundle\Annotation as ES;

/**
 * @ES\Object
 */
class VariantObject
{
    /**
     * @ES\Property(type="string")
     */
    private $color;

    //...
}

Insert action will look like this:

<?php
  
  $product = new Product();
  $product->setTitle('Orange Jeans');
  
  $variant = new VariantObject();
  $variant->setColor('orange');
  $product->addVariant($variant);

  $variant = new VariantObject();
  $variant->setColor('red');
  $product->addVariant($variant);

  $manager->persist($product);
  $manager->commit();

There is no bounds to define other objects within objects.

Nested types can be defined the same way as objects, except @ES\Nested annotation must be used.

The difference between @ES\Embedded and @ES\Nested is in the way that the Elasticsearch indexes them. While the values of the fields in embedded objects are extracted and put into the same array with all the other values of other embedded objects in the same field, during the indexation process, the values of the fields of nested objects stored separately. This introduces differences when querying and filtering the index.

Multi field annotations and usage

Within the properties annotation, you can specify the field attribute. It enables you to map several core types of the same value. This can come very handy, e.g. when you want to map a text type with analyzed and not analyzed values.

Lets take a look at example below:

    /**
     * @var string
     * @ES\Property(
     *  type="text",
     *  name="title",
     *  options={
     *    "analyzer"="keywordAnalyzer",
     *    "fields"={
     *        "raw"={"type"="keyword"},
     *        "standard"={"type"="text", "analyzer"="standard"}
     *    }
     *  }
     * )
     */
    public $title;

The mapping in elasticsearch would look like this:

{
    "product": {
        "properties": {
            "title": {
                "type": "text",
                "analyzer": "keywordAnalyzer",
                "fields": {
                    "raw": {
                        "type": "keyword"
                    },
                    "standard": {
                        "type": "text",
                        "analyzer": "standard"
                    }
                }
            }
        }
    }
}

You will notice that now title value is mapped both with and without the analyzer. Querying these fields will look like this:

        $query = new TermQuery('title', 'Bar');
        $search->addQuery($query);

        $result1 = $repo->execute($search);

        $query = new MatchQuery('title.raw', 'Bar');
        $search->addQuery($query);

        $result2 = $repo->execute($search);

        $query = new MatchQuery('title.standard', 'Bar');
        $search->addQuery($query);

        $result3 = $repo->execute($search);

Meta-Fields Annotations

There are specialized meta fields that introduce different behaviours of elasticsearch. Read the dedicated page about meta-field annotations here.

More information about mapping can be found in the Elasticsearch mapping documentation.