4. ¿Me ponés un buscadorcito?
● Los que merecen ser exterminados
– Usá LIKE. Es fácil.
● Los que te odian
– MySQL FULL TEXT
● Los que piensan que The Matrix está basada en hechos
reales
– Creá tu propio indexador
● Los que te quieren. Un poquito nomás.
– Sphinx
● Los que te quieren ver destronar a Zuckerberg. Y te ayudan
a hacerlo.
– ElasticSearch papá.
6. Te empieza a gustar
● Montado sobre Lucene
● “Schema-free”
● REST
– ¡Hasta la configuración!
● Múltiples índices (y poder buscar a través)
● Casi super requete-recontra real time
● Super requete-recontra distribuido
● Una papa de instalar, integrar, y escalar
● El tipo que lo creó es un loco de la guerra (@kimchy)
11. ¿Simplemente un buscador?
curl -XGET 'http://localhost:9200/_all/articulo/_search?q=cerveza'
Busco todos los índices
curl -XGET
'http://localhost:9200/articulos/articulo,autor/_search?q=name:X'
Busco varios tipos de datos
12. Tipos de datos
● Quiero tener algunos elementos del documento
no indexables
● Quiero poder buscar, agregar filtros, y ordenar
● Datos simples: string, integer, long, float, double,
boolean, null
● Datos compuestos: array, object
● boost
● include_in_all
18. Rivers
● Consume datos (los trae o los recibe) y los mete en ES
● Rivers
– CouchDB
– RabbitMQ
– Twitter
– Wikipedia
● Community
– MongoDB
– JDBC
19. Percolator
● Almaceno una query (en un índice)
● Ejecuto esa query (_percolate) sobre un documento
– ¡No almacena el documento en el índice!
● Me dice que queries matchearon
● Ejemplo: tweets que matcheen una búsqueda, a
medida que vienen
● Como almaceno queries, puedo filtrar que queries
se ejecutan (wow)
20. Super requete-recontra escalable
● Shards: parte de los documentos (cada uno es un
índice Lucene). Se shardea por _id
– En cuantas “partes” queremos dividir los datos
– Si un nodo se cae, todavía tenemos parte de los datos
– Más shards, mejor indexing
● Cada shard puede tener réplicas (que se pueden crear
dinamicamente!)
– Copias. Si se caen varios shards, aun podemos tener toda
la data
– Más replicas, mejor búsqueda
22. Una tormenta de magia
● Discovery: identificar nodos, y seleccionar nodo
master
● El master mantiene el estado del cluster, y
reasigna shards si nodos entran / se van
● Los nodos responden a los requests (no van a
master)
● Un nodo sabe si puede responder un request, y si
no lo delega
● Auto-discovery por Zen o EC2
23. Persistent storage
● La info sobre un nodo es temporaria
– JVM heap (ojo!)
● Persistent: para estado del cluster e indices
● Permite un full recovery si se restartea el cluster
● Gateways soportados:
– FS local o compartido
– Hadoop via HDFS
– S3
24. API
● _search: errr... buscar :)
● _status: te da información sobre un índice
● _refresh: refrescar indices
● _optimize: optimizar en Lucene
● _mapping: crear un tipo de datos
* REAL TIME: depende del indice. Refresh de un segundo por defecto
* Nodos: concepto similar a DB engine * Indices: concepto similar a bases de datos * Tipos: concepto similar a tabla * Documento: concepto similar a registro
* REST: PUT versus POST: POST puedo no especificar ID, y me genera uno. PUT si o si tengo que tener ID. * REST: si pongo -XDELETE, borro el documento
* Porque? Porque puedo meter data complicada en el documento
* Como seria borrar? -XDELETE
* boost: levantar relevancia de un campo. Ejemplo: skills en Workana
* Se puede definir index_analyzer y search_analyzer para cambiar como se analiza el texto en el momento de indexar o buscar * Se puede deshabilitar el indexado sobre campos
* Es un documento, no tengo porque especificar todos los campos
* limit: limito cantidad de registros * exists: que un campo existe * numeric_range: mas rapido que range porque pre-carga datos en memoria * has_parent / has_child: para documentos embebidos
* query_string: se puede usar OR, AND * field: como query_string pero para un field especifico * fuzzy: Levenshtein, se puede poner un minimo de similaridad. Para numericos, se transforma en un range
* Counts agregados junto con la consulta
* Replicas: se usan para query en paralelo
** EL CLUSTER se puede manejar via API! * Zen: default, provee unicast y multicast discovery * EC2: similar a multicast, justamente porque EC2 no es multi-cast friendly
* _status: cantidad de operaciones, numero de documentos, de todo * _refresh: refrescar explicitamente uno o más indices. Las capacidades real time dependen del tipo de engine usado en el índice: por ejemplo robin requiere llamada a refresh (se llama periodicamente)