Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Problemas
Almacenamiento: DBMS
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
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
bands 0 P bands 0 R
48
Cluster Elasticsearch
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