Está en la página 1de 53

Elasticsearch

Problemas
Almacenamiento: DBMS

Analítica: DBMS orientado


a columnas
Búsqueda: ¿?
2
¿Qué es búsqueda o
búsqueda de qué?

3
Búsqueda y recuperación de
información en documentos
electrónicos

https://en.wikipedia.org/wiki/Information_retrieval
https://nlp.stanford.edu/IR-book/html/htmledition/irbook.html 4
Necesitamos todos los libros
de la biblioteca de ORT que
incluyen la palabra
“Software”
5
SELECT * FROM books
WHERE title
LIKE '%Software%'

6
Ahora necesitamos que
incluya “Software” pero no
“Patterns”

7
SELECT * FROM books
WHERE title
LIKE '%Software%' AND title
NOT LIKE '%Patterns%'
8
¿Alguna forma mejor?

Índices FULLTEXT
9
SELECT * FROM books
WHERE MATCH(title)
AGAINST('Software', -'Patterns'
IN BOOLEAN MODE)
10
Además queremos que sean
de determinado autor y
publicado en ciertos años

11
SELECT b.* FROM books b, author.a WHERE
MATCH(title)
AGAINST('Software', -'Patterns' IN BOOLEAN MODE)
AND a.id = b.author_id AND author_name = 'Martin
Fowler' AND YEAR(pub_date) BETWEEN 2005, 2014

12
Y si hay que buscar en
más de un sistema...

13
Problemas de los RDBMS
● Su fuerte son los números, no texto
● Es necesario crear índices
● No hay control sobre el indexado
● No soportan consultas complejas
● Son difíciles de escalar

14
La búsqueda en texto es un
problema complejo en sí
mismo
(precisión, exhaustividad, relevancia...)
15
● 888 wikis (entre ellos la Wikipedia)
● Artículos en 265 idiomas
● No son lingüistas
● Millones de visitas diarias
● Ciento de miles de ediciones que se tienen
que indexar en tiempo real
● Los resultados de búsqueda tienen que ser
relevantes y presentados a tiempo

16
Motor de búsqueda
● Indexe datos de forma eficiente
● Todos los campos/combinaciones
● Análisis de datos
● Búsqueda textual
● Geográfica
● Por fechas
● Ordene por relevancia
17
18
Algunas Otras palabras
Universidad ORT
palabras innecesarias

Documento 1 Documento 2 Documento 3


ID TÉRMINO DOCUMENTO:POSICIÓN
1 Algunas 1:1
2 palabras 1:2, 2:2
3 Otras 2:1
4 innecesarias 2:3
5 Universidad 3:1
6 ORT 3:2
19
“Peta, usted ya no es el mismo de antes. Lo tiró tres veces a
su wing y el tipo todavía sigue respirando.”

WhitespaceAnalyzer
[Peta,] [usted] [ya] [no] [es] [el] [mismo] [de] [antes.] [Lo] [tiró]
[tres] [veces] [a] [su] [wing] [y] [el] [tipo] [todavía] [sigue]
[respirando.]
SimpleAnalyzer
[peta] [usted] [ya] [no] [es] [el] [mismo] [de] [antes] [lo] [tiró] [tres]
[veces] [a] [su] [wing] [y] [el] [tipo] [todavía] [sigue] [respirando]
20
Pero es una librería...

21
22
23
● Plataforma de búsqueda y análisis
● Casi en tiempo real
● Distribuida
● Escalable
● Simple de usar
● Orientada a documentos
● Schemaless
● RESTful (HTTP + JSON)
● API Java
● Clientes (Python, Ruby, PHP, etc)
24
● Documentos complejos
● Suggest y corrección
● Más como esto
● Resaltar resultados
● Facets (GROUP BY)
● Consultas Geo localizadas
● Consultas con DSL JSON
● Replicación y sharding
● No es una BBDD (counts aproximados)
25
26
27
28
29
30
¿Dónde y qué guarda ES?

31
En: Índices
Guarda: Documentos

32
¿Qué es un documento?

33
{
"name": "Ramones",
"genre": ["Punk rock", "Pop punk"],
"from": 1974,
"to": 1996,
"members": [
{"name": "Johnny Ramone", "instrument": "Guitar"},
{"name": "Dee Dee Ramone", "instrument": "Bass"},
{"name": "Joey Ramone", "instrument": "Vocals"},
{"name": "Tommy Ramone", "instrument": "Drums"},
{"name": "Marky Ramone", "instrument": "Drums"},
{"name": "Richie Ramone", "instrument": "Drums"},
{"name": "Elvis Ramone", "instrument": "Drums"},
{"name": "C. J. Ramone", "instrument": "Bass"}
]
}

34
https://en.wikipedia.org/wiki/Ramones
PUT http://localhost:9200/$indice/

GET http://localhost:9200/$indice/

DELETE http://localhost:9200/$indice/
35
PUT http://localhost:9200/$i/_doc/$id
{
"name": "Ramones",
"genre": ["Punk rock", "Pop punk"],
"from": 1974,
"to": 1996,
"members": [
{"name": "Johnny Ramone", "instrument": "Guitar"},
{"name": "Dee Dee Ramone", "instrument": "Bass"},
{"name": "Joey Ramone", "instrument": "Vocals"},
{"name": "Tommy Ramone", "instrument": "Drums"},
{"name": "Marky Ramone", "instrument": "Drums"},
{"name": "Richie Ramone", "instrument": "Drums"},
{"name": "Elvis Ramone", "instrument": "Drums"},
{"name": "C. J. Ramone", "instrument": "Bass"}
]
}

36
PUT http://localhost:9200/$indice/_bulk
{ "index":
{ "_index": "n", "_type" : "t", "_id": "$id" }
}
{“att”: val, “att”, val...}
...
37
GET http://localhost:9200/$indice/_doc/$id

38
POST
http://localhost:9200/$i/_doc/$id/_update{
“script”: “ctx._source.att = \”val\””
}

39
DELETE http://localhost:9200/$indice/_doc/$id

40
GET http://localhost:9200/$indice/_search?q=c:v
GET http://localhost:9200/$i1,$i2/_search?q=c:v
GET http://localhost:9200/_all/_search?q=c:v
GET http://localhost:9200/_search?q=c:v

41
POST http://localhost:9200/_scripts/by_name
{
"script": {
"lang": "mustache",
"source": {
"query": {
"match": {
"name": "{{q}}"
}
}
}
}
}

42
POST http://localhost:9200/starwars/_doc/_search/template
{
"id": "by_name",
"params": {
"q": "Luke Skywalker"
}
}

43
GET http://localhost:9200/tweets/_search
{
“query”: {
“bool”: {
“must”: {“match_all: {}”}
},
“filter”: {
“geo_distance”: {
“distance”: “5km”,
“location”: {
“lat”: -34.90,
“lon”: -56.19
}
}
}
}
}
44
Replicación y sharding

45
● Alta disponibilidad
● Tolerancia a fallas
● Escalabilidad horizontal
● Más capacidad de almacenamiento
● Más capacidad de procesamiento

46
Índice

Shard Primario
{“_id”: 1} {“_id”: 2} {“_id”: 3} {“_id”: 4}...

Shard Replica
{“_id”: 1} {“_id”: 2} {“_id”: 3}...

47
Cluster Elasticsearch

PUT bands Nodo 1 Nodo 2

bands 0 P bands 0 R

48
Cluster Elasticsearch

PUT bands2 Nodo 1 Nodo 2


{
bands2 0 P bands2 0 R
"settings": {
"index": {
bands2 1 P bands2 1 R
"number_of_shards": 4,
"number_of_replicas": 1
bands2 2 R bands2 2 P
}
}
bands2 3 R bands2 3 P
}

49
¿Cómo sabe ES a qué
shard corresponde un
documento?

50
shard = hash(ruteo) % total_de_shards_primarios

51
● Ruteo puede ser
○ Atributo _id (es el que se usa por
defecto)
○ Otro atributo del documento

52
● ¿Cómo replica?
○ Asincrónicamente
○ Concurrente
○ Las operaciones puede llegar a los nodos en
cualquier momento y cualquier orden
● ¿Cómo se controla la concurrencia?
○ _seq_no identifica la operación
○ _primary_term identifica el shard primario
○ Solo aplica operaciones mayores a la actual
○ Solo aplica operaciones del shard primario actual
53

También podría gustarte