SlideShare uma empresa Scribd logo
1 de 78
Aplicando elasticidad a
la búsqueda en Grails
          Enrique Medina Montenegro
                 @emedinam
Índice




1. Acerca del ponente

2. Si buscas, encontrarás

3. Elasticidad en la búsqueda

4. Preguntas y respuestas

5. Contacto




                                2
1. Acerca del ponente


•Ingeniero en Informática (Univ. Alicante -
1991/1996)

•Fundador del               y el

•Socio fundador/desarrollador de
•Colaborador de la comunidad “Open Source”
•Más de 4 años usando Groovy/Grails
•Blogger, liberal, padre, emprendedor, mac-ero


                                                 3
Índice



1. Acerca del ponente

2. Si buscas, encontrarás

3. Elasticidad en la búsqueda

4. Preguntas y respuestas

5. Contacto




                                4
2. Si buscas, encontrarás




             Búsqueda y recuperación de
                    información
“Es la ciencia de la búsqueda de información en documentos electrónicos y cualquier tipo de colección
documental digital, encargada de la búsqueda dentro de éstos mismos, búsqueda de metadatos que
describan documentos, o también la búsqueda en bases de datos relacionales, ya sea a través de
internet, intranet, y como objetivo realiza la recuperación en textos, imágenes, sonido o datos de otras
características, de manera pertinente y relevante.”


                                                                                      Fuente: Wikipedia




                                                                                                           5
2. Si buscas, encontrarás




                          Búsqueda ‘full text’
                         (por texto completo)
“En recuperación de textos/documentos, la búsqueda por texto completo se refiere a las técnicas para la
búsqueda de documentos simples o colecciones de ellos en un almacenamiento computerizado a partir de
unidades gramaticales simples. Se distingue de otras búsquedas porque examina todas y cada una de las
palabras almacenadas en un documento para, posteriormente, examinar si coinciden con un determinado
criterio de búsqueda.”


                                                                                     Fuente: Wikipedia




                                                                                                         6
2. Si buscas, encontrarás
2. Si buscas, encontrarás
2. Si buscas, encontrarás
2. Si buscas, encontrarás

•Empecemos por lo que conocemos, las bases de
 datos (BBDD):
2. Si buscas, encontrarás

•Empecemos por lo que conocemos, las bases de
 datos (BBDD):



                      ‣ Indexación tradicional
                        CREATE INDEX idx_nombre ON cliente (nombre)
2. Si buscas, encontrarás

•Empecemos por lo que conocemos, las bases de
 datos (BBDD):



                      ‣ Indexación tradicional
                        CREATE INDEX idx_nombre ON cliente (nombre)




                      ‣ Indexación de texto completo
                        CREATE FULLTEXT INDEX idx_desc ON producto (descripcion)
2. Si buscas, encontrarás


•Indexación por texto completo:




                                  9
2. Si buscas, encontrarás


•Indexación por texto completo:
                   ‣ Funciones de búsqueda de texto completo
                     MATCH (col1,col2,...) AGAINST (expr [IN NATURAL LANGUAGE MODE | IN NATURAL
                     LANGUAGE MODE WITH QUERY EXPANSION | IN BOOLEAN MODE | WITH QUERY EXPANSION])




                                                                                                     9
2. Si buscas, encontrarás


•Indexación por texto completo:
                   ‣ Funciones de búsqueda de texto completo
                     MATCH (col1,col2,...) AGAINST (expr [IN NATURAL LANGUAGE MODE | IN NATURAL
                     LANGUAGE MODE WITH QUERY EXPANSION | IN BOOLEAN MODE | WITH QUERY EXPANSION])


                     ★ Búsquedas en lenguaje natural
                       MATCH (titulo, cuerpo) AGAINST (‘tutorial’ IN NATURAL LANGUAGE MODE)




                                                                                                     9
2. Si buscas, encontrarás


•Indexación por texto completo:
                   ‣ Funciones de búsqueda de texto completo
                     MATCH (col1,col2,...) AGAINST (expr [IN NATURAL LANGUAGE MODE | IN NATURAL
                     LANGUAGE MODE WITH QUERY EXPANSION | IN BOOLEAN MODE | WITH QUERY EXPANSION])


                     ★ Búsquedas en lenguaje natural
                       MATCH (titulo, cuerpo) AGAINST (‘tutorial’ IN NATURAL LANGUAGE MODE)


                     ★ Búsquedas booleanas de texto completo
                        MATCH (titulo, cuerpo) AGAINST (‘+Grails -Ruby’ IN BOOLEAN MODE)




                                                                                                     9
2. Si buscas, encontrarás


•Indexación por texto completo:
                   ‣ Funciones de búsqueda de texto completo
                     MATCH (col1,col2,...) AGAINST (expr [IN NATURAL LANGUAGE MODE | IN NATURAL
                     LANGUAGE MODE WITH QUERY EXPANSION | IN BOOLEAN MODE | WITH QUERY EXPANSION])


                     ★ Búsquedas en lenguaje natural
                       MATCH (titulo, cuerpo) AGAINST (‘tutorial’ IN NATURAL LANGUAGE MODE)


                     ★ Búsquedas booleanas de texto completo
                        MATCH (titulo, cuerpo) AGAINST (‘+Grails -Ruby’ IN BOOLEAN MODE)


                     ★ Búsquedas con expansión de consulta
                        MATCH (titulo, cuerpo) AGAINST (‘database’)
                        MATCH (titulo, cuerpo) AGAINST (‘database’ WITH QUERY EXPANSION)




                                                                                                     9
2. Si buscas, encontrarás

•Limitaciones a la búsqueda por texto completo:




                                                  10
2. Si buscas, encontrarás

•Limitaciones a la búsqueda por texto completo:
                   ‣ Stopwords (5.1+)
                      a, ante, bajo, cabe, con, contra, de, desde, en, entre, hacia, hasta, ...




                                                                                                  10
2. Si buscas, encontrarás

•Limitaciones a la búsqueda por texto completo:
                   ‣ Stopwords (5.1+)
                      a, ante, bajo, cabe, con, contra, de, desde, en, entre, hacia, hasta, ...


                   ‣ Sólo tipos CHAR, VARCHAR, TEXT




                                                                                                  10
2. Si buscas, encontrarás

•Limitaciones a la búsqueda por texto completo:
                   ‣ Stopwords (5.1+)
                      a, ante, bajo, cabe, con, contra, de, desde, en, entre, hacia, hasta, ...


                   ‣ Sólo tipos CHAR, VARCHAR, TEXT
                   ‣ No existen analizadores que permitan definir:
                     ★ Tokenizadores (división en palabras)

                     ★ Filtros       (mayúsculas/minúsculas,                  conversores
                        ASCII, supresión de etiquetas HTML, etc.)

                     ★ Stemmers (raíz derivativa de una palabra)




                                                                                                  10
2. Si buscas, encontrarás

•Limitaciones a la búsqueda por texto completo:
                   ‣ Stopwords (5.1+)
                      a, ante, bajo, cabe, con, contra, de, desde, en, entre, hacia, hasta, ...


                   ‣ Sólo tipos CHAR, VARCHAR, TEXT
                   ‣ No existen analizadores que permitan definir:
                     ★ Tokenizadores (división en palabras)

                     ★ Filtros       (mayúsculas/minúsculas,                  conversores
                        ASCII, supresión de etiquetas HTML, etc.)

                     ★ Stemmers (raíz derivativa de una palabra)

                   ‣ Consultas complejas (faceted, fuzzy, span, score)




                                                                                                  10
2. Si buscas, encontrarás


•Otras BBDD que soportan texto completo:
2. Si buscas, encontrarás


•Otras BBDD que soportan texto completo:
2. Si buscas, encontrarás


•¿Y si sacamos la búsqueda fuera de la BBDD?:


 Apache Lucene(TM) es una librería que implementa un
 motor de búsqueda de texto completo de alto
 rendimiento y que ha sido escrita enteramente en Java. Se
 trata, pues, de una tecnología apropiada para casi
 cualquier aplicación que requiera de búsquedas de texto
 completo, independientemente de cuál sea su plataforma.
2. Si buscas, encontrarás
2. Si buscas, encontrarás




 ‣   Indexación escalable, de alto rendimiento
      ✓   Hasta 95GB/hora con hardware de última generación

      ✓   Requisitos de RAM mínimos -- tan sólo 1MB (pila)

      ✓   Indexación incremental tan rápida como indexación por lotes

      ✓   Tamaño del índice approx. 20-30% del tamaño real del texto indexado
2. Si buscas, encontrarás


‣ Indexación escalable, de alto rendimiento
    ✓   Hasta 95GB/hora con hardware de última generación

    ✓   Requisitos de RAM mínimos -- tan sólo 1MB (pila)

    ✓   Indexación incremental tan rápida como indexación por lotes

    ✓   Tamaño del índice approx. 20-30% del tamaño real del texto indexado
2. Si buscas, encontrarás


‣ Indexación escalable, de alto rendimiento
     ✓   Hasta 95GB/hora con hardware de última generación

     ✓   Requisitos de RAM mínimos -- tan sólo 1MB (pila)

     ✓   Indexación incremental tan rápida como indexación por lotes

     ✓   Tamaño del índice approx. 20-30% del tamaño real del texto indexado




‣   Algoritmos de búsqueda potentes, precisos y eficientes
     ✓   Búsquedas por puntuación -- los mejores resultados se devuelven los primeros

     ✓   Todo tipo de consultas: por frase, con comodines, por proximidad, por rango, etc.

     ✓   Búsquedas por campos, con ordenación por cualquier campo

     ✓   Búsquedas por múltiple índice combinadas

     ✓   Permite indexación y búsqueda simultánea
2. Si buscas, encontrarás


‣ Indexación escalable, de alto rendimiento
    ✓   Hasta 95GB/hora con hardware de última generación

    ✓   Requisitos de RAM mínimos -- tan sólo 1MB (pila)

    ✓   Indexación incremental tan rápida como indexación por lotes

    ✓   Tamaño del índice approx. 20-30% del tamaño real del texto indexado



               ‣ Algoritmos de búsqueda potentes, precisos y eficientes
                    ✓   Búsquedas por puntuación -- los mejores resultados se devuelven los primeros

                    ✓   Todo tipo de consultas: por frase, con comodines, por proximidad, por rango, etc.

                    ✓   Búsquedas por campos, con ordenación por cualquier campo

                    ✓   Búsquedas por múltiple índice combinadas

                    ✓   Permite indexación y búsqueda simultánea
2. Si buscas, encontrarás


‣ Indexación escalable, de alto rendimiento
     ✓   Hasta 95GB/hora con hardware de última generación

     ✓   Requisitos de RAM mínimos -- tan sólo 1MB (pila)

     ✓   Indexación incremental tan rápida como indexación por lotes

     ✓   Tamaño del índice approx. 20-30% del tamaño real del texto indexado




‣   SoporteAlgoritmos de búsqueda potentes, precisos y eficientes
         ‣ multi-plataforma
                  ✓ Búsquedas por puntuación -- los mejores resultados se devuelven los primeros
      ✓    Disponible como software Open frase, con bajo licencia de Apache
                  ✓ Todo tipo de consultas: por
                                                  Source comodines, por proximidad, por rango, etc.

      ✓           ✓ puro
           100% Java Búsquedas por campos, con ordenación por cualquier campo
                  ✓ Búsquedas por múltiple índice combinadas
      ✓    Implementaciones en otros lenguajes con compatibilidad de índices
                  ✓ Permite indexación y búsqueda simultánea
2. Si buscas, encontrarás


‣ Indexación escalable, de alto rendimiento
    ✓   Hasta 95GB/hora con hardware de última generación

    ✓   Requisitos de RAM mínimos -- tan sólo 1MB (pila)

    ✓   Indexación incremental tan rápida como indexación por lotes

    ✓   Tamaño del índice approx. 20-30% del tamaño real del texto indexado



               ‣ Algoritmos de búsqueda potentes, precisos y eficientes
                    ✓   Búsquedas por puntuación -- los mejores resultados se devuelven los primeros

                    ✓   Todo tipo de consultas: por frase, con comodines, por proximidad, por rango, etc.

                    ✓   Búsquedas por campos, con ordenación por cualquier campo

                    ✓   Búsquedas por múltiple índice combinadas

                    ✓   Permite indexación y búsqueda simultánea




                     ‣ Soporte multi-plataforma
                           ✓ Disponible como software Open Source bajo licencia de Apache
                           ✓ 100% Java puro
                           ✓ Implementaciones en otros lenguajes con compatibilidad de índices
2. Si buscas, encontrarás


‣ Ecosistema de proyectos relacionados:
2. Si buscas, encontrarás


‣ Ecosistema de proyectos relacionados:
                        ✓   Apache Hadoop
                        ✓   Apache Solr
                        ✓   Apache ManifoldCF
                        ✓   Apache Lucene.NET
                        ✓   Apache Lucy
                        ✓   Apache Mahout
                        ✓   Apache Nutch
                        ✓   Apache OpenNLP
                        ✓   Apache Tika
                        ✓   Apache Zookeeper
2. Si buscas, encontrarás

‣ Simplificación en la búsqueda sobre Lucene:
              ✴ API de Lucene complicada - Muy bajo nivel
              ✴ Proporciona un mapeador OR fácil de usar
              ✴ Distintos formatos: Object, XML, JSON, Resource
              ✴ Capa transaccional con integración JTA/XA
              ✴ Utiliza Spring e incorpora TX, MVC y AOP
              ✴ Soporta índices distribuidos: BBDD / Data Grid
2. Si buscas, encontrarás

‣ Simplificación en la búsqueda sobre Lucene:
              ✴ API de Lucene complicada - Muy bajo nivel
              ✴ Proporciona un mapeador OR fácil de usar
              ✴ Distintos formatos: Object, XML, JSON, Resource
              ✴ Capa transaccional con integración JTA/XA
              ✴ Utiliza Spring e incorpora TX, MVC y AOP
              ✴ Soporta índices distribuidos: BBDD / Data Grid
2. Si buscas, encontrarás


   ‣ Pero, ¿cómo mejorar si cabe más Compass?:
                  ✴ Solución mucho más escalable / distribuida
                  ✴ Características de búsqueda simplificadas:
                     ➡ Facets (multifacética): estadísticas, etc.
                     ➡ Difusa / “Como ésta”
                     ➡ Puntuación personalizada/derivada
                     ➡ Filtros: geodistancia, rangos, etc.
                  ✴ JSON sobre HTTP, RESTful, Groovy
2. Si buscas, encontrarás
2. Si buscas, encontrarás




             elasticsearch.
Índice



1. Acerca del ponente

2. Si buscas, encontrarás

3. Elasticidad en la búsqueda

4. Preguntas y respuestas

5. Contacto




                                18
3. Elasticidad en la búsqueda
  ‣ Ya sabes, para Buscar:
    ★ Open Source (Apache 2)
    ★ Motor distribuido, RESTful, sobre Lucene
  ‣ Libre de esquema & Orientado a Documento:
    ★ Modelo NoSQL basado en JSON
  ‣ Búsqueda:
    ★ DSL basado en JSON: queries, facets, highlighting, scripting, percolator,
        geobúsquedas, etc.
     ★ Multi-tenancy: búsqueda por múltiples índices
  ‣ Distribuido:
    ★ Índices --> fragmentos (shards) --> réplicas
    ★ Cluster --> nodos --> 1..n fragmentos
    ★ Balanceo, enrutado, tolerancia a fallos (Gateway), etc.



                                                                                  19
3. Elasticidad en la búsqueda

  ✓ Integración en la aplicación
     ‣ Mediante plugin:
       ★ “As for now, you should only use this plugin for testing purpose since
          you may lack some functionalities in a production environment”

     ‣ Directamente con la API de elasticsearch:
       ★ REST API --> Expuesta mediante HTTP, thrift, memcached
        ★ Java API --> Asíncrona, soporta 100% la REST API
        ★ Groovy API --> Asíncrona, envoltorio limitado sobre la Java API
     ‣ Clientes:
       ★ Node --> Se une al cluster como un nodo más y puede almacenar
          información o no, incluso configurarse como cluster local
        ★ Transport --> No se une al cluster; conexión remota



                                                                             20
3. Elasticidad en la búsqueda




             DEMO
            REST API
                                21
3. Elasticidad en la búsqueda




         DEMO
       ES PLUGIN
                                22
3. Elasticidad en la búsqueda

✓ Integración en la aplicación (...continua)
  ‣ Analizador propio de español




                                               23
3. Elasticidad en la búsqueda

✓ Integración en la aplicación (...continua)
  ‣ Analizador propio de español
                         SpanishAnalyzer.java




                                                23
3. Elasticidad en la búsqueda

✓ Integración en la aplicación (...continua)
  ‣ Analizador propio de español
                SpanishAnalyzer.java




                                               23
3. Elasticidad en la búsqueda

✓ Integración en la aplicación (...continua)
  ‣ Analizador propio de español
                SpanishAnalyzer.java




            elasticsearch/config/elasticsearch.yml




                                                    23
3. Elasticidad en la búsqueda

✓ Integración en la aplicación (...continua)
  ‣ Analizador propio de español
                SpanishAnalyzer.java




                                       elasticsearch/config/elasticsearch.yml




                                                                               23
3. Elasticidad en la búsqueda

✓ Integración en la aplicación (...continua)
  ‣ Creación del índice y mapeo del tipo ‘producto’




                                                      24
3. Elasticidad en la búsqueda

✓ Integración en la aplicación (...continua)
  ‣ Creación del índice y mapeo del tipo ‘producto’

     $ curl -XPUT 'http://localhost:9200/cuestamenos/' -d 
     '
         {
             settings : {
                 index : {
                     number_of_shards : 3,
                     number_of_replicas : 2
                 }
             }
         }
     '




                                                              24
3. Elasticidad en la búsqueda

✓ Integración en la aplicación (...continua)
  ‣ Creación del índice y mapeo del tipo ‘producto’
  $ curl -XPUT 'http://localhost:9200/cuestamenos/producto/mapping' -d 
  '




  '

                                                                           24
3. Elasticidad en la búsqueda

✓ Integración en la aplicación (...continua)
  ‣ Configuración del cliente




                                               25
3. Elasticidad en la búsqueda

✓ Integración en la aplicación (...continua)
  ‣ Configuración del cliente


         grails-app/conf/spring/resources.groovy




                                                   25
3. Elasticidad en la búsqueda

✓ Integración en la aplicación (...continua)
  ‣ Configuración del cliente
    grails-app/conf/spring/resources.groovy




                                               25
3. Elasticidad en la búsqueda

✓ Integración en la aplicación (...continua)
  ‣ Configuración del cliente
                     TransportClientFactoryBean.groovy
    grails-app/conf/spring/resources.groovy




                                                         25
3. Elasticidad en la búsqueda

✓ Integración en la aplicación (...continua)
  ‣ Configuración del cliente
    grails-app/conf/spring/resources.groovy




                                              TransportClientFactoryBean.groovy




                                                                                  25
3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
  ‣ Indexación por lotes (bulk indexing)




                                               26
3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
  ‣ Indexación por lotes (bulk indexing)


       IndexRequestQueue.groovy




                                               26
3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
  ‣ Indexación por lotes (bulk indexing)
                    IndexRequestQueue.groovy




                                               26
3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
  ‣ Indexación por lotes (bulk indexing)




                                               26
3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
  ‣ Indexación por lotes (bulk indexing)




                                               26
3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
  ‣ Búsqueda avanzada




                                               27
3. Elasticidad en la búsqueda
    ✓ Integración en la aplicación (...continua)
{
         ‣ Búsqueda avanzada
    "from" : 0, size: 10,
    "sort" : [ { "_score" : "desc" } ],
    “query” : {
       "filtered" : {
            "query" : {
               "bool" : {
                  "must" : { "field" : { "_all" : "horror" } },
                  "must" : { "field" : { “_all" : "noche" } }
               }
            },
            "filter" : {

              "bool" : {

                 "must" : { "term" : { "categorias1" : "Ocio y cultura" } },

         
       "must" : { "term" : { "tienda" : "Casa del Libro" } }

              }
            }
       }
    },
    "facets" : {
       "categorias2" : {
            "terms" : {
               "field" : "categorias2",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "categorias1" : "Ocio y cultura" }
            }
       },
       "tienda" : {
            "terms" : {
               "field" : "tienda",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "tienda" : "Casa del Libro" }
            }
       }
    }
}




                                                                                27
3. Elasticidad en la búsqueda
✓ Integración en la aplicación (...continua)
                             {
  ‣ Búsqueda avanzada            "from" : 0, size: 10,
                                 "sort" : [ { "_score" : "desc" } ],
                                 “query” : {
                                    "filtered" : {
                                         "query" : {
                                            "bool" : {
                                               "must" : { "field" : { "_all" : "horror" } },
                                               "must" : { "field" : { “_all" : "noche" } }
                                            }
                                         },
                                         "filter" : {
                             
              "bool" : {
                             
                 "must" : { "term" : { "categorias1" : "Ocio y cultura" } },
                             
         
       "must" : { "term" : { "tienda" : "Casa del Libro" } }
                             
              }
                                         }
                                    }
                                 },
                                 "facets" : {
                                    "categorias2" : {
                                         "terms" : {
                                            "field" : "categorias2",
                                            "size" : 10
                                         },
                                         "facet_filter" : {
                                            "term" : { "categorias1" : "Ocio y cultura" }
                                         }
                                    },
                                    "tienda" : {
                                         "terms" : {
                                            "field" : "tienda",
                                            "size" : 10
                                         },
                                         "facet_filter" : {
                                            "term" : { "tienda" : "Casa del Libro" }
                                         }
                                    }
                                 }
                             }

                                                                                                             27
3. Elasticidad en la búsqueda
    ✓ Integración en la aplicación (...continua)
{
         ‣ Búsqueda avanzada
    "from" : 0, size: 10,
    "sort" : [ { "_score" : "desc" } ],
    “query” : {
       "filtered" : {
            "query" : {
               "bool" : {                                                       ElasticSearchUtil.groovy
                  "must" : { "field" : { "_all" : "horror" } },
                  "must" : { "field" : { “_all" : "noche" } }
               }
            },
            "filter" : {

              "bool" : {

                 "must" : { "term" : { "categorias1" : "Ocio y cultura" } },

         
       "must" : { "term" : { "tienda" : "Casa del Libro" } }

              }
            }
       }
    },
    "facets" : {
       "categorias2" : {
            "terms" : {
               "field" : "categorias2",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "categorias1" : "Ocio y cultura" }
            }
       },
       "tienda" : {
            "terms" : {
               "field" : "tienda",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "tienda" : "Casa del Libro" }
            }
       }
    }
}




                                                                                                           27
3. Elasticidad en la búsqueda
    ✓ Integración en la aplicación (...continua)
{
         ‣ Búsqueda avanzada
    "from" : 0, size: 10,
    "sort" : [ { "_score" : "desc" } ],
    “query” : {
       "filtered" : {
            "query" : {
               "bool" : {
                  "must" : { "field" : { "_all" : "horror" } },
                  "must" : { "field" : { “_all" : "noche" } }
               }
            },



            "filter" : {
               "bool" : {                                               ElasticSearchUtil.groovy
                  "must" : { "term" : { "categorias1" : "Ocio y cultura" } },

         
       "must" : { "term" : { "tienda" : "Casa del Libro" } }

              }
            }
       }
    },
    "facets" : {
       "categorias2" : {
            "terms" : {
               "field" : "categorias2",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "categorias1" : "Ocio y cultura" }
            }
       },
       "tienda" : {
            "terms" : {
               "field" : "tienda",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "tienda" : "Casa del Libro" }
            }
       }
    }
}




                                                                                                   27
3. Elasticidad en la búsqueda
    ✓ Integración en la aplicación (...continua)
{
         ‣ Búsqueda avanzada
    "from" : 0, size: 10,
    "sort" : [ { "_score" : "desc" } ],
    “query” : {
       "filtered" : {
            "query" : {
               "bool" : {                                                       ElasticSearchUtil.groovy
                  "must" : { "field" : { "_all" : "horror" } },
                  "must" : { "field" : { “_all" : "noche" } }
               }
            },
            "filter" : {

              "bool" : {

                 "must" : { "term" : { "categorias1" : "Ocio y cultura" } },

         
       "must" : { "term" : { "tienda" : "Casa del Libro" } }

              }
            }
       }
    },
    "facets" : {
       "categorias2" : {
            "terms" : {
               "field" : "categorias2",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "categorias1" : "Ocio y cultura" }
            }
       },
       "tienda" : {
            "terms" : {
               "field" : "tienda",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "tienda" : "Casa del Libro" }
            }
       }
    }
}




                                                                                                           27
3. Elasticidad en la búsqueda
    ✓ Integración en la aplicación (...continua)
{
         ‣ Búsqueda avanzada
    "from" : 0, size: 10,
    "sort" : [ { "_score" : "desc" } ],
    “query” : {
       "filtered" : {
            "query" : {
               "bool" : {                                                       ElasticSearchUtil.groovy
                  "must" : { "field" : { "_all" : "horror" } },
                  "must" : { "field" : { “_all" : "noche" } }
               }
            },
            "filter" : {

              "bool" : {

                 "must" : { "term" : { "categorias1" : "Ocio y cultura" } },

         
       "must" : { "term" : { "tienda" : "Casa del Libro" } }

              }
            }
       }
    },
    "facets" : {
       "categorias2" : {
            "terms" : {
               "field" : "categorias2",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "categorias1" : "Ocio y cultura" }
            }
       },
       "tienda" : {
            "terms" : {
               "field" : "tienda",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "tienda" : "Casa del Libro" }
            }
       }
    }
}




                                                                                                           27
3. Elasticidad en la búsqueda
    ✓ Integración en la aplicación (...continua)
{
         ‣ Búsqueda avanzada
    "from" : 0, size: 10,
    "sort" : [ { "_score" : "desc" } ],
    “query” : {
       "filtered" : {
            "query" : {
               "bool" : {                                                       ElasticSearchUtil.groovy
                  "must" : { "field" : { "_all" : "horror" } },
                  "must" : { "field" : { “_all" : "noche" } }
               }
            },
            "filter" : {

              "bool" : {

                 "must" : { "term" : { "categorias1" : "Ocio y cultura" } },

         
       "must" : { "term" : { "tienda" : "Casa del Libro" } }

              }
            }
       }
    },
    "facets" : {
       "categorias2" : {
            "terms" : {
               "field" : "categorias2",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "categorias1" : "Ocio y cultura" }
            }
       },
       "tienda" : {
            "terms" : {
               "field" : "tienda",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "tienda" : "Casa del Libro" }
            }
       }
    }
}




                                                                                                           27
3. Elasticidad en la búsqueda
    ✓ Integración en la aplicación (...continua)
{
         ‣ Búsqueda avanzada
    "from" : 0, size: 10,
    "sort" : [ { "_score" : "desc" } ],
    “query” : {
       "filtered" : {
            "query" : {
               "bool" : {                                                       ElasticSearchUtil.groovy
                  "must" : { "field" : { "_all" : "horror" } },
                  "must" : { "field" : { “_all" : "noche" } }
               }
            },
            "filter" : {

              "bool" : {

                 "must" : { "term" : { "categorias1" : "Ocio y cultura" } },

         
       "must" : { "term" : { "tienda" : "Casa del Libro" } }

              }
            }
       }
    },
    "facets" : {
       "categorias2" : {
            "terms" : {
               "field" : "categorias2",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "categorias1" : "Ocio y cultura" }
            }
       },
       "tienda" : {
            "terms" : {
               "field" : "tienda",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "tienda" : "Casa del Libro" }
            }
       }
    }
}




                                                                                                           27
3. Elasticidad en la búsqueda
    ✓ Integración en la aplicación (...continua)
{
         ‣ Búsqueda avanzada
    "from" : 0, size: 10,
    "sort" : [ { "_score" : "desc" } ],
    “query” : {
       "filtered" : {
            "query" : {
               "bool" : {                                                       ElasticSearchUtil.groovy
                  "must" : { "field" : { "_all" : "horror" } },
                  "must" : { "field" : { “_all" : "noche" } }
               }
            },
            "filter" : {

              "bool" : {

                 "must" : { "term" : { "categorias1" : "Ocio y cultura" } },

         
       "must" : { "term" : { "tienda" : "Casa del Libro" } }

              }
            }
       }
    },
    "facets" : {
       "categorias2" : {
            "terms" : {
               "field" : "categorias2",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "categorias1" : "Ocio y cultura" }
            }
       },
       "tienda" : {
            "terms" : {
               "field" : "tienda",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "tienda" : "Casa del Libro" }
            }
       }
    }
}




                                                                                                           27
3. Elasticidad en la búsqueda
    ✓ Integración en la aplicación (...continua)
{
         ‣ Búsqueda avanzada
    "from" : 0, size: 10,
    "sort" : [ { "_score" : "desc" } ],                                         ElasticSearchUtil.groovy
    “query” : {
       "filtered" : {
            "query" : {
               "bool" : {
                  "must" : { "field" : { "_all" : "horror" } },
                  "must" : { "field" : { “_all" : "noche" } }
               }
            },
            "filter" : {

              "bool" : {

                 "must" : { "term" : { "categorias1" : "Ocio y cultura" } },

         
       "must" : { "term" : { "tienda" : "Casa del Libro" } }

              }
            }
       }
    },
    "facets" : {
       "categorias2" : {
            "terms" : {
               "field" : "categorias2",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "categorias1" : "Ocio y cultura" }
            }
       },
       "tienda" : {
            "terms" : {
               "field" : "tienda",
               "size" : 10
            },
            "facet_filter" : {
               "term" : { "tienda" : "Casa del Libro" }
            }
       }
    }
}




                                                                                                           27
3. Elasticidad en la búsqueda

✓ En resumen...
  ‣ Añadir búsqueda de texto completo a tu aplicación es un juego de
     niños con ElasticSearch

  ‣ Configuración sin dolores de cabeza (para comenzar a trabajar)

  ‣ Funcionalidad compleja a tu alcance (facets, highlighting, percolator,
     etc.) con JSON simple sobre HTTP

  ‣ ES no es un repositorio NoSQL, aunque se parece (orientado a
     documentos sin esquema predeterminado)

  ‣ Distribuido, disponible, escalable, tiempo real, para la nube




                                                                             28
Índice



1. Acerca del ponente

2. Si buscas, encontrarás

3. Elasticidad en la búsqueda

4. Preguntas y respuestas

5. Contacto




                                29
4. P & R




   PREGUNTAS
           &
   RESPUESTAS
                30
Índice



1. Acerca del ponente

2. Si buscas, encontrarás

3. Elasticidad en la búsqueda

4. Preguntas y respuestas

5. Contacto




                                31
5. Contacto

       E-mail: e.medina.m@gmail.com

       Twitter: @emedinam
                @observadegrails
                @cuestamenos

          http://observatoriodegrails.com

              http://forodegrails.com

              http://cuestamenos.com




        GRACIAS POR VUESTRA ATENCIÓN
                                            32

Mais conteúdo relacionado

Destaque

MIAP India
MIAP IndiaMIAP India
MIAP Indiaklmeeks
 
Gobierno Central Exento de ley Impuesto de operaciones Financieras
Gobierno Central Exento de ley Impuesto de operaciones FinancierasGobierno Central Exento de ley Impuesto de operaciones Financieras
Gobierno Central Exento de ley Impuesto de operaciones FinancierasElContadorPublico.com
 
Aprende fotografia digital (1)
Aprende fotografia digital (1)Aprende fotografia digital (1)
Aprende fotografia digital (1)Alfredo Molina
 
2009 Ser Inn Mosti 3 Fire
2009 Ser Inn Mosti 3 Fire2009 Ser Inn Mosti 3 Fire
2009 Ser Inn Mosti 3 FireIan Miles
 
Claves para estudiar y trabajar en el extranjero
Claves para estudiar y trabajar en el extranjeroClaves para estudiar y trabajar en el extranjero
Claves para estudiar y trabajar en el extranjeroMundo Spanish
 
Navegadores de web trabajo grupal fabian marco ebert
Navegadores  de web trabajo grupal fabian marco ebertNavegadores  de web trabajo grupal fabian marco ebert
Navegadores de web trabajo grupal fabian marco eberttony9594
 
Curso de manipulador de alimentos
Curso de manipulador de alimentosCurso de manipulador de alimentos
Curso de manipulador de alimentossolidaridadafricana
 
Risk management-insurance-and-the-climate-crisis
Risk management-insurance-and-the-climate-crisisRisk management-insurance-and-the-climate-crisis
Risk management-insurance-and-the-climate-crisisPaul Mahony
 
Crucero Brisas del Mediterráneo
Crucero Brisas del MediterráneoCrucero Brisas del Mediterráneo
Crucero Brisas del MediterráneoEventspmfactory
 
Estrategias de seguimiento y acompañamiento del Tutor Virtual
Estrategias de seguimiento y acompañamiento del Tutor VirtualEstrategias de seguimiento y acompañamiento del Tutor Virtual
Estrategias de seguimiento y acompañamiento del Tutor Virtualolguin01
 
Cloud working: lavorare ovunque - Luca Cipriani
Cloud working: lavorare ovunque - Luca CiprianiCloud working: lavorare ovunque - Luca Cipriani
Cloud working: lavorare ovunque - Luca CiprianiToolbox Coworking
 
Manganese Based Products, Properties, and Uses
Manganese Based Products, Properties, and UsesManganese Based Products, Properties, and Uses
Manganese Based Products, Properties, and UsesCarus Corporation
 
Risk Management for Global Standardization ISO 31000-2009
Risk Management for Global Standardization ISO 31000-2009Risk Management for Global Standardization ISO 31000-2009
Risk Management for Global Standardization ISO 31000-2009Setiono Winardi
 
Introduccion al-analisis-matematico-calculo2-hebe-t-rabuffetti
Introduccion al-analisis-matematico-calculo2-hebe-t-rabuffettiIntroduccion al-analisis-matematico-calculo2-hebe-t-rabuffetti
Introduccion al-analisis-matematico-calculo2-hebe-t-rabuffettiParalafakyou Mens
 
Living in the World of Warcraft: Construction of Virtual Identities Among Onl...
Living in the World of Warcraft: Construction of Virtual Identities Among Onl...Living in the World of Warcraft: Construction of Virtual Identities Among Onl...
Living in the World of Warcraft: Construction of Virtual Identities Among Onl...Virginia Bautista
 
Refrencia 3 - Andrea Bergfelt- LAS ACTITUDES EN EL APRENDIZAJE DE UNA SEGUNDA...
Refrencia 3 - Andrea Bergfelt- LAS ACTITUDES EN EL APRENDIZAJE DE UNA SEGUNDA...Refrencia 3 - Andrea Bergfelt- LAS ACTITUDES EN EL APRENDIZAJE DE UNA SEGUNDA...
Refrencia 3 - Andrea Bergfelt- LAS ACTITUDES EN EL APRENDIZAJE DE UNA SEGUNDA...Diana Catherine Castro Jiménez
 

Destaque (18)

MIAP India
MIAP IndiaMIAP India
MIAP India
 
Gobierno Central Exento de ley Impuesto de operaciones Financieras
Gobierno Central Exento de ley Impuesto de operaciones FinancierasGobierno Central Exento de ley Impuesto de operaciones Financieras
Gobierno Central Exento de ley Impuesto de operaciones Financieras
 
Aprende fotografia digital (1)
Aprende fotografia digital (1)Aprende fotografia digital (1)
Aprende fotografia digital (1)
 
2009 Ser Inn Mosti 3 Fire
2009 Ser Inn Mosti 3 Fire2009 Ser Inn Mosti 3 Fire
2009 Ser Inn Mosti 3 Fire
 
Claves para estudiar y trabajar en el extranjero
Claves para estudiar y trabajar en el extranjeroClaves para estudiar y trabajar en el extranjero
Claves para estudiar y trabajar en el extranjero
 
Navegadores de web trabajo grupal fabian marco ebert
Navegadores  de web trabajo grupal fabian marco ebertNavegadores  de web trabajo grupal fabian marco ebert
Navegadores de web trabajo grupal fabian marco ebert
 
Curso de manipulador de alimentos
Curso de manipulador de alimentosCurso de manipulador de alimentos
Curso de manipulador de alimentos
 
Risk management-insurance-and-the-climate-crisis
Risk management-insurance-and-the-climate-crisisRisk management-insurance-and-the-climate-crisis
Risk management-insurance-and-the-climate-crisis
 
Crucero Brisas del Mediterráneo
Crucero Brisas del MediterráneoCrucero Brisas del Mediterráneo
Crucero Brisas del Mediterráneo
 
Copyshop Solutions
Copyshop SolutionsCopyshop Solutions
Copyshop Solutions
 
Estrategias de seguimiento y acompañamiento del Tutor Virtual
Estrategias de seguimiento y acompañamiento del Tutor VirtualEstrategias de seguimiento y acompañamiento del Tutor Virtual
Estrategias de seguimiento y acompañamiento del Tutor Virtual
 
Cloud working: lavorare ovunque - Luca Cipriani
Cloud working: lavorare ovunque - Luca CiprianiCloud working: lavorare ovunque - Luca Cipriani
Cloud working: lavorare ovunque - Luca Cipriani
 
Manganese Based Products, Properties, and Uses
Manganese Based Products, Properties, and UsesManganese Based Products, Properties, and Uses
Manganese Based Products, Properties, and Uses
 
Risk Management for Global Standardization ISO 31000-2009
Risk Management for Global Standardization ISO 31000-2009Risk Management for Global Standardization ISO 31000-2009
Risk Management for Global Standardization ISO 31000-2009
 
Introduccion al-analisis-matematico-calculo2-hebe-t-rabuffetti
Introduccion al-analisis-matematico-calculo2-hebe-t-rabuffettiIntroduccion al-analisis-matematico-calculo2-hebe-t-rabuffetti
Introduccion al-analisis-matematico-calculo2-hebe-t-rabuffetti
 
Living in the World of Warcraft: Construction of Virtual Identities Among Onl...
Living in the World of Warcraft: Construction of Virtual Identities Among Onl...Living in the World of Warcraft: Construction of Virtual Identities Among Onl...
Living in the World of Warcraft: Construction of Virtual Identities Among Onl...
 
Monitorización
MonitorizaciónMonitorización
Monitorización
 
Refrencia 3 - Andrea Bergfelt- LAS ACTITUDES EN EL APRENDIZAJE DE UNA SEGUNDA...
Refrencia 3 - Andrea Bergfelt- LAS ACTITUDES EN EL APRENDIZAJE DE UNA SEGUNDA...Refrencia 3 - Andrea Bergfelt- LAS ACTITUDES EN EL APRENDIZAJE DE UNA SEGUNDA...
Refrencia 3 - Andrea Bergfelt- LAS ACTITUDES EN EL APRENDIZAJE DE UNA SEGUNDA...
 

Semelhante a Aplicando elasticidad en la búsqueda con Grails

1.busquedad de informacion en internet
1.busquedad  de informacion en internet1.busquedad  de informacion en internet
1.busquedad de informacion en internetCeleste9829
 
Búsqueda de informacón en GOOGLE
Búsqueda de informacón en GOOGLEBúsqueda de informacón en GOOGLE
Búsqueda de informacón en GOOGLEMaajo Saalazar
 
Metodos de busqueda y operadores boleanos
Metodos de busqueda y operadores boleanosMetodos de busqueda y operadores boleanos
Metodos de busqueda y operadores boleanosIvonne RoJas Diaz
 
Metodos de busqueda y operadores boleanos
Metodos de busqueda y operadores boleanosMetodos de busqueda y operadores boleanos
Metodos de busqueda y operadores boleanosIvonne RoJas Diaz
 
MÓDULO 1: BÚSQUEDA DE INFORMACIÓN EN GOOLE
MÓDULO 1: BÚSQUEDA DE INFORMACIÓN EN GOOLEMÓDULO 1: BÚSQUEDA DE INFORMACIÓN EN GOOLE
MÓDULO 1: BÚSQUEDA DE INFORMACIÓN EN GOOLEEduardo Salazar
 
Búsqueda de información en internet actividad 1
Búsqueda de información en internet actividad 1Búsqueda de información en internet actividad 1
Búsqueda de información en internet actividad 1estefania guizado
 
Búsqueda avanzada y descarga de archivos
Búsqueda avanzada y descarga de archivosBúsqueda avanzada y descarga de archivos
Búsqueda avanzada y descarga de archivosRobert Cadillo
 
Introducción a los motores de búsqueda
Introducción a los motores de búsquedaIntroducción a los motores de búsqueda
Introducción a los motores de búsquedanachopg
 
Introducción a los motores de búsqueda
Introducción a los motores de búsquedaIntroducción a los motores de búsqueda
Introducción a los motores de búsquedanachopg
 
Búsqueda y gestión de la información miriadax
Búsqueda y gestión de la información miriadaxBúsqueda y gestión de la información miriadax
Búsqueda y gestión de la información miriadaxPAUL SALAS B.
 
Sesion 2 diplomado seo politecnico
Sesion 2   diplomado seo politecnicoSesion 2   diplomado seo politecnico
Sesion 2 diplomado seo politecnicoLuis Morillo
 
Busquedas en internet
Busquedas en internetBusquedas en internet
Busquedas en internetlisethlopez24
 

Semelhante a Aplicando elasticidad en la búsqueda con Grails (15)

Catálogo en línea, revisado
Catálogo en línea, revisadoCatálogo en línea, revisado
Catálogo en línea, revisado
 
1.busquedad de informacion en internet
1.busquedad  de informacion en internet1.busquedad  de informacion en internet
1.busquedad de informacion en internet
 
Búsqueda de informacón en GOOGLE
Búsqueda de informacón en GOOGLEBúsqueda de informacón en GOOGLE
Búsqueda de informacón en GOOGLE
 
Activida 1
Activida 1Activida 1
Activida 1
 
Metodos de busqueda y operadores boleanos
Metodos de busqueda y operadores boleanosMetodos de busqueda y operadores boleanos
Metodos de busqueda y operadores boleanos
 
Metodos de busqueda y operadores boleanos
Metodos de busqueda y operadores boleanosMetodos de busqueda y operadores boleanos
Metodos de busqueda y operadores boleanos
 
Sphinx y su integracion con PHP
Sphinx y su integracion con PHPSphinx y su integracion con PHP
Sphinx y su integracion con PHP
 
MÓDULO 1: BÚSQUEDA DE INFORMACIÓN EN GOOLE
MÓDULO 1: BÚSQUEDA DE INFORMACIÓN EN GOOLEMÓDULO 1: BÚSQUEDA DE INFORMACIÓN EN GOOLE
MÓDULO 1: BÚSQUEDA DE INFORMACIÓN EN GOOLE
 
Búsqueda de información en internet actividad 1
Búsqueda de información en internet actividad 1Búsqueda de información en internet actividad 1
Búsqueda de información en internet actividad 1
 
Búsqueda avanzada y descarga de archivos
Búsqueda avanzada y descarga de archivosBúsqueda avanzada y descarga de archivos
Búsqueda avanzada y descarga de archivos
 
Introducción a los motores de búsqueda
Introducción a los motores de búsquedaIntroducción a los motores de búsqueda
Introducción a los motores de búsqueda
 
Introducción a los motores de búsqueda
Introducción a los motores de búsquedaIntroducción a los motores de búsqueda
Introducción a los motores de búsqueda
 
Búsqueda y gestión de la información miriadax
Búsqueda y gestión de la información miriadaxBúsqueda y gestión de la información miriadax
Búsqueda y gestión de la información miriadax
 
Sesion 2 diplomado seo politecnico
Sesion 2   diplomado seo politecnicoSesion 2   diplomado seo politecnico
Sesion 2 diplomado seo politecnico
 
Busquedas en internet
Busquedas en internetBusquedas en internet
Busquedas en internet
 

Último

Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfvladimiroflores1
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.FlorenciaCattelani
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxMiguelAtencio10
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...JohnRamos830530
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxJorgeParada26
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfAnnimoUno1
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxAlan779941
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21mariacbr99
 

Último (11)

Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 

Aplicando elasticidad en la búsqueda con Grails

  • 1. Aplicando elasticidad a la búsqueda en Grails Enrique Medina Montenegro @emedinam
  • 2. Índice 1. Acerca del ponente 2. Si buscas, encontrarás 3. Elasticidad en la búsqueda 4. Preguntas y respuestas 5. Contacto 2
  • 3. 1. Acerca del ponente •Ingeniero en Informática (Univ. Alicante - 1991/1996) •Fundador del y el •Socio fundador/desarrollador de •Colaborador de la comunidad “Open Source” •Más de 4 años usando Groovy/Grails •Blogger, liberal, padre, emprendedor, mac-ero 3
  • 4. Índice 1. Acerca del ponente 2. Si buscas, encontrarás 3. Elasticidad en la búsqueda 4. Preguntas y respuestas 5. Contacto 4
  • 5. 2. Si buscas, encontrarás Búsqueda y recuperación de información “Es la ciencia de la búsqueda de información en documentos electrónicos y cualquier tipo de colección documental digital, encargada de la búsqueda dentro de éstos mismos, búsqueda de metadatos que describan documentos, o también la búsqueda en bases de datos relacionales, ya sea a través de internet, intranet, y como objetivo realiza la recuperación en textos, imágenes, sonido o datos de otras características, de manera pertinente y relevante.” Fuente: Wikipedia 5
  • 6. 2. Si buscas, encontrarás Búsqueda ‘full text’ (por texto completo) “En recuperación de textos/documentos, la búsqueda por texto completo se refiere a las técnicas para la búsqueda de documentos simples o colecciones de ellos en un almacenamiento computerizado a partir de unidades gramaticales simples. Se distingue de otras búsquedas porque examina todas y cada una de las palabras almacenadas en un documento para, posteriormente, examinar si coinciden con un determinado criterio de búsqueda.” Fuente: Wikipedia 6
  • 7. 2. Si buscas, encontrarás
  • 8. 2. Si buscas, encontrarás
  • 9. 2. Si buscas, encontrarás
  • 10. 2. Si buscas, encontrarás •Empecemos por lo que conocemos, las bases de datos (BBDD):
  • 11. 2. Si buscas, encontrarás •Empecemos por lo que conocemos, las bases de datos (BBDD): ‣ Indexación tradicional CREATE INDEX idx_nombre ON cliente (nombre)
  • 12. 2. Si buscas, encontrarás •Empecemos por lo que conocemos, las bases de datos (BBDD): ‣ Indexación tradicional CREATE INDEX idx_nombre ON cliente (nombre) ‣ Indexación de texto completo CREATE FULLTEXT INDEX idx_desc ON producto (descripcion)
  • 13. 2. Si buscas, encontrarás •Indexación por texto completo: 9
  • 14. 2. Si buscas, encontrarás •Indexación por texto completo: ‣ Funciones de búsqueda de texto completo MATCH (col1,col2,...) AGAINST (expr [IN NATURAL LANGUAGE MODE | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION | IN BOOLEAN MODE | WITH QUERY EXPANSION]) 9
  • 15. 2. Si buscas, encontrarás •Indexación por texto completo: ‣ Funciones de búsqueda de texto completo MATCH (col1,col2,...) AGAINST (expr [IN NATURAL LANGUAGE MODE | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION | IN BOOLEAN MODE | WITH QUERY EXPANSION]) ★ Búsquedas en lenguaje natural MATCH (titulo, cuerpo) AGAINST (‘tutorial’ IN NATURAL LANGUAGE MODE) 9
  • 16. 2. Si buscas, encontrarás •Indexación por texto completo: ‣ Funciones de búsqueda de texto completo MATCH (col1,col2,...) AGAINST (expr [IN NATURAL LANGUAGE MODE | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION | IN BOOLEAN MODE | WITH QUERY EXPANSION]) ★ Búsquedas en lenguaje natural MATCH (titulo, cuerpo) AGAINST (‘tutorial’ IN NATURAL LANGUAGE MODE) ★ Búsquedas booleanas de texto completo MATCH (titulo, cuerpo) AGAINST (‘+Grails -Ruby’ IN BOOLEAN MODE) 9
  • 17. 2. Si buscas, encontrarás •Indexación por texto completo: ‣ Funciones de búsqueda de texto completo MATCH (col1,col2,...) AGAINST (expr [IN NATURAL LANGUAGE MODE | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION | IN BOOLEAN MODE | WITH QUERY EXPANSION]) ★ Búsquedas en lenguaje natural MATCH (titulo, cuerpo) AGAINST (‘tutorial’ IN NATURAL LANGUAGE MODE) ★ Búsquedas booleanas de texto completo MATCH (titulo, cuerpo) AGAINST (‘+Grails -Ruby’ IN BOOLEAN MODE) ★ Búsquedas con expansión de consulta MATCH (titulo, cuerpo) AGAINST (‘database’) MATCH (titulo, cuerpo) AGAINST (‘database’ WITH QUERY EXPANSION) 9
  • 18. 2. Si buscas, encontrarás •Limitaciones a la búsqueda por texto completo: 10
  • 19. 2. Si buscas, encontrarás •Limitaciones a la búsqueda por texto completo: ‣ Stopwords (5.1+) a, ante, bajo, cabe, con, contra, de, desde, en, entre, hacia, hasta, ... 10
  • 20. 2. Si buscas, encontrarás •Limitaciones a la búsqueda por texto completo: ‣ Stopwords (5.1+) a, ante, bajo, cabe, con, contra, de, desde, en, entre, hacia, hasta, ... ‣ Sólo tipos CHAR, VARCHAR, TEXT 10
  • 21. 2. Si buscas, encontrarás •Limitaciones a la búsqueda por texto completo: ‣ Stopwords (5.1+) a, ante, bajo, cabe, con, contra, de, desde, en, entre, hacia, hasta, ... ‣ Sólo tipos CHAR, VARCHAR, TEXT ‣ No existen analizadores que permitan definir: ★ Tokenizadores (división en palabras) ★ Filtros (mayúsculas/minúsculas, conversores ASCII, supresión de etiquetas HTML, etc.) ★ Stemmers (raíz derivativa de una palabra) 10
  • 22. 2. Si buscas, encontrarás •Limitaciones a la búsqueda por texto completo: ‣ Stopwords (5.1+) a, ante, bajo, cabe, con, contra, de, desde, en, entre, hacia, hasta, ... ‣ Sólo tipos CHAR, VARCHAR, TEXT ‣ No existen analizadores que permitan definir: ★ Tokenizadores (división en palabras) ★ Filtros (mayúsculas/minúsculas, conversores ASCII, supresión de etiquetas HTML, etc.) ★ Stemmers (raíz derivativa de una palabra) ‣ Consultas complejas (faceted, fuzzy, span, score) 10
  • 23. 2. Si buscas, encontrarás •Otras BBDD que soportan texto completo:
  • 24. 2. Si buscas, encontrarás •Otras BBDD que soportan texto completo:
  • 25. 2. Si buscas, encontrarás •¿Y si sacamos la búsqueda fuera de la BBDD?: Apache Lucene(TM) es una librería que implementa un motor de búsqueda de texto completo de alto rendimiento y que ha sido escrita enteramente en Java. Se trata, pues, de una tecnología apropiada para casi cualquier aplicación que requiera de búsquedas de texto completo, independientemente de cuál sea su plataforma.
  • 26. 2. Si buscas, encontrarás
  • 27. 2. Si buscas, encontrarás ‣ Indexación escalable, de alto rendimiento ✓ Hasta 95GB/hora con hardware de última generación ✓ Requisitos de RAM mínimos -- tan sólo 1MB (pila) ✓ Indexación incremental tan rápida como indexación por lotes ✓ Tamaño del índice approx. 20-30% del tamaño real del texto indexado
  • 28. 2. Si buscas, encontrarás ‣ Indexación escalable, de alto rendimiento ✓ Hasta 95GB/hora con hardware de última generación ✓ Requisitos de RAM mínimos -- tan sólo 1MB (pila) ✓ Indexación incremental tan rápida como indexación por lotes ✓ Tamaño del índice approx. 20-30% del tamaño real del texto indexado
  • 29. 2. Si buscas, encontrarás ‣ Indexación escalable, de alto rendimiento ✓ Hasta 95GB/hora con hardware de última generación ✓ Requisitos de RAM mínimos -- tan sólo 1MB (pila) ✓ Indexación incremental tan rápida como indexación por lotes ✓ Tamaño del índice approx. 20-30% del tamaño real del texto indexado ‣ Algoritmos de búsqueda potentes, precisos y eficientes ✓ Búsquedas por puntuación -- los mejores resultados se devuelven los primeros ✓ Todo tipo de consultas: por frase, con comodines, por proximidad, por rango, etc. ✓ Búsquedas por campos, con ordenación por cualquier campo ✓ Búsquedas por múltiple índice combinadas ✓ Permite indexación y búsqueda simultánea
  • 30. 2. Si buscas, encontrarás ‣ Indexación escalable, de alto rendimiento ✓ Hasta 95GB/hora con hardware de última generación ✓ Requisitos de RAM mínimos -- tan sólo 1MB (pila) ✓ Indexación incremental tan rápida como indexación por lotes ✓ Tamaño del índice approx. 20-30% del tamaño real del texto indexado ‣ Algoritmos de búsqueda potentes, precisos y eficientes ✓ Búsquedas por puntuación -- los mejores resultados se devuelven los primeros ✓ Todo tipo de consultas: por frase, con comodines, por proximidad, por rango, etc. ✓ Búsquedas por campos, con ordenación por cualquier campo ✓ Búsquedas por múltiple índice combinadas ✓ Permite indexación y búsqueda simultánea
  • 31. 2. Si buscas, encontrarás ‣ Indexación escalable, de alto rendimiento ✓ Hasta 95GB/hora con hardware de última generación ✓ Requisitos de RAM mínimos -- tan sólo 1MB (pila) ✓ Indexación incremental tan rápida como indexación por lotes ✓ Tamaño del índice approx. 20-30% del tamaño real del texto indexado ‣ SoporteAlgoritmos de búsqueda potentes, precisos y eficientes ‣ multi-plataforma ✓ Búsquedas por puntuación -- los mejores resultados se devuelven los primeros ✓ Disponible como software Open frase, con bajo licencia de Apache ✓ Todo tipo de consultas: por Source comodines, por proximidad, por rango, etc. ✓ ✓ puro 100% Java Búsquedas por campos, con ordenación por cualquier campo ✓ Búsquedas por múltiple índice combinadas ✓ Implementaciones en otros lenguajes con compatibilidad de índices ✓ Permite indexación y búsqueda simultánea
  • 32. 2. Si buscas, encontrarás ‣ Indexación escalable, de alto rendimiento ✓ Hasta 95GB/hora con hardware de última generación ✓ Requisitos de RAM mínimos -- tan sólo 1MB (pila) ✓ Indexación incremental tan rápida como indexación por lotes ✓ Tamaño del índice approx. 20-30% del tamaño real del texto indexado ‣ Algoritmos de búsqueda potentes, precisos y eficientes ✓ Búsquedas por puntuación -- los mejores resultados se devuelven los primeros ✓ Todo tipo de consultas: por frase, con comodines, por proximidad, por rango, etc. ✓ Búsquedas por campos, con ordenación por cualquier campo ✓ Búsquedas por múltiple índice combinadas ✓ Permite indexación y búsqueda simultánea ‣ Soporte multi-plataforma ✓ Disponible como software Open Source bajo licencia de Apache ✓ 100% Java puro ✓ Implementaciones en otros lenguajes con compatibilidad de índices
  • 33. 2. Si buscas, encontrarás ‣ Ecosistema de proyectos relacionados:
  • 34. 2. Si buscas, encontrarás ‣ Ecosistema de proyectos relacionados: ✓ Apache Hadoop ✓ Apache Solr ✓ Apache ManifoldCF ✓ Apache Lucene.NET ✓ Apache Lucy ✓ Apache Mahout ✓ Apache Nutch ✓ Apache OpenNLP ✓ Apache Tika ✓ Apache Zookeeper
  • 35. 2. Si buscas, encontrarás ‣ Simplificación en la búsqueda sobre Lucene: ✴ API de Lucene complicada - Muy bajo nivel ✴ Proporciona un mapeador OR fácil de usar ✴ Distintos formatos: Object, XML, JSON, Resource ✴ Capa transaccional con integración JTA/XA ✴ Utiliza Spring e incorpora TX, MVC y AOP ✴ Soporta índices distribuidos: BBDD / Data Grid
  • 36. 2. Si buscas, encontrarás ‣ Simplificación en la búsqueda sobre Lucene: ✴ API de Lucene complicada - Muy bajo nivel ✴ Proporciona un mapeador OR fácil de usar ✴ Distintos formatos: Object, XML, JSON, Resource ✴ Capa transaccional con integración JTA/XA ✴ Utiliza Spring e incorpora TX, MVC y AOP ✴ Soporta índices distribuidos: BBDD / Data Grid
  • 37. 2. Si buscas, encontrarás ‣ Pero, ¿cómo mejorar si cabe más Compass?: ✴ Solución mucho más escalable / distribuida ✴ Características de búsqueda simplificadas: ➡ Facets (multifacética): estadísticas, etc. ➡ Difusa / “Como ésta” ➡ Puntuación personalizada/derivada ➡ Filtros: geodistancia, rangos, etc. ✴ JSON sobre HTTP, RESTful, Groovy
  • 38. 2. Si buscas, encontrarás
  • 39. 2. Si buscas, encontrarás elasticsearch.
  • 40. Índice 1. Acerca del ponente 2. Si buscas, encontrarás 3. Elasticidad en la búsqueda 4. Preguntas y respuestas 5. Contacto 18
  • 41. 3. Elasticidad en la búsqueda ‣ Ya sabes, para Buscar: ★ Open Source (Apache 2) ★ Motor distribuido, RESTful, sobre Lucene ‣ Libre de esquema & Orientado a Documento: ★ Modelo NoSQL basado en JSON ‣ Búsqueda: ★ DSL basado en JSON: queries, facets, highlighting, scripting, percolator, geobúsquedas, etc. ★ Multi-tenancy: búsqueda por múltiples índices ‣ Distribuido: ★ Índices --> fragmentos (shards) --> réplicas ★ Cluster --> nodos --> 1..n fragmentos ★ Balanceo, enrutado, tolerancia a fallos (Gateway), etc. 19
  • 42. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación ‣ Mediante plugin: ★ “As for now, you should only use this plugin for testing purpose since you may lack some functionalities in a production environment” ‣ Directamente con la API de elasticsearch: ★ REST API --> Expuesta mediante HTTP, thrift, memcached ★ Java API --> Asíncrona, soporta 100% la REST API ★ Groovy API --> Asíncrona, envoltorio limitado sobre la Java API ‣ Clientes: ★ Node --> Se une al cluster como un nodo más y puede almacenar información o no, incluso configurarse como cluster local ★ Transport --> No se une al cluster; conexión remota 20
  • 43. 3. Elasticidad en la búsqueda DEMO REST API 21
  • 44. 3. Elasticidad en la búsqueda DEMO ES PLUGIN 22
  • 45. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Analizador propio de español 23
  • 46. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Analizador propio de español SpanishAnalyzer.java 23
  • 47. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Analizador propio de español SpanishAnalyzer.java 23
  • 48. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Analizador propio de español SpanishAnalyzer.java elasticsearch/config/elasticsearch.yml 23
  • 49. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Analizador propio de español SpanishAnalyzer.java elasticsearch/config/elasticsearch.yml 23
  • 50. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Creación del índice y mapeo del tipo ‘producto’ 24
  • 51. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Creación del índice y mapeo del tipo ‘producto’ $ curl -XPUT 'http://localhost:9200/cuestamenos/' -d ' {     settings : {         index : {             number_of_shards : 3,             number_of_replicas : 2         }     } } ' 24
  • 52. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Creación del índice y mapeo del tipo ‘producto’ $ curl -XPUT 'http://localhost:9200/cuestamenos/producto/mapping' -d ' ' 24
  • 53. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Configuración del cliente 25
  • 54. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Configuración del cliente grails-app/conf/spring/resources.groovy 25
  • 55. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Configuración del cliente grails-app/conf/spring/resources.groovy 25
  • 56. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Configuración del cliente TransportClientFactoryBean.groovy grails-app/conf/spring/resources.groovy 25
  • 57. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Configuración del cliente grails-app/conf/spring/resources.groovy TransportClientFactoryBean.groovy 25
  • 58. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Indexación por lotes (bulk indexing) 26
  • 59. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Indexación por lotes (bulk indexing) IndexRequestQueue.groovy 26
  • 60. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Indexación por lotes (bulk indexing) IndexRequestQueue.groovy 26
  • 61. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Indexación por lotes (bulk indexing) 26
  • 62. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Indexación por lotes (bulk indexing) 26
  • 63. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) ‣ Búsqueda avanzada 27
  • 64. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) { ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } } } 27
  • 65. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) { ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } } } 27
  • 66. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) { ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { ElasticSearchUtil.groovy "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } } } 27
  • 67. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) { ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { ElasticSearchUtil.groovy "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } } } 27
  • 68. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) { ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { ElasticSearchUtil.groovy "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } } } 27
  • 69. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) { ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { ElasticSearchUtil.groovy "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } } } 27
  • 70. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) { ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { ElasticSearchUtil.groovy "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } } } 27
  • 71. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) { ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { ElasticSearchUtil.groovy "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } } } 27
  • 72. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) { ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], “query” : { "filtered" : { "query" : { "bool" : { ElasticSearchUtil.groovy "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } } } 27
  • 73. 3. Elasticidad en la búsqueda ✓ Integración en la aplicación (...continua) { ‣ Búsqueda avanzada "from" : 0, size: 10, "sort" : [ { "_score" : "desc" } ], ElasticSearchUtil.groovy “query” : { "filtered" : { "query" : { "bool" : { "must" : { "field" : { "_all" : "horror" } }, "must" : { "field" : { “_all" : "noche" } } } }, "filter" : { "bool" : { "must" : { "term" : { "categorias1" : "Ocio y cultura" } }, "must" : { "term" : { "tienda" : "Casa del Libro" } } } } } }, "facets" : { "categorias2" : { "terms" : { "field" : "categorias2", "size" : 10 }, "facet_filter" : { "term" : { "categorias1" : "Ocio y cultura" } } }, "tienda" : { "terms" : { "field" : "tienda", "size" : 10 }, "facet_filter" : { "term" : { "tienda" : "Casa del Libro" } } } } } 27
  • 74. 3. Elasticidad en la búsqueda ✓ En resumen... ‣ Añadir búsqueda de texto completo a tu aplicación es un juego de niños con ElasticSearch ‣ Configuración sin dolores de cabeza (para comenzar a trabajar) ‣ Funcionalidad compleja a tu alcance (facets, highlighting, percolator, etc.) con JSON simple sobre HTTP ‣ ES no es un repositorio NoSQL, aunque se parece (orientado a documentos sin esquema predeterminado) ‣ Distribuido, disponible, escalable, tiempo real, para la nube 28
  • 75. Índice 1. Acerca del ponente 2. Si buscas, encontrarás 3. Elasticidad en la búsqueda 4. Preguntas y respuestas 5. Contacto 29
  • 76. 4. P & R PREGUNTAS & RESPUESTAS 30
  • 77. Índice 1. Acerca del ponente 2. Si buscas, encontrarás 3. Elasticidad en la búsqueda 4. Preguntas y respuestas 5. Contacto 31
  • 78. 5. Contacto E-mail: e.medina.m@gmail.com Twitter: @emedinam @observadegrails @cuestamenos http://observatoriodegrails.com http://forodegrails.com http://cuestamenos.com GRACIAS POR VUESTRA ATENCIÓN 32

Notas do Editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. HADOOP --> software for reliable, scalable, distributed computing --> Common, HDFS, MapReduce\nMANIFOLDCF --> connecting source content repositories like Microsoft Sharepoint and EMC Documentum, to target repositories or indexes, such as Apache Solr or OpenSearchServer\nLUCY --> Porting a C\nMAHOUT --> Scalable machine learning and data mining\nNUTCH --> Verticalización para crawling web\nOPENNLP -> Procesamiento de lenguaje natural\nTIKA --> Extracción de texto de formatos tipo Office, imagen, video, xml, html, etc\nZOOKEEPER --> Servicio de configuración centralizada y registro de nombres\n
  48. \n
  49. \n
  50. \n
  51. \n
  52. Los índices se descomponen en shards, donde cada shard puede tener 0 o más réplicas. Cada nodo en el cluster aloja uno o más shards, y actúa como un coordinador que delega operaciones a los shards correctos. El balanceo y el enrutado se gestionan de forma automática y entre bambalinas.\n\nEl estado del cluster (incluyendo el log de transacciones) puede ser regenerado a partir de cada nodo local (por defecto), o a partir de un repositorio compartido (como NFS o Amazon S3). Cuando se utiliza un repositorio compartido, el estado se replica de forma asíncrona.\nIncluso si se utiliza un repositorio compartido, el índice podría mantenerse completamente en memoria y al mismo tiempo hacer una recuperación completa si se produce un apagado del cluster.\n\n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n
  129. \n
  130. \n
  131. \n
  132. \n
  133. \n
  134. \n
  135. \n
  136. \n
  137. \n
  138. \n
  139. \n
  140. \n
  141. \n
  142. \n