Slide 1

Slide 1 text

Desvendando as queries no Elasticsearch Como criar uma busca mais inteligente

Slide 2

Slide 2 text

Quem sou eu? @guilhermeguitte ● Leroy Merlin Brasil. ● Co-organizer Laravel Meetup in São Paulo. ● Software Developer. ● Scrum Master. http://www.guitte.org

Slide 3

Slide 3 text

Antes de entrar em detalhes sobre Elasticsearch...

Slide 4

Slide 4 text

O que é "Elasticsearch"?

Slide 5

Slide 5 text

● Real-Time Data ● Real-Time Advanced Analytics ● Massively Distributed ● High Availability ● Multitenancy ● Full-Text Search ● Document-Oriented ● Schema-Free ● Developer-Friendly, RESTful API ● Per-Operation Persistence ● Build on top of Apache Lucene™

Slide 6

Slide 6 text

O que é um "index"?

Slide 7

Slide 7 text

É como se fosse um "banco de dados" num contexto de bancos de dados relacional.

Slide 8

Slide 8 text

GET http://localhost:9200/web/orders/_search index

Slide 9

Slide 9 text

O que é "type"?

Slide 10

Slide 10 text

GET http://localhost:9200/web/orders/_search type

Slide 11

Slide 11 text

O que é "inverted index"?

Slide 12

Slide 12 text

É como se fosse...

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

O que é "um documento"?

Slide 15

Slide 15 text

O documento { "customer": "Dr. Emiliano, the Mitchell Sr.", "items": [ { "id": 8510629, "value": 769 } ], "total": 2874.81, "created_at": "15/11/2015 17:00:57", "status": "delivered", "region": "sao_paulo", "shipping_fees": 719 }

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

O que aprendemos? ● Um vocabulário básico sobre Elasticsearch. ● O que é um "index". ● O que é um "type". ● O que é o "elasticsearch". ● O que é um documento.

Slide 18

Slide 18 text

Agora, com um conhecimento básico sobre Elasticsearch...

Slide 19

Slide 19 text

Esteja preparado!

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

Queries

Slide 22

Slide 22 text

Estrutura básica

Slide 23

Slide 23 text

{ "query": {} } GET http://localhost:9200/web/orders/_search

Slide 24

Slide 24 text

Structured search

Slide 25

Slide 25 text

"Procurar pelos documentos que exatamente atende aos critérios da query"

Slide 26

Slide 26 text

O resultado será "SIM" or "NÃO".

Slide 27

Slide 27 text

SELECT * FROM orders WHERE status = "received"

Slide 28

Slide 28 text

{ "query": { "term" : { "status": "received" } } } GET http://localhost:9200/web/orders/_search { "took": 24, ... "hits": { "total": 3041, "max_score": 2.4266458, "hits": [ ... ] } }

Slide 29

Slide 29 text

{ "query": { "constant_score" : { "filter": { "term" : { "status": "received" } } } } } GET http://localhost:9200/web/orders/_search { "took": 7, "timed_out": false, ... "hits": { "total": 3041, "max_score": 1, "hits": [ ... ] } }

Slide 30

Slide 30 text

Isso é para começar simples, porém no mundo real não é.

Slide 31

Slide 31 text

Acostume-se com "bool" queries

Slide 32

Slide 32 text

{ "query": { "bool" : { "must" : [], "should" : [], "must_not" : [], "filter": [] } } } GET http://localhost:9200/web/orders/_search

Slide 33

Slide 33 text

{ "query": { "bool" : { "must": { "term": { "status": "received" } } } } } GET http://localhost:9200/web/orders/_search { "took": 24, ... "hits": { "total": 3041, "max_score": 2.4266458, "hits": [ ... ] } }

Slide 34

Slide 34 text

{ "query": { "constant_score": { "filter": { "bool" : { "must": { "term": { "status": "received" } } } } } } } GET http://localhost:9200/web/orders/_search { "took": 24, ... "hits": { "total": 3041, "max_score": 1, "hits": [ ... ] } }

Slide 35

Slide 35 text

A estrutura "Bool" é bem flexível

Slide 36

Slide 36 text

{ "query": { "constant_score": { "filter": { "bool" : { "should": [ { "term": { "status": "received" } }, { "bool": { "must": { "term": { "customer": "Prof. Shaylee Greenholt" } … GET http://localhost:9200/web/orders/_search { "took": 12, ... "hits": { "total": 3041, "max_score": 1, "hits": [ ... ] } }

Slide 37

Slide 37 text

Quais os tipos de queries o elasticsearch possui?

Slide 38

Slide 38 text

● Term ● Terms ● Range ● Exists ● Missing ● Prefix { "term": { "status": "received" }} { "terms": { "status": ["received", "delivering"] }} { "range": { "total": {"gte": 100.5, "lte": 140.5 }}} { "exists": { "field": "region" }} { "missing": { "field": "region" }} { "prefix": { "customer": "Dolly" }}

Slide 39

Slide 39 text

● Wildcard ● Regexp ● Fuzzy ● Type ● Ids { "wildcard": { "customer": "Doll*" }} { "regexp": { "customer": { "value": "Doll*" }}} { "fuzzy": { "customer": { "value": "Doll*", "fuzziness": 2 }}} { "type": { "value": "orders"}} { "ids": { "type": "orders", "values": ["1", "2"]}}

Slide 40

Slide 40 text

Todas as queries que o Elasticsearch irá realizar, o "_score" será calculado. Caso você queira que seja ignorado, utilize "constant_score".

Slide 41

Slide 41 text

Structure queries são boas para: ● Filtrar documentos antes de rodar as queries que você deseja calcular o "_score". ● É rápido porque o Elasticsearch pode cachear e reutilizar nas próximas queries.

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

O que aprendemos? ● Structure search ● Use bool queries. ● Filtrar documentos antes de rodar queries full-text.

Slide 44

Slide 44 text

Full-text search

Slide 45

Slide 45 text

Temos duas diferenças quando falamos de buscas full-text.

Slide 46

Slide 46 text

Relevância

Slide 47

Slide 47 text

"O quão bem os documentos atenderam os critérios da query"

Slide 48

Slide 48 text

TF/IDF (Term freq./Inverted Document Freq.)

Slide 49

Slide 49 text

Proximidade por geolocalização Similaridade Fuzzy ...

Slide 50

Slide 50 text

_score max_score

Slide 51

Slide 51 text

Um query simples

Slide 52

Slide 52 text

{ "query": { "match": { "customer": "John" } } } { "_score": 4.6189003, "customer": "John Upton" }, { "_score": 4.6189003, "customer": "John Borer" }, { "_score": 4.6189003, "customer": "John Emard" }, { "_score": 4.06103, "customer": "John Runolfsdottir IV" }, { "_score": 3.8275056, "customer": "Mr. John Cartwright III" }, { "_score": 3.8275056, "customer": "John Hodkiewicz DDS" } GET http://localhost:9200/web/orders/_search

Slide 53

Slide 53 text

{ "query": { "match": { "customer": "Joh" } } } { "took": 15, ... "hits": { "total": 0, "max_score": null, "hits": [] } } GET http://localhost:9200/web/orders/_search

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

Elasticsearch (Lucene) persiste o dado de um jeito diferente do que estamos acostumados.

Slide 56

Slide 56 text

Para entender uma busca full-text, primeiro vocês deve entender como o Elasticsearch armazenada seus documentos.

Slide 57

Slide 57 text

É chamado de "Analysis"

Slide 58

Slide 58 text

O pipeline começa assim:

Slide 59

Slide 59 text

O pipeline começa com: ● Criando um mapping ("Schema") para o index. ● Receber o dado via Index API. ● Iterar sobre cada campo e ver ser o campo é analyzed. ● Rodar o analyzer para o campo. ● Persistir o dado.

Slide 60

Slide 60 text

O documento { "customer": "Dr. Emiliano, the Mitchell Sr.", "items": [ { "id": 8510629, "value": 769 } ], "total": 2874.81, "created_at": "15/11/2015 17:00:57", "status": "delivered", "region": "sao_paulo", "shipping_fees": 719 }

Slide 61

Slide 61 text

"customer": "Dr. Emiliano, the Mitchell Sr." O documento

Slide 62

Slide 62 text

"Dr. Emiliano, the Mitchell Sr." O documento Analyzer: Tokenizer: whitespace Token filter: lowercase Char Filter: html_strip

Slide 63

Slide 63 text

"Dr. Emiliano, the Mitchell Sr." Char filter Analyzer: Tokenizer: whitespace Token filter: lowercase Char Filter: html_strip "Dr. Emiliano, the Mitchell Sr." string

Slide 64

Slide 64 text

"Dr. Emiliano, the Mitchell Sr." Tokenizer Analyzer: Tokenizer: whitespace Token filter: lowercase Char Filter: html_strip "Dr." "Emiliano," "the" "Mitchell" "Sr." tokens

Slide 65

Slide 65 text

Token filter Analyzer: Tokenizer: whitespace Token filter: lowercase Char Filter: html_strip "dr." "emiliano," "the" "mitchell" "sr." "Dr." "Emiliano," "the" "Mitchell" "Sr."

Slide 66

Slide 66 text

1 1 1 1 1 Persistindo "dr." "emiliano," "the" "mitchell" "sr." Token Doc ID

Slide 67

Slide 67 text

1 1 1 1 1 Persistindo "dr." "emiliano," "the" "mitchell" "sr." Token Doc ID TF/IDF (Term Freq/Inverted Document Freq) irá calcular o score do documento..

Slide 68

Slide 68 text

{ "query": { "match": { "customer": "Mitchell" } } } GET http://localhost:9200/web/orders/_search

Slide 69

Slide 69 text

"Mitchell" O termo buscado pelo usuário Analyzer: Tokenizer: whitespace Token filter: lowercase Char Filter: html_strip

Slide 70

Slide 70 text

"Mitchell" O termo pesquisado Analyzer: Tokenizer: whitespace Token filter: lowercase Char Filter: html_strip

Slide 71

Slide 71 text

"Mitchell" O termo pesquisado Analyzer: Tokenizer: whitespace Token filter: lowercase Char Filter: html_strip

Slide 72

Slide 72 text

"Mitchell" O termo pesquisado Analyzer: Tokenizer: whitespace Token filter: lowercase Char Filter: html_strip "mitchell"

Slide 73

Slide 73 text

1 1 1 1 1 Persistindo "dr." "emiliano," "the" "mitchell" "sr." Token Doc ID "mitchell"

Slide 74

Slide 74 text

1 1 1 1 1 Persistindo "dr." "emiliano," "the" "mitchell" "sr." Token Doc ID "mitchell"

Slide 75

Slide 75 text

No content

Slide 76

Slide 76 text

No content

Slide 77

Slide 77 text

Quais as tipos de buscas o Elasticsearch tem?

Slide 78

Slide 78 text

● Match ● multi_match ● ... { "match": { "name": "John" }} { "multi_match": { "query": "John", "fields": ["name.raw", "name.autocomplete"]}}

Slide 79

Slide 79 text

No content

Slide 80

Slide 80 text

● Entender o processo de "analysis" é imprescindível para entender como a busca full-text funciona. ● Analyzer é composto por: tokenizers, token_filters and char filters. ● Você tem que entender como o usuário irá buscar para saber qual a query mais apropriada para rodar. O que aprendemos?

Slide 81

Slide 81 text

No content

Slide 82

Slide 82 text

No content

Slide 83

Slide 83 text

No content

Slide 84

Slide 84 text

Usamos uma "técnica" chamada Concept Search.

Slide 85

Slide 85 text

Primeiramente, uma busca em Information Retrieval é categorizada como "semântica" ou "sintática"

Slide 86

Slide 86 text

Semântica ● O cachorro grande (cachorro com no mínimo de 5KG). ● Produtos infantis (produtos que a estampa é colorida).

Slide 87

Slide 87 text

Sintática ● O cachorro grande. ● Produtos infantis.

Slide 88

Slide 88 text

No caso do Elasticsearch que utiliza o Lucene...

Slide 89

Slide 89 text

Lucene é baseado em 2 principais conceitos.

Slide 90

Slide 90 text

Vector space model Boolean retrieval

Slide 91

Slide 91 text

Boolean retrieval

Slide 92

Slide 92 text

Boolean retrieval

Slide 93

Slide 93 text

Vector space model ● Como os documentos serão rankeados mais que outros. ● Um dos algoritmos utilizados são tf/idf (Term frequency/Inverse Document Frequency)

Slide 94

Slide 94 text

Eles não são otimizados para queries mais focadas pra e-commerce.

Slide 95

Slide 95 text

No content

Slide 96

Slide 96 text

O que aprendemos? ● Busca sintática vs semântica ● Elasticsearch é focado em busca sintática. ● Boolean retrieval e Vector space Model são a base desse modelo engine de busca.

Slide 97

Slide 97 text

Precision e Recall

Slide 98

Slide 98 text

Atual Esperado OK

Slide 99

Slide 99 text

Precision Quando dos documentos relevantes disponíveis foram retornados na query. "Quanto o resultado é completo"

Slide 100

Slide 100 text

Quando documentos relevantes foram retornados da query. "Quanto a busca foi útil". Recall

Slide 101

Slide 101 text

Atual Esperado OK Lixo Significado

Slide 102

Slide 102 text

OK Um resultado que você quer

Slide 103

Slide 103 text

OK

Slide 104

Slide 104 text

Atual Esperado OK Mais lixo

Slide 105

Slide 105 text

NAME = John AND SURNAME = Silva # => 100 NAME = John OR SURNAME = Silva # => 1000

Slide 106

Slide 106 text

NAME = John AND SURNAME = Silva # => 100 NAME = John OR SURNAME = Silva # => 1000 "John Silva" Sem resultado

Slide 107

Slide 107 text

Pipeline

Slide 108

Slide 108 text

Sinônimos

Slide 109

Slide 109 text

Atalho

Slide 110

Slide 110 text

Atalho

Slide 111

Slide 111 text

Atalho

Slide 112

Slide 112 text

Busca por conteúdo

Slide 113

Slide 113 text

Busca por conteúdo

Slide 114

Slide 114 text

No content

Slide 115

Slide 115 text

● Precision e recall ● Staged Search ● Buscas mais estritas para buscas mais abrangentes ● Crie seu próprio pipeline ● Conheça o tipo de buscas do seus usuários O que aprendemos?

Slide 116

Slide 116 text

No content

Slide 117

Slide 117 text

Referências ● https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html ● https://www.elastic.co/guide/en/elasticsearch/guide/current/index.html ● https://www.youtube.com/playlist?list=PLZ4puV97Zwm2fEmTLrPsP7QgLsjnnQggX ● Official PHP elasticsearch package: https://github.com/elastic/elasticsearch-php ● https://github.com/sleimanx2/plastic ● https://www.elastic.co/guide/en/elasticsearch/guide/current/scoring-theory.html

Slide 118

Slide 118 text

Estamos Contratando! Dev BackEnd, Dev FrontEnd, UX [email protected]

Slide 119

Slide 119 text

Obrigado! @guilhermeguitte http://www.guitte.org