UNE TIMELINE AVEC ELASTICSEARCH

@matthieuauger

Popo

Réseau SOCIAL

D'ENTRAIDE

ENTRES VOISINS

JE NE

COMMUNIQUE

PAS AVEC MES

VOISINS

Je cherche/propose

DES BIENS/SERVICES

A PROXIMITé

JE NE SUIS

PAS INFORMé sur

la vie de mon quartier

Actualité

Evénement

Annonce

Asso

Shop

Communauté

Collectivité

Recommandation

Quartier

notion D'univers

A  l'uTILISATEUR DES INFORMATIONS PERTINENTES ?

APPORTER

COMMENT

UNE TIMELINE

PERSONNELLE

CE PAR QUOI ON EST PASSé

SCRUM

=

ITERATIONS

1° itération

ACTUALITés

DE MA VILLE

ANNONCES QUARTIER

CONTENUS IMMEUBLE

COMMERCES & ASSOS INSCRITS

RECOMMANDATIONS

PUBLICATIONS COMMUNAUTé

PUBLICATIONS COMMUNITY MANAGER

BOX PUBLICITé

DERnièRES NEWS DU BLOG

évéNEMENTS LOCAUX

EXTENSION

Département

PAGE LA PLUS

LENTE

DU SITE

MR4

IS COMING

IL FAUT TENTER AUTRE CHOSE

Elasticsearch ?

REDIS ?

MONGO ?

Mais NOTRE timeline PERSONNELLE pour de vrai c'est quoi ?

DES CONTENUS FILTRés sur des critères

TRIés par date décroissante

fos_elastica:
    indexes:
        timeline:
            types:
                news:
                    mappings:
                        uuid: ~
                        created_at: ~
                        title: ~
                        description: ~
                        author_uuid: ~
                    persistence:
                        driver: orm
                        model: MaResidence\AppBundle\Entity\News
                        provider: ~
                        listener:
                            immediate: ~
                        finder: ~
                event:
                    mappings:
                        uuid: ~
                        created_at: ~
                        title: ~
                        description: ~
                        author_uuid: ~
                        date: ~
                   persistence:
                        driver: orm
                        model: MaResidence\AppBundle\Entity\Event
                        provider: ~
                        listener:
                            immediate: ~
                        finder: ~
persistence:
    driver: orm
    model: MaResidence\AppBundle\Entity\News
    provider: ~
    listener:
        immediate: ~
    finder: ~

MET à jour AUTOMATIQUEMENT l'index elasticsearch

Création

MODIFICATIOn

SUPpression

persistence:
    driver: orm
    model: MaResidence\AppBundle\Entity\News
    provider: ~
    listener:
        immediate: ~
    finder: ~

offre un service de recherche par type et index

$finder = $this->container->get('fos_elastica.finder.search.news');
$results = $finder->find('NEWS 1');
$finder = $this->container->get('fos_elastica.finder.search');
$results = $finder->find('NEWS 1');
app/console fos:elastica:populate

RECONSTRUIT l'index

à partir de la base de données

UN PEU DE TUNING

types:
    news:
        mappings:
            uuid:
                type: string
                index: not_analyzed
            timestamp:
                type: integer
            title:
                type: string
                index: no
            description:
                type: string
                index: no
            author_uuid:
                type: string
                index: not_analyzed

N'indexer que le minimum

DES REQuÊTES COMPLEXES

// Liste des voisins d'une ville ou d'un immeuble
$options = $this->resolver->resolve($options);

$boolFilter = new Bool();
$boolFilter->addMust(new Term(['deleted' => $options['deleted']]));

if ($this->hasOption($options, 'habitation_group')) {
    $boolFilter->addMust(new Term(['habitation' => $options['habitation_group']]));
}

if ($this->hasOption($options, 'cities')) {
    $boolFilter->addMust(new Term(['cities' => (array) $options['cities']]));
}

if ($this->hasOption($options, 'skills')) {
    $boolFilter->addMust(new Term(['skills' => (array) $options['skills']]));
}

$query = new Query(new Query\Filtered(new Query\MatchAll(), $boolFilter));

$query
    ->setSort(['timestamp' => 'desc'])
    ->setSize($options['per_page'])
    ->setFrom($this->getOffset($options['per_page']));

// fos_elastica.index.user.user
$result = $this->type->search($query);

TOUS LES VOISINS à LEVALLOIS

5.92ms

LECTURE

70000 PREMIERS USERS

26min

éCRITURE

PROFILING DE FOS:elastica:populate

createquerybuilder

(LEFT) join

HYDRATATION

SELECT(ALL)

(LEFT) join !

new reflection()

TRANSFORMATION EN DOCUMENT

new reflection()

Hydrator CUSTOM raw sql

createquerybuilder

join

HYDRATATION

SELECT(a, b, c) PAR BATCH

SELECT tables liées par batch

FETCH ARRAY

TRANSFORMATION EN DOCUMENT

70000 PREMIERS USERS

1m30

ECRITURE

ce qu'on a appris

RAPIDité pour 

CODER

APPRENDRE

ON CHERCHE DU FEEDBACK !

bon apéro

Une timeline avec Elasticsearch

By Matthieu Auger

Une timeline avec Elasticsearch

  • 1,664