527 messaggi dal 18 dicembre 2012
Ciao Moreno
Ti spiego un pò perchè voglio salvare i dati nella cache e non rieseguire la query e l'algoritmo di ricerca realizzato.
La prima volta che eseguo la ricerca leggo dal db tutte le camere disponibili e poi eseguo un algoritmo che mi trova la camera con il prezzo più basso (questo non posso farlo direttamente con una query perchè potrebbero esserci delle offerte da applicare). Questi dati vengo visualizzati, 20 strutture per pagina, all'utente che può applicare dei filtri. E' inutile rieseguire la query e l'algoritmo, meglio recuperare i dati dalla cache. Anche perchè l'algoritmo impiega qualche secondo. Nel caso una camera nel frattempo viene prenotata, verrà cmq segnalata all'utente quando andrà nella pagina dettagli.
527 messaggi dal 18 dicembre 2012
Puoi spiegarmi in breve Elasticsearch e come potrebbe essermi utile?
Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
Ok, la soluzione di cui ti parlavo resta invariata. Predisponi un job in background che proattivamente e ad intervalli regolari (o al verificarsi di eventi nel sistema) effettua la query, esegue l'algoritmo ed aggiorna l'indice.
Lato client, interroghi l'indice con la API Rest di ElastiSerach / Azure Search.
https://azure.microsoft.com/it-it/documentation/videos/what-is-azure-search/

Se invece vuoi usare la cache è certamente possibile (basta fare una Where sulla List) ma non puoi avvalerti di tutte le funzionalità di un motore di ricerca vero e proprio, tra cui:
  • Velocità dovuta agli indici
  • Peso dei risultati
  • Tolleranza con parole scritte in maniera non proprio esatta
  • Suggerimenti
  • Categorizzatione (faceting)


Vediamo se riesco a comunicare quanto sono distanti le due soluzioni.
Far arrivare l'utente ai risultati usando la cache (cavo sopra) contro usare uno strumento appropriato come ElasticSearch/Azure search (cavo sotto).
http://www.lifeactionrevival.org/enthusiast/wp-content/uploads/2013/02/kludge44.jpg

ciao,
Moreno

Enjoy learning and just keep making
11.886 messaggi dal 09 febbraio 2002
Contributi

Puoi spiegarmi in breve Elasticsearch e come potrebbe essermi utile?

Sì, allora, nell'attesa che esca la registrazione di Marco, ti dico a grandi linee come funziona.

ElasticSearch è un prodotto specifico per le ricerche e quindi è più idoneo rispetto ad un database relazionale che ha lo scopo generico di conservare dati.
Spesso gli sviluppatori rifiutano l'idea di avere un motore di ricerca specifico perché pensano che la loro applicazione aumenterà in complessità (ed è così), che bisogna imparare ad usare un nuovo prodotto (ed è così) e che i dati verranno in qualche modo "duplicati" (sì e no).

Tuttavia, questi problemi vanno valutati per quel che sono, ovvero semplici obiezioni che vengono presto ridimensionate quando ti accorgi che stai finalmente consentendo ai tuoi utenti di trovare quello che cercano e che consenti a te stesso di implementare funzionalità (tipo i filtri) in maniera molto più semplice di quanto avresti potuto fare con un database relazione.
In sintesi, il "costo" dell'usare un nuovo prodotto si ripaga poi ampiamente e ti rende concorrenziale, almeno per quel che riguarda le funzionalità di ricerca, rispetto ai tuoi competitor.

A livello pratico funziona così:
  • Hai dei dati che vuoi rendere ricercabili. Nel tuo caso sono le camere nel tuo db che hai elaborato attraverso l'algoritmo.
  • ElasticSearch ti permette di creare un indice, ovvero un contenitore di documenti JSON. Ogni documento è una delle tue camere.

    Quando definisci l'indice, puoi indicare che peso ha ciascun campo che vuoi rendere ricercabile. Magari vuoi rendere più importanti le camere che hanno recensioni migliori.
    Le stringhe, come il titolo e il testo, vengono elaborate per essere tolleranti nei confronti di errori di digitazione da parte dell'utente.
    Se usi Azure Search hai degli analyzers evoluti, che sfruttano tutta l'esperienza che Microsoft ha accumulato con il suo motore di ricerca Bing.
  • Dovrai quindi disporre di un job in background che inserisce/elimina/aggiorna le camere in questo indice.
  • Fine. ElasticSearch/Azure Search si interrogano con delle chiamate ajax. Quando effettui una ricerca, oltre ad avere un punteggio di rilevanza per ogni risultato, puoi anche dire di voler estrarre le "facets", ovvero i filtri che stamperai nella colonna a lato. Non devi fare altre query per calcolarteli, ti verranno dati direttamente nella risposta e tu devi solo presentarli in HTML.
  • Se vuoi, con un'altra richiesta ajax puoi far apparire i suggerimenti all'utente mentre digita la sua ricerca.


ciao,
Moreno
Modificato da BrightSoul il 08 luglio 2016 11.53 -

Enjoy learning and just keep making
527 messaggi dal 18 dicembre 2012
Ancora grazie Moreno
Ho trovato un video dell'università delle marche che parla di ElasticSearch, ma non mi è chiaro:
1. come interagire con c#
2. come inserire i risultati della ricerca in ElasticSearch
3. come interrogare ElasticSearch e visualizzare i risultati
In generale non è chiaro come utilizzare ElasticSearch dal codice del portale.

I risultati della ricerca è un List di camere di questo tipo:
string CodiceCamera;
string Indirizzo;
...
List<tipoZona> Zone;

Questi dati si salvano come un'unica stringa json?
Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi

Questi dati si salvano come un'unica stringa json?

No, è più raffinato di così altrimenti ElasticSearch non avrebbe modo di differenziare un campo all'altro.
Tu comunque non hai a che fare con il json direttamente perché usi un client in .NET di alto livello chiamato NEST.
https://github.com/elastic/elasticsearch-net

Comunque bravo perché hai scelto di cimentarti con una cosa che non conosci. Adesso vedo se riesco a prepararti un proof-of-concept in breve tempo. A me serve per fare pratica con il client .NET che non ho mai usato (prima usavo direttamente l'interfaccia REST di ElasticSearch).


un video dell'università delle marche che parla di ElasticSearch,

Ottimo, lo speaker è Gian Maria?
Modificato da BrightSoul il 08 luglio 2016 16.37 -

Enjoy learning and just keep making
11.886 messaggi dal 09 febbraio 2002
Contributi
Ecco qui la demo che ho preparato.
https://github.com/BrightSoul/ElasticSearchAspNetHotelReservations

Trovi la descrizione direttamente nel readme del progetto. In aggiunta, ti elenco i file di codice in cui si trovano le parti "interessanti".
  • In /Model/Entites ci trovi le mie entità demo. Sono banali classi persistite con Entity Framwork (es. Room.cs e Reservation.cs)
  • In /Model/Documents ci sono invece i "documenti", ovvero le controparti delle suddette classi che verranno aggiunte all'indice di ElasticSearch. Noterai che sono annotate con degli attributi speciali che indicano ad ES come va indicizzato ciascun campo. Per esempio ho ripetuto il nome della camera e il nome dell'hotel perché mi servivano che venissero indicizzati in modi diversi. In queste classi è quindi presente anche il codice di mapping che serve a "convertire" le entità che avevi ottenuto dal database.
  • In /Services c'è il DbContext e, più importante, una classe che ho chiamato ElasticSearchIndexManager che si occupa di interfacciarsi con ElasticSearch per mezzo del client NEST. E' quella che uso per creare l'indice ed aggiungerci i documenti.
  • L'indicizzazione dei documenti non avviene a seguito di una richiesta dell'utente, ma in maniera automatica e programmata. Ogni minuto va in esecuzione un job con HangFire che trovi in /Jobs/ElasticSearchIndexingJob.cs.
    Tale job si occupa di estrarre le camere e le prenotazioni dal db, di applicargli l'"algoritmo" e poi invocare l'indicizzazione.


ciao,
Moreno
Modificato da BrightSoul il 10 luglio 2016 15.35 -

Enjoy learning and just keep making
527 messaggi dal 18 dicembre 2012
Grazie Moreno
Sì, è Gian Maria

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.