Maxence POUTORD

RevealJS Tips

Elasticsearch c'est quoi ?

  • Moteur de recherche
  • Basé sur Apache Lucene
  • Open source (Licence Apache2)
  • NoSQL (type Documents)
    Laissez de côté le SQL, foreign key, relation...
  • Interrogeable via Web API (type REST)/JSON
  • Documentation très importante !

Pourquoi c'est mieux qu'un SGBD classique ?

  • Index à créer à la main
  • Degré de pertinence difficile à calculer
  • Plus la base augmente, plus la requête sera longue
  • ...
  • MySQL n'est tout simplement pas un moteur de recherche !


Comparatif MySQL/Elasticsearch

Zéro config !


# Java?
java -version
# Download
curl -L -O https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.5.tar.gz
tar -xvf elasticsearch-1.7.5.tar.gz
cd elasticsearch-1.7.5/bin
# Let's get it started!
./bin/elasticsearch
      

Wording

SGBD Elasticsearch
BaseIndex
TableType
Tuple/EnregistrementDocument
ChampsField
SchemaMapping

Opération: SQL vs. HTTP Verbs

CINSERT INTOPOST/PUT
RSELECTGET /_search
UUPDATEPOST/PUT
DDELETEDELETE

Requêter

URI : Structure générale


http://host:port/[index]/[type]/[_action|id]
      

Exemples:

  • localhost:9200/contenus/article/1
  • localhost:9200/contenus/news/2
  • localhost:9200/contenus/interview/3
  • localhost:9200/users/

Requêtes de base


# Recherche des occurences "elastic" sur tous les types de contenus
GET http://localhost:9200/contenus/_search?q=elastic

# Recherche des articles commençant par "elastic"
GET http://localhost:9200/contenus/article/_search?q=elastic*

# Recherche des occurences correspondantes à peu près à "elstic"
GET http://localhost:9200/contenus/article/_search?q=elstic~

# Recherche sur une propriété
GET http://localhost:9200/contenus/article/_search?q=publie:true

## Combo !
GET http://localhost:9200/contenus/_search?q=elastic&publie:true
GET http://localhost:9200/contenus/article,interview/_search?q=elastic
GET http://localhost:9200/contenus/_search?q=elas~&publie:true&from:10&size:30
    
Documentation

Résultats

  1. Informations sur la requête
  2. Nombre de résultats
  3. Score maximum (score du résultat le plus pertinent)
  4. Informations sur le résultat
  5. Données du résultat
  6. Autres résultats (masqués)

Et si je veux un truc beaucoup plus tordu ?

Requêtes custom

Query Vs. Filter

Query : chaque argument va impacter le score.
Ex : je recherche un article qui a pour titre "bim" et qui a dans son corps "bam"


Filter : va éliminer des résultats.
Ex : l'article doit être publié, la date de création doit-être entre 2014 et 2015.

MUST/SHOULD/MUST NOT

DSL


POST /contenus/_search

{
  "query": {
    "query_string": {
         "default_field": "_all",
         "query": "elastic~"
    }
  },
  "filter": {
    "bool": {
      "must": [{
          "term": {
            "publie": 1
          }
        }, {
          "range": {
            "dateDebutPublication": {
              "lte": "now"
            }
          }
        }, {
          "nested": {
            "path": "auteur",
            "query": {
              "term": {
                "nom": "POUTORD"
              }
            }
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 50,
  "sort": [],
  "aggs": {}
}
      

Et les "jointures" ?

C'est possible !
Mais en général... il y a un problème de mapping !

Elasticsearch dans l'écoosystème PHP/Symfony2

FOSElasticaBundle (1/2)

  • Installation classique (composer require, ajout du bundle dans le kernel)
  • Interfaçage rapide avec doctrine
  • Version maximale supportée 1.x

FOSElasticaBundle (2/2)


fos_elastica:
    clients:
        default: { host: localhost, port: 9200 }
    indexes:
        contenus:
            types:
                article:
                    mappings:
                        titre: ~
                        corps: ~
                        publie: ~
                        slug: ~
                        utilisateur:
                            type: "nested"
                            properties:
                                nom: ~
                                prenom: ~
                    persistence:
                        driver: orm
                        model: LP\ArticleBundle\Entity\Article
                        provider: ~
                        listener: ~
                        finder: ~
      

Et voilà !

Elastica.io

  • Va servir pour faire des recherches
  • Moins buggé que le Finder du FOSElasticaBundle
  • Inclu avec le FOSElasticaBundle

Elastica.io : recherche simple


use Elastica\Request as ElasticaRequest;
//...

$userQuery = "bob";
$client = $this->container->get('fos_elastica.client');
$query = array(
    'query' => array(
        'query_string' => array(
            'query' => $userQuery,
        )
    ),
    'from' => '6',  //optional (default 0)
    'size' => '5'   //optional (default 10)
);

$results = $client->request('/users/_search', ElasticaRequest::GET, $query);
$results->getData();
      

Elastica.io : recherche avancée


$queryString = new \Elastica\Query\QueryString('test*');

$searchQuery = new \Elastica\Query();
$searchQuery->setQuery($queryString);

$publishFilter = new \Elastica\Filter\Term();
$publishFilter->addParam("publie", true);

$boolFilter = new \Elastica\Filter\Bool();
$boolFilter->addMust($publishFilter);
$searchQuery->setPostFilter($boolFilter);

$searchQuery->setFrom(0);
$searchQuery->setSize(50);

$resultSet = $type->search($searchQuery);
      

Elastica.io : Fonctionnement

Méthodologie :

  1. Ecrire sa requête en DSL
  2. L'adapter en PHP

Documentation faiblarde ?
Lisez les tests !

Plugins

Head (1/3)

  • Visualiser les données
  • Requêter

Activer CORS :
config/elasticsearch.yml > http.cors.enabled=true.

Head (2/3)


Head (3/3)


Sense (plugin Chrome)

  • Permet uniquement de requêter
  • Autocomplétion
  • Indique quand le JSON est mal formé

Téléchargement

Conclusion

Avantage :

  • Ultra rapide
  • Facile à mettre en place
  • Un vrai moteur de recherche
  • ...

Inconvénients :

  • Requêtes en JSON
  • Erreurs en JSON

Toujours plus loin !

  • Highlightting
  • Scroll
  • Localisation
  • Fuzzy search (did you mean xxx?)
  • ...

ELK (1/2)

Elasticsearch - Logstash - Kibana


ELK (2/2)


Crédits