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