+39 050 751 9999 info@seacom.it

Painless è un linguaggio di scripting semplice e sicuro progettato specificamente per l’uso con Elasticsearch. È stato introdotto per la prima volta in Elasticsearch 5.0.

A partire da Elasticsearch 6.0, il supporto per gli altri linguaggi di scripting, come Python o Javascript, è terminato. Quindi, come possiamo sfruttare le potenzialità di Painless oggi? 

Ecco un esempio:

 

Costruiamo un motore di ricerca di giocattoli in occasione delle prossime vacanze. Potremmo fare riferimento a un inventario di giocattoli esistente indicizzato nel seguente modo:

 

PUT toys/doc/_bulk

{“index”: {“_id”: 1}}

{“name”: “plastic reindeer”, “price”: 11.99}

{“index”: {“_id”: 2}}

{“name”: “red plush reindeer”, “price”: 7.99}

{“index”: {“_id”: 3}}

{“name”: “model train”, “price”: 112.99}

{“index”: {“_id”: 4}}

{“name”: “backyard swing-set”, “price”: 329.99}

 

Ora, vogliamo aggiornare tutti i giocattoli per includere i loro sconti vacanza. Possiamo fare questo introducendo un nuovo campo chiamato holiday_price che include un intervallo di date per quando uno sconto è in vigore. Per esempio, questo campo può essere formattato in questo modo:

 

{“start_date”: “2017-12-01T00:00:00Z”, “end_date”: “2017-12-31T00:00:00Z”, “discount”: 0.20}

 

Uso di Painless per gli aggiornamenti

Possiamo utilizzare l’ API Update-By-Query per creare sconti del 20% per i giocattoli sotto i $100 e 15% di sconto per tutti gli altri giocattoli che sono $100 o più:

 

POST toys/doc/_update_by_query

{

  “script”: {

    “lang”: “painless”,

    “source”: “””

      ctx._source.holiday_price = [“start_date”: “2017-12-01T00:00:00Z”, “end_date”: “2017-12-31T00:00:00Z”, “discount”: 0.20];

      if(ctx._source.price >= 100) {

        ctx._source.holiday_price.discount = 0.15;

      }

    “””

  }

}

 

Painless e le query

 

Ora che abbiamo introdotto tariffe speciali per le vacanze, dobbiamo tenerne conto per le operazioni successive. Vogliamo ordinare i nostri risultati in base al loro prezzo. Se un utente cerca giocattoli all’interno della fascia di prezzo delle vacanze, dobbiamo recuperare il prezzo scontato. Questo non è così immediato come utilizzare il campo holiday_price.discount. Abbiamo infatti bisogno di impostare una condizione per sapere se l’attuale Query Time è durante dicembre. Per recuperare il Query Time corretto, lapplicazione deve passarlo come parametro, poiché non c’è modo di recuperare con precisione un tempo corrente costante su tutti i nodi in Elasticsearch.

Vediamo l’esempio:

GET toys/doc/_search

{

  “query”: {

    “term”: { “name”: “reindeer” }

  },

  “sort”: {

    “_script”: {

      “type”: “number”,

      “script”: {

        “lang”: “painless”,

        “source”: “””

          long currentTime = ZonedDateTime.parse(params.current_time).toInstant().toEpochMilli();

          long startDiscountTime = doc[‘holiday_price.start_date’].value.getMillis();

          long endDiscountTime = doc[‘holiday_price.end_date’].value.getMillis();

          if (currentTime >= startDiscountTime && currentTime <= endDiscountTime) {

            return (1.0 – doc[‘holiday_price.discount’].value) * doc[‘price’].value;

          }

          return doc[‘price’].value;

        “””,

        “params” : {

          “current_time”: “2017-12-05T12:32:16Z”

        }

      }

    }

  }

}

 

Ecco fatto, il nostro motore di ricerca per giocattoli è ora pronto per gestire le offerte speciali delle vacanze Natalizie!!

 

Altro su Painless

Anche se non ci siamo addentrati nei dettagli, ci sono altri importanti argomenti relativi a Painless che vale la pena menzionare:

 

  • Uso delle espressioni regex negli script1
  • Debug delle espressioni Painless

 

A presto e Buon Shopping!

 

Aricolo originale a cura di Tal Levy

Contatta Seacom

Vuoi rimanere aggiornato su tutte novità Elastic o richiedere una consulenza a Seacom?
Visita la pagina dedicata, oppure

Contattaci
mautic is open source marketing automation