SlideShare a Scribd company logo
1 of 42
Download to read offline
Explain explained 05/11/14 11:56 
Summary 
1: Getting the right results 
Jettro Coenradie 
This presentation is about getting the right results from elasticsearch. There 
are a lot of things that you can do to improve the results you get back from 
elasticsearch. You will get an introduction into different kind of queries that 
you can use, the impact of analysers on results and we take a deep dive into 
the explain functionality. Using the explain functionality you can find out why 
one document is matching better than another. 
http://localhost:9200/_plugin/preso/#/print Page 1 of 42
Explain explained 05/11/14 11:56 
Returning the right results 
@jettroCoenradie 
http://localhost:9200/_plugin/preso/#/print Page 2 of 42
Explain explained 05/11/14 11:56 
2: About me 
how to contact me 
My name is Jettro Coenradie, I am the follow of Luminis Amsterdam. My 
specialty is search solutions and specifically elasticsearch. You can follow 
me on twitter, linkedin and my code is on github. 
email jettro.coenradie@luminis.eu 
twitter @jettroCoenradie 
linkedin https://www.linkedin.com/in/jettro 
Github https://github.com/jettro 
Blog http://www.gridshore.nl 
3: The right results 
what are they? 
How would you define the right results. Of course a lot depends on the 
context of the asked question. Like always you need to find the term on 
wikipedia to get your first explanation. 
How would you explain The 
right results? 
4: The right results 
according to wikipedia 
Every presentation has to start with wikipedia. To bad there is no page for 
the right results, but there is an interesting link to be found. This shows an 
excerpt from the toyota way. The right process will produce the right results. 
http://localhost:9200/_plugin/preso/#/print Page 3 of 42
Explain explained 05/11/14 11:56 
This is also true for returning the right results using elasticsearch. During this 
presentation the right process will become clear. 
5: What is elasticsearch? 
more than search 
Before we can start explaining why elasticsearch returns the results that it 
does, you first need to know more about what elasticsearch is, what it can 
do for you and some terminology used though out the remainder of the 
presentation. You will learn about structured and unstructured data, data 
sources and how we use the data. 
http://localhost:9200/_plugin/preso/#/print Page 4 of 42
Explain explained 05/11/14 11:56 
http://localhost:9200/_plugin/preso/#/print Page 5 of 42
Explain explained 05/11/14 11:56 
http://localhost:9200/_plugin/preso/#/print Page 6 of 42
Explain explained 05/11/14 11:56 
6: Lucene 
what we need it for 
http://localhost:9200/_plugin/preso/#/print Page 7 of 42
Explain explained 05/11/14 11:56 
Introduce lucene, explain we use analyzers to create terms, the terms are 
stored in an inverted index and the inverted index is used to search the 
terms. 
Create terms, 
Store terms, 
Search terms. 
7: Elasticsearch and lucene 
cluster, index, shards, lucene 
In here I want to explain the different components of an elasticsearch cluster. 
I am showing images containing the structure of these components. A 
cluster contains multiple nodes. Each nodes contains shards of multiple 
indices. Each shard is a lucene index. 
http://localhost:9200/_plugin/preso/#/print Page 8 of 42
Explain explained 05/11/14 11:56 
http://localhost:9200/_plugin/preso/#/print Page 9 of 42
Explain explained 05/11/14 11:56 
8: Executing a query 
calling all shards 
In this slide I am explaining what happens when you execute a query. You 
will learn that we first execute a query that is send to all shards by the client. 
The results are gathered and merged and if the right set of documents is 
created the actual required documents are fetched. 
http://localhost:9200/_plugin/preso/#/print Page 10 of 42
Explain explained 05/11/14 11:56 
http://localhost:9200/_plugin/preso/#/print Page 11 of 42
Explain explained 05/11/14 11:56 
http://localhost:9200/_plugin/preso/#/print Page 12 of 42
Explain explained 05/11/14 11:56 
9: Executing a query 
basic concepts 
http://localhost:9200/_plugin/preso/#/print Page 13 of 42
Explain explained 05/11/14 11:56 
This slide shows the both the apis that elasticsearch provideds. You can 
execute queries using the java api or the rest api through one of the available 
drivers. No matter what mechanism you choose you can use a lot of 
different queries. 
http://localhost:9200/_plugin/preso/#/print Page 14 of 42
Explain explained 05/11/14 11:56 
10: Example with curl 
find all docs 
In this slide we present you the most basic match all docs query using curl. 
http://localhost:9200/_plugin/preso/#/print Page 15 of 42
Explain explained 05/11/14 11:56 
11: Other query tools 
there are a lot 
Some examples of other query tools that are available. 
http://localhost:9200/_plugin/preso/#/print Page 16 of 42
Explain explained 05/11/14 11:56 
http://localhost:9200/_plugin/preso/#/print Page 17 of 42
Explain explained 05/11/14 11:56 
http://localhost:9200/_plugin/preso/#/print Page 18 of 42
Explain explained 05/11/14 11:56 
12: Execute query 
basic match query 
This is the most basic variant of executing a query. 
GET /slides/_search 
{ 
"query": { 
"match": { 
"description": "What you type!" 
} 
} 
} 
Results only in life presentation 
13: The calculated score 
use the explain api 
Here we are going to discuss the most basic explain you can get. 
GET /slides/_search?explain 
http://localhost:9200/_plugin/preso/#/print Page 19 of 42
Explain explained 05/11/14 11:56 
{ 
"query": { 
"match": { 
"description": "What you type!" 
} 
} 
} 
Results only in life presentation 
14: Explain query explained 
the basics 
In this slide I am going to show details about the explain basics. This is 
important to notice the pattern that all explain queries will have for every 
term that is matched. 
http://localhost:9200/_plugin/preso/#/print Page 20 of 42
Explain explained 05/11/14 11:56 
http://localhost:9200/_plugin/preso/#/print Page 21 of 42
Explain explained 05/11/14 11:56 
http://localhost:9200/_plugin/preso/#/print Page 22 of 42
Explain explained 05/11/14 11:56 
15: Calculating score 
the theory 
In this slide we are going to explain the theory behind creating score using 
simulariry algorithms. 
Score is calculated for matching documents (Boolean Model), 
Score represents similarity between search and document terms, 
Lucene uses enhanced TF/IDF (coordination factor and field length), 
Other algorithms can be used: Okapi BM25 
16: Lucene similarity 
formula 
Shows the formula used by lucene to calculate the score. 
http://localhost:9200/_plugin/preso/#/print Page 23 of 42
Explain explained 05/11/14 11:56 
https://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/similarities/17: Calculating score 
the terms 
This slide gives an overview of the most important definitions for calculating 
the score. 
queryNorm Attempt to make different queries comparable. 
coord Factor for total score based on amount of queried 
and found terms 
Term frequency Amount of times a term is matched in the field 
Inverse document 
amount of documents that have the term 
frequency 
fieldNorm Length of the field the terms was found in 
boost Boost a field score 
18: An explain example 
using match query 
In this slide we are going to use a very simple match query with an index 
containing only three documents. The goal is to show the effect on term 
frequency, inverse document frequency and the fieldnorm with very little 
documents in the index. 
Show tf/idf/fieldNorm and score 
Doc 1 Doc 2 Doc 3 
http://localhost:9200/_plugin/preso/#/print Page 24 of 42
Explain explained 05/11/14 11:56 
one two three two three three 
one 1 / 1 / 0.5 
0.702 
two 1 / 2 / 0.5 1 / 2 / 0.625 
0.5 0.625 
three 1 / 3 / 0.5 1 / 3 / 0.625 1 / 3 / 1 
0.356 0.445 0.712 
19: Explain multiple terms 
with a trick 
Here we are going to shows what happens to the results when using capital 
letters, multipe terms and introduce the camel case analyzer. 
GET /onetwothree/_search?explain 
Results only in life presentation 
20: What is an analyzer 
the parts 
Explain what the different components of an analyzer are. 
Character filters Tidy up the string before tokenising. 
Tokeniser Splits the string into a number of tokens 
Token filters Do something with the tokens 
21: One Two Three Analyzer 
settings 
http://localhost:9200/_plugin/preso/#/print Page 25 of 42
Explain explained 05/11/14 11:56 
Show the settings part of the analyzer as used in the onetwothree sample 
with the camel case. 
GET /onetwothree/_settings 
Results only in life presentation 
22: One Two Three Analyzer 
mappings 
Show the mappings part of the analyzer as used in the onetwothree sample 
with the camel case. 
GET /onetwothree/_mappings 
Results only in life presentation 
23: One Two Three Analyzer 
analyze api 
Test the analyzer using the analyze api. 
GET /onetwothree/_analyze?analyzer=camel&text=OneTwoThree 
Results only in life presentation 
24: Back to explain 
recap single term 
In this slide we get back to the explain api, from the image with the real 
explain output we introduce a short notation. 
GET /slides/_search?explain 
http://localhost:9200/_plugin/preso/#/print Page 26 of 42
Explain explained 05/11/14 11:56 
{ 
"query": { 
"match": { 
"description": "basic" 
} 
} 
} 
structure of the score calculation 
description:basic 
[*] 
tf / idf / fieldNorm 
25: Validate query 
http://localhost:9200/_plugin/preso/#/print Page 27 of 42
Explain explained 05/11/14 11:56 
using validate api 
In this slide we are going to demonstrate the validate api for a query using 
multiple terms. 
POST /slides/_validate/query?explain 
26: Validate query 
using validate api 
In this slide we are going to demonstrate the validate api for a query using 
multiple terms using the and operator. 
POST /slides/_validate/query?explain 
27: Bool query 
the base for all queries 
Introduce the bool query as the base query to all other queries. In the end all 
queries can be written as a bool query. Explain the difference between 
operator AND/OR. 
{ 
"query": { 
"bool": { 
"must": [ 
{} 
], 
"must_not": [ 
{} 
], 
"should": [ 
{} 
] 
} 
} 
} 
28: Boolean model 
http://localhost:9200/_plugin/preso/#/print Page 28 of 42
Explain explained 05/11/14 11:56 
must, must_not and should 
In this slide we are going to explain the transformation of all queries into a 
bool query. 
{ 
"query": { 
"match": { 
"description": "basic search elasticsearch" 
} 
} 
} 
{ 
"query": { 
"bool": { 
"should": [ 
{ 
"term": { 
"description": { 
"value": "basic" 
} 
} 
}, 
{ 
"term": { 
"description": { 
"value": "search" 
} 
} 
}, 
{ 
"term": { 
"description": { 
"value": "elasticsearch" 
} 
} 
} 
] 
} 
} 
} 
http://localhost:9200/_plugin/preso/#/print Page 29 of 42
Explain explained 05/11/14 11:56 
29: Explain 2 terms 
match with 2 
Now we are going to show the short notation for the explaination of a query 
with two terms due to a standard analyzer. 
GET /slides/_search?explain 
{ 
"query": { 
"match": { 
"description": "basic search" 
} 
} 
} 
structure of the score calculation 
[*] 
[+] 
description:basic 
coord (1/2) 
30: Explain 3 terms 
match with 3 
Now we are going to show the short notation for the explaination of a query 
with three terms due to a standard analyzer. 
GET /slides/_search?explain 
http://localhost:9200/_plugin/preso/#/print Page 30 of 42
Explain explained 05/11/14 11:56 
{ 
"query": { 
"match": { 
"description": "basic search elasticsearch" 
} 
} 
} 
structure of the score calculation 
[*] 
[+] 
description:basic 
description:elasticsearch 
coord (2/3) 
31: Validate query 
using validate api 
In this slide we are going to demonstrate the validate api for a query using 
multiple terms and multiple fields with the default best_fields type query. 
POST /slides/_validate/query?explain 
32: Validate query 
using validate api 
In this slide we are going to demonstrate the validate api for a query using 
multiple terms and multiple fields with the most_fields type query. 
POST /slides/_validate/query?explain 
33: Validate query 
http://localhost:9200/_plugin/preso/#/print Page 31 of 42
Explain explained 05/11/14 11:56 
using validate api 
In this slide we are going to demonstrate the validate api for a query using 
multiple terms and multiple fields with the cross_fields type query. 
POST /slides/_validate/query?explain 
34: Explain multi_field 
best_fields 
Show the effect of a multi_field query using the default best_fields type. 
GET /slides/_search?explain 
{ 
"query": { 
"multi_match": { 
"query": "basic query", 
"fields": [ 
"title", 
"description" 
], 
"type": "best_fields" 
} 
} 
} 
structure of the score calculation 
[max_of] 
[+] 
description:basic 
description:query 
[*] 
[+] 
title:query 
http://localhost:9200/_plugin/preso/#/print Page 32 of 42
Explain explained 05/11/14 11:56 
coord (1/2) 
35: Explain multi_field 
most_fields 
Show the effect of a multi_field query using the most_fields type. 
GET /slides/_search?explain 
{ 
"query": { 
"multi_match": { 
"query": "basic query", 
"fields": [ 
"title", 
"description" 
], 
"type": "most_fields" 
} 
} 
} 
structure of the score calculation 
[sum_of] 
[+] 
description:basic 
description:query 
[*] 
[+] 
title:query 
coord (1/2) 
36: Explain multi_field 
http://localhost:9200/_plugin/preso/#/print Page 33 of 42
Explain explained 05/11/14 11:56 
cross_fields 
Show the effect of a multi_field query using the cross_fields type. 
GET /slides/_search?explain 
{ 
"query": { 
"multi_match": { 
"query": "basic query", 
"fields": [ 
"title", 
"description" 
], 
"type": "cross_fields" 
} 
} 
} 
structure of the score calculation 
[sum_of] 
[max_of] 
description:basic 
[max_of] 
description:query 
title:query 
37: Explain dis_max query 
use tie breaker 
Show the effect of a dis_max query which is a balance between cross_fields 
and best matching field. 
GET /slides/_search?explain 
http://localhost:9200/_plugin/preso/#/print Page 34 of 42
Explain explained 05/11/14 11:56 
{ 
"query": { 
"dis_max": { 
"tie_breaker": 0.7, 
"boost": 1.2, 
"queries": [ 
{ 
"match": { 
"description": "basic query" 
} 
}, 
{ 
"match": { 
"title": "basic query" 
} 
} 
] 
} 
} 
} 
structure of the score calculation 
[max_of + 0.7 [*] others] 
[+] 
description:basic 
description:query 
[*] 
[+] 
title:query 
coord (1/2) 
38: Multile terms and fields 
summary 
http://localhost:9200/_plugin/preso/#/print Page 35 of 42
Explain explained 05/11/14 11:56 
Explain the different options we have for multi field queries and explain the 
differences when calculating the score. 
Best field returns the field with the highest score, 
Most fields adds the scores for the different fields, 
Cross fields treets all field as one big field and add maximum score for 
term, 
Dis max takes the best field and adds a part of the score of other fields 
39: Boosting 
the basics 
In match queries you can apply a boost to a certain field. Important to notice 
is that the structure of the output of explain is not changing using this kind of 
boost. It is only the score that changes, the boost is reflected within the 
query norm of the explain. 
{ 
"query": { 
"multi_match": { 
"query": "basic query", 
"fields": [ 
"title^5", 
"description" 
] 
} 
} 
} 
No boost Title boost 
_score 0.729 0.312 
description:basic 0.533 0.107 
description:query 0.195 0.0391 
description query norm 0.197 0.0394 
title:query 0.624 0.624 
http://localhost:9200/_plugin/preso/#/print Page 36 of 42
Explain explained 05/11/14 11:56 
coord (1/2) 0.5 0.5 
40: Boosting query 
match with negative impact 
The most basic boosting, is boosting on a field basis. Sometimes you have 
other boosting requirements. One thing could be to give a negative boost to 
some term. Of course you can use the must_not in a bool query but this is 
different. In that situation you do not have a match, but we want a match just 
with a lower score if a certain term is available. Here we show that the 
negative term query adds no score but does give a penalty to the complete 
score. 
{ 
"query": { 
"boosting": { 
"positive": { 
"term": { 
"description": { 
"value": "basic" 
} 
} 
}, 
"negative": { 
"term": { 
"description": { 
"value": "query" 
} 
} 
}, 
"negative_boost": 0.2 
} 
} 
} 
http://localhost:9200/_plugin/preso/#/print Page 37 of 42
Explain explained 05/11/14 11:56 
41: Sorting results 
by score and ... 
In this slide I want to discuss the options you have for sorting results. 
Sort by score (the default), 
Sort by date, 
Sort by analyzed fields, 
GET /slides/_search 
http://localhost:9200/_plugin/preso/#/print Page 38 of 42
Explain explained 05/11/14 11:56 
{ 
"query": { 
"match": { 
"description": "What you type!" 
} 
}, 
"sort": [ 
{ 
"title.raw": { 
"order": "asc" 
} 
} 
] 
} 
Results only in life presentation 
42: Fuzzy query 
taking care of typos 
In here we are going to demonstrate the effect of fuzzy searching on the 
score. We are going to use the term basik which is wrong for all slides 
except this slide. Show what happens with the boost factor for documents 
with that match due to the fuzzy matching. 
43: Fuzzy query 
explain score for match 
Explain why the score for the document with the fuzzy match is higher than 
the score for the exact match. 
Total score is a product of field and query weight. 
found term query weight field weight 
description:basic^0.8 0.36849 0.992109 
description:basik 0.59356 0.51138 
44: Fuzzy query 
http://localhost:9200/_plugin/preso/#/print Page 39 of 42
Explain explained 05/11/14 11:56 
enhance result with a signal 
Since we got the wrong document on top with the previous fuzzy query we 
now want to help improve the results with a Signal. A signal can help to 
change the score in a way you prefer. In this case we make the score higher 
if there is an exact match. 
45: Fuzzy query 
explain score for match 
Explain why adding a signal query as a should query with a match query 
does change the order of the results. 
No match means a coord penalty. 
found term must (fuzzy) should (match) 
description:basik 0.26101 0.26101 
description:basic^0.8 0.31438 * 0.5 (coord 1/2) 
46: Function score query 
using popularity 
One query that is used a lot on news sites is the function_score query. With 
this query you can change the score based on another field like the 
popularity or recency. In this slide we discuss the effect on the explain 
output for such a query. 
GET /blogging/_search?explain 
http://localhost:9200/_plugin/preso/#/print Page 40 of 42
Explain explained 05/11/14 11:56 
{ 
"query": { 
"function_score": { 
"query": { 
"match": { 
"description": "elasticsearch" 
} 
}, 
"functions": [ 
{ 
"field_value_factor": { 
"field": "popularity", 
"factor": 1.2, 
"modifier": "ln" 
} 
} 
] 
} 
} 
} 
structure of the score calculation 
function score 
[*] 
description:elasticsearch 
Math.min 
ln(doc[popularity].value * 
factor=1.2) 
maxBoost 
47: Summarizing 
the take away 
Explain the right process to produce the right results. 
http://localhost:9200/_plugin/preso/#/print Page 41 of 42
Explain explained 05/11/14 11:56 
The right process to produce the right results. 
Use the correct analyzer, 
Construct the right query, 
Analyze the results with your users, 
Explain the results using explain/validate and improve. 
48: Questions 
I am here the whole day 
Place holder sheet that can be used during the questions moment. 
jettro.coenradie@luminis.eu 
@jettroCoenradie 
https://github.com/jettro/preso-explain 
http://localhost:9200/_plugin/preso/#/print Page 42 of 42

More Related Content

What's hot

The Django Book chapter 4 templates (supplement)
The Django Book chapter 4 templates (supplement)The Django Book chapter 4 templates (supplement)
The Django Book chapter 4 templates (supplement)Vincent Chien
 
The First C# Project Analyzed
The First C# Project AnalyzedThe First C# Project Analyzed
The First C# Project AnalyzedPVS-Studio
 
Java 例外處理壞味道與重構技術
Java 例外處理壞味道與重構技術Java 例外處理壞味道與重構技術
Java 例外處理壞味道與重構技術teddysoft
 
Analysis of Godot Engine's Source Code
Analysis of Godot Engine's Source CodeAnalysis of Godot Engine's Source Code
Analysis of Godot Engine's Source CodePVS-Studio
 
Back to basics - PHP_Codesniffer
Back to basics - PHP_CodesnifferBack to basics - PHP_Codesniffer
Back to basics - PHP_CodesnifferSebastian Marek
 
Object Oriented Design Patterns for PHP
Object Oriented Design Patterns for PHPObject Oriented Design Patterns for PHP
Object Oriented Design Patterns for PHPRobertGonzalez
 
PhpUnit Best Practices
PhpUnit Best PracticesPhpUnit Best Practices
PhpUnit Best PracticesEdorian
 
Review unknown code with static analysis - bredaphp
Review unknown code with static analysis - bredaphpReview unknown code with static analysis - bredaphp
Review unknown code with static analysis - bredaphpDamien Seguy
 
React mit TypeScript – eine glückliche Ehe
React mit TypeScript – eine glückliche EheReact mit TypeScript – eine glückliche Ehe
React mit TypeScript – eine glückliche Eheinovex GmbH
 
Bowtie: Interactive Dashboards
Bowtie: Interactive DashboardsBowtie: Interactive Dashboards
Bowtie: Interactive DashboardsJacques Kvam
 
Testing the frontend
Testing the frontendTesting the frontend
Testing the frontendHeiko Hardt
 
Unit testing with PHPUnit - there's life outside of TDD
Unit testing with PHPUnit - there's life outside of TDDUnit testing with PHPUnit - there's life outside of TDD
Unit testing with PHPUnit - there's life outside of TDDPaweł Michalik
 
Concurrency in Elixir with OTP
Concurrency in Elixir with OTPConcurrency in Elixir with OTP
Concurrency in Elixir with OTPJustin Reese
 

What's hot (17)

TDD, BDD, RSpec
TDD, BDD, RSpecTDD, BDD, RSpec
TDD, BDD, RSpec
 
The Django Book chapter 4 templates (supplement)
The Django Book chapter 4 templates (supplement)The Django Book chapter 4 templates (supplement)
The Django Book chapter 4 templates (supplement)
 
Clean Code
Clean CodeClean Code
Clean Code
 
The First C# Project Analyzed
The First C# Project AnalyzedThe First C# Project Analyzed
The First C# Project Analyzed
 
Java 例外處理壞味道與重構技術
Java 例外處理壞味道與重構技術Java 例外處理壞味道與重構技術
Java 例外處理壞味道與重構技術
 
Analysis of Godot Engine's Source Code
Analysis of Godot Engine's Source CodeAnalysis of Godot Engine's Source Code
Analysis of Godot Engine's Source Code
 
Back to basics - PHP_Codesniffer
Back to basics - PHP_CodesnifferBack to basics - PHP_Codesniffer
Back to basics - PHP_Codesniffer
 
Object Oriented Design Patterns for PHP
Object Oriented Design Patterns for PHPObject Oriented Design Patterns for PHP
Object Oriented Design Patterns for PHP
 
PhpUnit Best Practices
PhpUnit Best PracticesPhpUnit Best Practices
PhpUnit Best Practices
 
Pruning your code
Pruning your codePruning your code
Pruning your code
 
Review unknown code with static analysis - bredaphp
Review unknown code with static analysis - bredaphpReview unknown code with static analysis - bredaphp
Review unknown code with static analysis - bredaphp
 
React mit TypeScript – eine glückliche Ehe
React mit TypeScript – eine glückliche EheReact mit TypeScript – eine glückliche Ehe
React mit TypeScript – eine glückliche Ehe
 
Bowtie: Interactive Dashboards
Bowtie: Interactive DashboardsBowtie: Interactive Dashboards
Bowtie: Interactive Dashboards
 
TDD with PhpSpec
TDD with PhpSpecTDD with PhpSpec
TDD with PhpSpec
 
Testing the frontend
Testing the frontendTesting the frontend
Testing the frontend
 
Unit testing with PHPUnit - there's life outside of TDD
Unit testing with PHPUnit - there's life outside of TDDUnit testing with PHPUnit - there's life outside of TDD
Unit testing with PHPUnit - there's life outside of TDD
 
Concurrency in Elixir with OTP
Concurrency in Elixir with OTPConcurrency in Elixir with OTP
Concurrency in Elixir with OTP
 

Similar to Returning the right results - Jettro Coenradie

Sql interview question part 8
Sql interview question part 8Sql interview question part 8
Sql interview question part 8kaashiv1
 
En2308 i web b2c integration guide
En2308 i web b2c integration guideEn2308 i web b2c integration guide
En2308 i web b2c integration guideHeo Gòm
 
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010singingfish
 
PVS-Studio and CppCat: An Interview with Andrey Karpov, the Project CTO and D...
PVS-Studio and CppCat: An Interview with Andrey Karpov, the Project CTO and D...PVS-Studio and CppCat: An Interview with Andrey Karpov, the Project CTO and D...
PVS-Studio and CppCat: An Interview with Andrey Karpov, the Project CTO and D...Andrey Karpov
 
Lessons from running AppSync in prod
Lessons from running AppSync in prodLessons from running AppSync in prod
Lessons from running AppSync in prodYan Cui
 
JavaOne 2015 Devops and the Darkside CON6447
JavaOne 2015 Devops and the Darkside CON6447JavaOne 2015 Devops and the Darkside CON6447
JavaOne 2015 Devops and the Darkside CON6447Steve Poole
 
What's new in VisibleThread 2.14
What's new in VisibleThread 2.14 What's new in VisibleThread 2.14
What's new in VisibleThread 2.14 VisibleThread
 
Aspect-oriented programming in Perl
Aspect-oriented programming in PerlAspect-oriented programming in Perl
Aspect-oriented programming in Perlmegakott
 
Part 1 implementing a simple_web_service
Part 1 implementing a simple_web_servicePart 1 implementing a simple_web_service
Part 1 implementing a simple_web_servicekrishmdkk
 
The ultimate-guide-to-sql
The ultimate-guide-to-sqlThe ultimate-guide-to-sql
The ultimate-guide-to-sqlMcNamaraChiwaye
 
OSMC 2023 | Experiments with OpenSearch and AI by Jochen Kressin & Leanne La...
OSMC 2023 | Experiments with OpenSearch and AI by Jochen Kressin &  Leanne La...OSMC 2023 | Experiments with OpenSearch and AI by Jochen Kressin &  Leanne La...
OSMC 2023 | Experiments with OpenSearch and AI by Jochen Kressin & Leanne La...NETWAYS
 
MKT 100Week 6 Assignment{Enter Student Name Here}{Enter Bu.docx
MKT 100Week 6 Assignment{Enter Student Name Here}{Enter Bu.docxMKT 100Week 6 Assignment{Enter Student Name Here}{Enter Bu.docx
MKT 100Week 6 Assignment{Enter Student Name Here}{Enter Bu.docxkendalfarrier
 
War of the Machines: PVS-Studio vs. TensorFlow
War of the Machines: PVS-Studio vs. TensorFlowWar of the Machines: PVS-Studio vs. TensorFlow
War of the Machines: PVS-Studio vs. TensorFlowPVS-Studio
 
Demystifying dot NET reverse engineering - Part1
Demystifying  dot NET reverse engineering - Part1Demystifying  dot NET reverse engineering - Part1
Demystifying dot NET reverse engineering - Part1Soufiane Tahiri
 
Contact management system
Contact management systemContact management system
Contact management systemSHARDA SHARAN
 

Similar to Returning the right results - Jettro Coenradie (20)

Graphql
GraphqlGraphql
Graphql
 
Sql interview question part 8
Sql interview question part 8Sql interview question part 8
Sql interview question part 8
 
Ebook8
Ebook8Ebook8
Ebook8
 
En2308 i web b2c integration guide
En2308 i web b2c integration guideEn2308 i web b2c integration guide
En2308 i web b2c integration guide
 
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
Don't RTFM, WTFM - Open Source Documentation - German Perl Workshop 2010
 
PVS-Studio and CppCat: An Interview with Andrey Karpov, the Project CTO and D...
PVS-Studio and CppCat: An Interview with Andrey Karpov, the Project CTO and D...PVS-Studio and CppCat: An Interview with Andrey Karpov, the Project CTO and D...
PVS-Studio and CppCat: An Interview with Andrey Karpov, the Project CTO and D...
 
Soa8
Soa8Soa8
Soa8
 
Learning selenium sample
Learning selenium sampleLearning selenium sample
Learning selenium sample
 
Lessons from running AppSync in prod
Lessons from running AppSync in prodLessons from running AppSync in prod
Lessons from running AppSync in prod
 
JavaOne 2015 Devops and the Darkside CON6447
JavaOne 2015 Devops and the Darkside CON6447JavaOne 2015 Devops and the Darkside CON6447
JavaOne 2015 Devops and the Darkside CON6447
 
What's new in VisibleThread 2.14
What's new in VisibleThread 2.14 What's new in VisibleThread 2.14
What's new in VisibleThread 2.14
 
Aspect-oriented programming in Perl
Aspect-oriented programming in PerlAspect-oriented programming in Perl
Aspect-oriented programming in Perl
 
Part 1 implementing a simple_web_service
Part 1 implementing a simple_web_servicePart 1 implementing a simple_web_service
Part 1 implementing a simple_web_service
 
The ultimate-guide-to-sql
The ultimate-guide-to-sqlThe ultimate-guide-to-sql
The ultimate-guide-to-sql
 
OSMC 2023 | Experiments with OpenSearch and AI by Jochen Kressin & Leanne La...
OSMC 2023 | Experiments with OpenSearch and AI by Jochen Kressin &  Leanne La...OSMC 2023 | Experiments with OpenSearch and AI by Jochen Kressin &  Leanne La...
OSMC 2023 | Experiments with OpenSearch and AI by Jochen Kressin & Leanne La...
 
MKT 100Week 6 Assignment{Enter Student Name Here}{Enter Bu.docx
MKT 100Week 6 Assignment{Enter Student Name Here}{Enter Bu.docxMKT 100Week 6 Assignment{Enter Student Name Here}{Enter Bu.docx
MKT 100Week 6 Assignment{Enter Student Name Here}{Enter Bu.docx
 
War of the Machines: PVS-Studio vs. TensorFlow
War of the Machines: PVS-Studio vs. TensorFlowWar of the Machines: PVS-Studio vs. TensorFlow
War of the Machines: PVS-Studio vs. TensorFlow
 
Demystifying dot NET reverse engineering - Part1
Demystifying  dot NET reverse engineering - Part1Demystifying  dot NET reverse engineering - Part1
Demystifying dot NET reverse engineering - Part1
 
Contact management system
Contact management systemContact management system
Contact management system
 
clicks2conversations.pdf
clicks2conversations.pdfclicks2conversations.pdf
clicks2conversations.pdf
 

More from NLJUG

The future of Web-Scale - Johan Tillema, Rene Boere & Chris Quach
The future of Web-Scale - Johan Tillema, Rene Boere & Chris QuachThe future of Web-Scale - Johan Tillema, Rene Boere & Chris Quach
The future of Web-Scale - Johan Tillema, Rene Boere & Chris QuachNLJUG
 
Speedy perception trumps speedy reception–smart asynchronous interactions - L...
Speedy perception trumps speedy reception–smart asynchronous interactions - L...Speedy perception trumps speedy reception–smart asynchronous interactions - L...
Speedy perception trumps speedy reception–smart asynchronous interactions - L...NLJUG
 
Decoding the airspace above you with Java and $7 hardware - Bert Jan Schrijver
Decoding the airspace above you with Java and $7 hardware - Bert Jan SchrijverDecoding the airspace above you with Java and $7 hardware - Bert Jan Schrijver
Decoding the airspace above you with Java and $7 hardware - Bert Jan SchrijverNLJUG
 
Using Docker to Develop, Test and Run Maven Projects - Wouter Danes
Using Docker to Develop, Test and Run Maven Projects - Wouter DanesUsing Docker to Develop, Test and Run Maven Projects - Wouter Danes
Using Docker to Develop, Test and Run Maven Projects - Wouter DanesNLJUG
 
Kill the mutants and test your tests - Roy van Rijn
Kill the mutants and test your tests - Roy van RijnKill the mutants and test your tests - Roy van Rijn
Kill the mutants and test your tests - Roy van RijnNLJUG
 
Real-time user interfaces - sosm gewoon makkelijker - Allard Buijze
Real-time user interfaces - sosm gewoon makkelijker - Allard BuijzeReal-time user interfaces - sosm gewoon makkelijker - Allard Buijze
Real-time user interfaces - sosm gewoon makkelijker - Allard BuijzeNLJUG
 
The end of traditional enterprise IT - ING's journey to the next generation I...
The end of traditional enterprise IT - ING's journey to the next generation I...The end of traditional enterprise IT - ING's journey to the next generation I...
The end of traditional enterprise IT - ING's journey to the next generation I...NLJUG
 
Performance van Java 8 en verder - Jeroen Borgers
Performance van Java 8 en verder - Jeroen BorgersPerformance van Java 8 en verder - Jeroen Borgers
Performance van Java 8 en verder - Jeroen BorgersNLJUG
 
Introduction to Reactive with Play and Akka - Markus Jura
Introduction to Reactive with Play and Akka - Markus JuraIntroduction to Reactive with Play and Akka - Markus Jura
Introduction to Reactive with Play and Akka - Markus JuraNLJUG
 
Web-scale op basis van Hadoop en Akka Reactive Streams - Johan Tillema, Rene ...
Web-scale op basis van Hadoop en Akka Reactive Streams - Johan Tillema, Rene ...Web-scale op basis van Hadoop en Akka Reactive Streams - Johan Tillema, Rene ...
Web-scale op basis van Hadoop en Akka Reactive Streams - Johan Tillema, Rene ...NLJUG
 
Workshop angular dart presentatie - Atos
Workshop angular dart presentatie - AtosWorkshop angular dart presentatie - Atos
Workshop angular dart presentatie - AtosNLJUG
 
Workshop spring boot presentatie - Atos
Workshop spring boot presentatie - AtosWorkshop spring boot presentatie - Atos
Workshop spring boot presentatie - AtosNLJUG
 
Cultivating the jenkins job jungle with groovy - Patrick van Dissel
Cultivating the jenkins job jungle with groovy - Patrick van DisselCultivating the jenkins job jungle with groovy - Patrick van Dissel
Cultivating the jenkins job jungle with groovy - Patrick van DisselNLJUG
 
Rethink your architecture - Marten Deinum
Rethink your architecture - Marten DeinumRethink your architecture - Marten Deinum
Rethink your architecture - Marten DeinumNLJUG
 
Evolutionary Algorithms: the key to solving complex Java puzzles! - Bas knopper
Evolutionary Algorithms: the key to solving complex Java puzzles! - Bas knopperEvolutionary Algorithms: the key to solving complex Java puzzles! - Bas knopper
Evolutionary Algorithms: the key to solving complex Java puzzles! - Bas knopperNLJUG
 
Modularity and Domain Driven Design; a killer Combination? - Tom de Wolf & St...
Modularity and Domain Driven Design; a killer Combination? - Tom de Wolf & St...Modularity and Domain Driven Design; a killer Combination? - Tom de Wolf & St...
Modularity and Domain Driven Design; a killer Combination? - Tom de Wolf & St...NLJUG
 
Apache Wicket: 10 jaar en verder - Martijn Dashorst
Apache Wicket: 10 jaar en verder - Martijn DashorstApache Wicket: 10 jaar en verder - Martijn Dashorst
Apache Wicket: 10 jaar en verder - Martijn DashorstNLJUG
 
Opening - Bert Ertman
Opening - Bert ErtmanOpening - Bert Ertman
Opening - Bert ErtmanNLJUG
 
Reactive programming met Java 8 en Java EE 7 - Martijn Blankestijn
Reactive programming met Java 8 en Java EE 7 - Martijn BlankestijnReactive programming met Java 8 en Java EE 7 - Martijn Blankestijn
Reactive programming met Java 8 en Java EE 7 - Martijn BlankestijnNLJUG
 
Event-sourced architectures with Akka - Sander Mak
Event-sourced architectures with Akka - Sander MakEvent-sourced architectures with Akka - Sander Mak
Event-sourced architectures with Akka - Sander MakNLJUG
 

More from NLJUG (20)

The future of Web-Scale - Johan Tillema, Rene Boere & Chris Quach
The future of Web-Scale - Johan Tillema, Rene Boere & Chris QuachThe future of Web-Scale - Johan Tillema, Rene Boere & Chris Quach
The future of Web-Scale - Johan Tillema, Rene Boere & Chris Quach
 
Speedy perception trumps speedy reception–smart asynchronous interactions - L...
Speedy perception trumps speedy reception–smart asynchronous interactions - L...Speedy perception trumps speedy reception–smart asynchronous interactions - L...
Speedy perception trumps speedy reception–smart asynchronous interactions - L...
 
Decoding the airspace above you with Java and $7 hardware - Bert Jan Schrijver
Decoding the airspace above you with Java and $7 hardware - Bert Jan SchrijverDecoding the airspace above you with Java and $7 hardware - Bert Jan Schrijver
Decoding the airspace above you with Java and $7 hardware - Bert Jan Schrijver
 
Using Docker to Develop, Test and Run Maven Projects - Wouter Danes
Using Docker to Develop, Test and Run Maven Projects - Wouter DanesUsing Docker to Develop, Test and Run Maven Projects - Wouter Danes
Using Docker to Develop, Test and Run Maven Projects - Wouter Danes
 
Kill the mutants and test your tests - Roy van Rijn
Kill the mutants and test your tests - Roy van RijnKill the mutants and test your tests - Roy van Rijn
Kill the mutants and test your tests - Roy van Rijn
 
Real-time user interfaces - sosm gewoon makkelijker - Allard Buijze
Real-time user interfaces - sosm gewoon makkelijker - Allard BuijzeReal-time user interfaces - sosm gewoon makkelijker - Allard Buijze
Real-time user interfaces - sosm gewoon makkelijker - Allard Buijze
 
The end of traditional enterprise IT - ING's journey to the next generation I...
The end of traditional enterprise IT - ING's journey to the next generation I...The end of traditional enterprise IT - ING's journey to the next generation I...
The end of traditional enterprise IT - ING's journey to the next generation I...
 
Performance van Java 8 en verder - Jeroen Borgers
Performance van Java 8 en verder - Jeroen BorgersPerformance van Java 8 en verder - Jeroen Borgers
Performance van Java 8 en verder - Jeroen Borgers
 
Introduction to Reactive with Play and Akka - Markus Jura
Introduction to Reactive with Play and Akka - Markus JuraIntroduction to Reactive with Play and Akka - Markus Jura
Introduction to Reactive with Play and Akka - Markus Jura
 
Web-scale op basis van Hadoop en Akka Reactive Streams - Johan Tillema, Rene ...
Web-scale op basis van Hadoop en Akka Reactive Streams - Johan Tillema, Rene ...Web-scale op basis van Hadoop en Akka Reactive Streams - Johan Tillema, Rene ...
Web-scale op basis van Hadoop en Akka Reactive Streams - Johan Tillema, Rene ...
 
Workshop angular dart presentatie - Atos
Workshop angular dart presentatie - AtosWorkshop angular dart presentatie - Atos
Workshop angular dart presentatie - Atos
 
Workshop spring boot presentatie - Atos
Workshop spring boot presentatie - AtosWorkshop spring boot presentatie - Atos
Workshop spring boot presentatie - Atos
 
Cultivating the jenkins job jungle with groovy - Patrick van Dissel
Cultivating the jenkins job jungle with groovy - Patrick van DisselCultivating the jenkins job jungle with groovy - Patrick van Dissel
Cultivating the jenkins job jungle with groovy - Patrick van Dissel
 
Rethink your architecture - Marten Deinum
Rethink your architecture - Marten DeinumRethink your architecture - Marten Deinum
Rethink your architecture - Marten Deinum
 
Evolutionary Algorithms: the key to solving complex Java puzzles! - Bas knopper
Evolutionary Algorithms: the key to solving complex Java puzzles! - Bas knopperEvolutionary Algorithms: the key to solving complex Java puzzles! - Bas knopper
Evolutionary Algorithms: the key to solving complex Java puzzles! - Bas knopper
 
Modularity and Domain Driven Design; a killer Combination? - Tom de Wolf & St...
Modularity and Domain Driven Design; a killer Combination? - Tom de Wolf & St...Modularity and Domain Driven Design; a killer Combination? - Tom de Wolf & St...
Modularity and Domain Driven Design; a killer Combination? - Tom de Wolf & St...
 
Apache Wicket: 10 jaar en verder - Martijn Dashorst
Apache Wicket: 10 jaar en verder - Martijn DashorstApache Wicket: 10 jaar en verder - Martijn Dashorst
Apache Wicket: 10 jaar en verder - Martijn Dashorst
 
Opening - Bert Ertman
Opening - Bert ErtmanOpening - Bert Ertman
Opening - Bert Ertman
 
Reactive programming met Java 8 en Java EE 7 - Martijn Blankestijn
Reactive programming met Java 8 en Java EE 7 - Martijn BlankestijnReactive programming met Java 8 en Java EE 7 - Martijn Blankestijn
Reactive programming met Java 8 en Java EE 7 - Martijn Blankestijn
 
Event-sourced architectures with Akka - Sander Mak
Event-sourced architectures with Akka - Sander MakEvent-sourced architectures with Akka - Sander Mak
Event-sourced architectures with Akka - Sander Mak
 

Recently uploaded

CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistandanishmna97
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Victor Rentea
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontologyjohnbeverley2021
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAnitaRaj43
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard37
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKJago de Vreede
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Orbitshub
 

Recently uploaded (20)

CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by Anitaraj
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptx
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 

Returning the right results - Jettro Coenradie

  • 1. Explain explained 05/11/14 11:56 Summary 1: Getting the right results Jettro Coenradie This presentation is about getting the right results from elasticsearch. There are a lot of things that you can do to improve the results you get back from elasticsearch. You will get an introduction into different kind of queries that you can use, the impact of analysers on results and we take a deep dive into the explain functionality. Using the explain functionality you can find out why one document is matching better than another. http://localhost:9200/_plugin/preso/#/print Page 1 of 42
  • 2. Explain explained 05/11/14 11:56 Returning the right results @jettroCoenradie http://localhost:9200/_plugin/preso/#/print Page 2 of 42
  • 3. Explain explained 05/11/14 11:56 2: About me how to contact me My name is Jettro Coenradie, I am the follow of Luminis Amsterdam. My specialty is search solutions and specifically elasticsearch. You can follow me on twitter, linkedin and my code is on github. email jettro.coenradie@luminis.eu twitter @jettroCoenradie linkedin https://www.linkedin.com/in/jettro Github https://github.com/jettro Blog http://www.gridshore.nl 3: The right results what are they? How would you define the right results. Of course a lot depends on the context of the asked question. Like always you need to find the term on wikipedia to get your first explanation. How would you explain The right results? 4: The right results according to wikipedia Every presentation has to start with wikipedia. To bad there is no page for the right results, but there is an interesting link to be found. This shows an excerpt from the toyota way. The right process will produce the right results. http://localhost:9200/_plugin/preso/#/print Page 3 of 42
  • 4. Explain explained 05/11/14 11:56 This is also true for returning the right results using elasticsearch. During this presentation the right process will become clear. 5: What is elasticsearch? more than search Before we can start explaining why elasticsearch returns the results that it does, you first need to know more about what elasticsearch is, what it can do for you and some terminology used though out the remainder of the presentation. You will learn about structured and unstructured data, data sources and how we use the data. http://localhost:9200/_plugin/preso/#/print Page 4 of 42
  • 5. Explain explained 05/11/14 11:56 http://localhost:9200/_plugin/preso/#/print Page 5 of 42
  • 6. Explain explained 05/11/14 11:56 http://localhost:9200/_plugin/preso/#/print Page 6 of 42
  • 7. Explain explained 05/11/14 11:56 6: Lucene what we need it for http://localhost:9200/_plugin/preso/#/print Page 7 of 42
  • 8. Explain explained 05/11/14 11:56 Introduce lucene, explain we use analyzers to create terms, the terms are stored in an inverted index and the inverted index is used to search the terms. Create terms, Store terms, Search terms. 7: Elasticsearch and lucene cluster, index, shards, lucene In here I want to explain the different components of an elasticsearch cluster. I am showing images containing the structure of these components. A cluster contains multiple nodes. Each nodes contains shards of multiple indices. Each shard is a lucene index. http://localhost:9200/_plugin/preso/#/print Page 8 of 42
  • 9. Explain explained 05/11/14 11:56 http://localhost:9200/_plugin/preso/#/print Page 9 of 42
  • 10. Explain explained 05/11/14 11:56 8: Executing a query calling all shards In this slide I am explaining what happens when you execute a query. You will learn that we first execute a query that is send to all shards by the client. The results are gathered and merged and if the right set of documents is created the actual required documents are fetched. http://localhost:9200/_plugin/preso/#/print Page 10 of 42
  • 11. Explain explained 05/11/14 11:56 http://localhost:9200/_plugin/preso/#/print Page 11 of 42
  • 12. Explain explained 05/11/14 11:56 http://localhost:9200/_plugin/preso/#/print Page 12 of 42
  • 13. Explain explained 05/11/14 11:56 9: Executing a query basic concepts http://localhost:9200/_plugin/preso/#/print Page 13 of 42
  • 14. Explain explained 05/11/14 11:56 This slide shows the both the apis that elasticsearch provideds. You can execute queries using the java api or the rest api through one of the available drivers. No matter what mechanism you choose you can use a lot of different queries. http://localhost:9200/_plugin/preso/#/print Page 14 of 42
  • 15. Explain explained 05/11/14 11:56 10: Example with curl find all docs In this slide we present you the most basic match all docs query using curl. http://localhost:9200/_plugin/preso/#/print Page 15 of 42
  • 16. Explain explained 05/11/14 11:56 11: Other query tools there are a lot Some examples of other query tools that are available. http://localhost:9200/_plugin/preso/#/print Page 16 of 42
  • 17. Explain explained 05/11/14 11:56 http://localhost:9200/_plugin/preso/#/print Page 17 of 42
  • 18. Explain explained 05/11/14 11:56 http://localhost:9200/_plugin/preso/#/print Page 18 of 42
  • 19. Explain explained 05/11/14 11:56 12: Execute query basic match query This is the most basic variant of executing a query. GET /slides/_search { "query": { "match": { "description": "What you type!" } } } Results only in life presentation 13: The calculated score use the explain api Here we are going to discuss the most basic explain you can get. GET /slides/_search?explain http://localhost:9200/_plugin/preso/#/print Page 19 of 42
  • 20. Explain explained 05/11/14 11:56 { "query": { "match": { "description": "What you type!" } } } Results only in life presentation 14: Explain query explained the basics In this slide I am going to show details about the explain basics. This is important to notice the pattern that all explain queries will have for every term that is matched. http://localhost:9200/_plugin/preso/#/print Page 20 of 42
  • 21. Explain explained 05/11/14 11:56 http://localhost:9200/_plugin/preso/#/print Page 21 of 42
  • 22. Explain explained 05/11/14 11:56 http://localhost:9200/_plugin/preso/#/print Page 22 of 42
  • 23. Explain explained 05/11/14 11:56 15: Calculating score the theory In this slide we are going to explain the theory behind creating score using simulariry algorithms. Score is calculated for matching documents (Boolean Model), Score represents similarity between search and document terms, Lucene uses enhanced TF/IDF (coordination factor and field length), Other algorithms can be used: Okapi BM25 16: Lucene similarity formula Shows the formula used by lucene to calculate the score. http://localhost:9200/_plugin/preso/#/print Page 23 of 42
  • 24. Explain explained 05/11/14 11:56 https://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/similarities/17: Calculating score the terms This slide gives an overview of the most important definitions for calculating the score. queryNorm Attempt to make different queries comparable. coord Factor for total score based on amount of queried and found terms Term frequency Amount of times a term is matched in the field Inverse document amount of documents that have the term frequency fieldNorm Length of the field the terms was found in boost Boost a field score 18: An explain example using match query In this slide we are going to use a very simple match query with an index containing only three documents. The goal is to show the effect on term frequency, inverse document frequency and the fieldnorm with very little documents in the index. Show tf/idf/fieldNorm and score Doc 1 Doc 2 Doc 3 http://localhost:9200/_plugin/preso/#/print Page 24 of 42
  • 25. Explain explained 05/11/14 11:56 one two three two three three one 1 / 1 / 0.5 0.702 two 1 / 2 / 0.5 1 / 2 / 0.625 0.5 0.625 three 1 / 3 / 0.5 1 / 3 / 0.625 1 / 3 / 1 0.356 0.445 0.712 19: Explain multiple terms with a trick Here we are going to shows what happens to the results when using capital letters, multipe terms and introduce the camel case analyzer. GET /onetwothree/_search?explain Results only in life presentation 20: What is an analyzer the parts Explain what the different components of an analyzer are. Character filters Tidy up the string before tokenising. Tokeniser Splits the string into a number of tokens Token filters Do something with the tokens 21: One Two Three Analyzer settings http://localhost:9200/_plugin/preso/#/print Page 25 of 42
  • 26. Explain explained 05/11/14 11:56 Show the settings part of the analyzer as used in the onetwothree sample with the camel case. GET /onetwothree/_settings Results only in life presentation 22: One Two Three Analyzer mappings Show the mappings part of the analyzer as used in the onetwothree sample with the camel case. GET /onetwothree/_mappings Results only in life presentation 23: One Two Three Analyzer analyze api Test the analyzer using the analyze api. GET /onetwothree/_analyze?analyzer=camel&text=OneTwoThree Results only in life presentation 24: Back to explain recap single term In this slide we get back to the explain api, from the image with the real explain output we introduce a short notation. GET /slides/_search?explain http://localhost:9200/_plugin/preso/#/print Page 26 of 42
  • 27. Explain explained 05/11/14 11:56 { "query": { "match": { "description": "basic" } } } structure of the score calculation description:basic [*] tf / idf / fieldNorm 25: Validate query http://localhost:9200/_plugin/preso/#/print Page 27 of 42
  • 28. Explain explained 05/11/14 11:56 using validate api In this slide we are going to demonstrate the validate api for a query using multiple terms. POST /slides/_validate/query?explain 26: Validate query using validate api In this slide we are going to demonstrate the validate api for a query using multiple terms using the and operator. POST /slides/_validate/query?explain 27: Bool query the base for all queries Introduce the bool query as the base query to all other queries. In the end all queries can be written as a bool query. Explain the difference between operator AND/OR. { "query": { "bool": { "must": [ {} ], "must_not": [ {} ], "should": [ {} ] } } } 28: Boolean model http://localhost:9200/_plugin/preso/#/print Page 28 of 42
  • 29. Explain explained 05/11/14 11:56 must, must_not and should In this slide we are going to explain the transformation of all queries into a bool query. { "query": { "match": { "description": "basic search elasticsearch" } } } { "query": { "bool": { "should": [ { "term": { "description": { "value": "basic" } } }, { "term": { "description": { "value": "search" } } }, { "term": { "description": { "value": "elasticsearch" } } } ] } } } http://localhost:9200/_plugin/preso/#/print Page 29 of 42
  • 30. Explain explained 05/11/14 11:56 29: Explain 2 terms match with 2 Now we are going to show the short notation for the explaination of a query with two terms due to a standard analyzer. GET /slides/_search?explain { "query": { "match": { "description": "basic search" } } } structure of the score calculation [*] [+] description:basic coord (1/2) 30: Explain 3 terms match with 3 Now we are going to show the short notation for the explaination of a query with three terms due to a standard analyzer. GET /slides/_search?explain http://localhost:9200/_plugin/preso/#/print Page 30 of 42
  • 31. Explain explained 05/11/14 11:56 { "query": { "match": { "description": "basic search elasticsearch" } } } structure of the score calculation [*] [+] description:basic description:elasticsearch coord (2/3) 31: Validate query using validate api In this slide we are going to demonstrate the validate api for a query using multiple terms and multiple fields with the default best_fields type query. POST /slides/_validate/query?explain 32: Validate query using validate api In this slide we are going to demonstrate the validate api for a query using multiple terms and multiple fields with the most_fields type query. POST /slides/_validate/query?explain 33: Validate query http://localhost:9200/_plugin/preso/#/print Page 31 of 42
  • 32. Explain explained 05/11/14 11:56 using validate api In this slide we are going to demonstrate the validate api for a query using multiple terms and multiple fields with the cross_fields type query. POST /slides/_validate/query?explain 34: Explain multi_field best_fields Show the effect of a multi_field query using the default best_fields type. GET /slides/_search?explain { "query": { "multi_match": { "query": "basic query", "fields": [ "title", "description" ], "type": "best_fields" } } } structure of the score calculation [max_of] [+] description:basic description:query [*] [+] title:query http://localhost:9200/_plugin/preso/#/print Page 32 of 42
  • 33. Explain explained 05/11/14 11:56 coord (1/2) 35: Explain multi_field most_fields Show the effect of a multi_field query using the most_fields type. GET /slides/_search?explain { "query": { "multi_match": { "query": "basic query", "fields": [ "title", "description" ], "type": "most_fields" } } } structure of the score calculation [sum_of] [+] description:basic description:query [*] [+] title:query coord (1/2) 36: Explain multi_field http://localhost:9200/_plugin/preso/#/print Page 33 of 42
  • 34. Explain explained 05/11/14 11:56 cross_fields Show the effect of a multi_field query using the cross_fields type. GET /slides/_search?explain { "query": { "multi_match": { "query": "basic query", "fields": [ "title", "description" ], "type": "cross_fields" } } } structure of the score calculation [sum_of] [max_of] description:basic [max_of] description:query title:query 37: Explain dis_max query use tie breaker Show the effect of a dis_max query which is a balance between cross_fields and best matching field. GET /slides/_search?explain http://localhost:9200/_plugin/preso/#/print Page 34 of 42
  • 35. Explain explained 05/11/14 11:56 { "query": { "dis_max": { "tie_breaker": 0.7, "boost": 1.2, "queries": [ { "match": { "description": "basic query" } }, { "match": { "title": "basic query" } } ] } } } structure of the score calculation [max_of + 0.7 [*] others] [+] description:basic description:query [*] [+] title:query coord (1/2) 38: Multile terms and fields summary http://localhost:9200/_plugin/preso/#/print Page 35 of 42
  • 36. Explain explained 05/11/14 11:56 Explain the different options we have for multi field queries and explain the differences when calculating the score. Best field returns the field with the highest score, Most fields adds the scores for the different fields, Cross fields treets all field as one big field and add maximum score for term, Dis max takes the best field and adds a part of the score of other fields 39: Boosting the basics In match queries you can apply a boost to a certain field. Important to notice is that the structure of the output of explain is not changing using this kind of boost. It is only the score that changes, the boost is reflected within the query norm of the explain. { "query": { "multi_match": { "query": "basic query", "fields": [ "title^5", "description" ] } } } No boost Title boost _score 0.729 0.312 description:basic 0.533 0.107 description:query 0.195 0.0391 description query norm 0.197 0.0394 title:query 0.624 0.624 http://localhost:9200/_plugin/preso/#/print Page 36 of 42
  • 37. Explain explained 05/11/14 11:56 coord (1/2) 0.5 0.5 40: Boosting query match with negative impact The most basic boosting, is boosting on a field basis. Sometimes you have other boosting requirements. One thing could be to give a negative boost to some term. Of course you can use the must_not in a bool query but this is different. In that situation you do not have a match, but we want a match just with a lower score if a certain term is available. Here we show that the negative term query adds no score but does give a penalty to the complete score. { "query": { "boosting": { "positive": { "term": { "description": { "value": "basic" } } }, "negative": { "term": { "description": { "value": "query" } } }, "negative_boost": 0.2 } } } http://localhost:9200/_plugin/preso/#/print Page 37 of 42
  • 38. Explain explained 05/11/14 11:56 41: Sorting results by score and ... In this slide I want to discuss the options you have for sorting results. Sort by score (the default), Sort by date, Sort by analyzed fields, GET /slides/_search http://localhost:9200/_plugin/preso/#/print Page 38 of 42
  • 39. Explain explained 05/11/14 11:56 { "query": { "match": { "description": "What you type!" } }, "sort": [ { "title.raw": { "order": "asc" } } ] } Results only in life presentation 42: Fuzzy query taking care of typos In here we are going to demonstrate the effect of fuzzy searching on the score. We are going to use the term basik which is wrong for all slides except this slide. Show what happens with the boost factor for documents with that match due to the fuzzy matching. 43: Fuzzy query explain score for match Explain why the score for the document with the fuzzy match is higher than the score for the exact match. Total score is a product of field and query weight. found term query weight field weight description:basic^0.8 0.36849 0.992109 description:basik 0.59356 0.51138 44: Fuzzy query http://localhost:9200/_plugin/preso/#/print Page 39 of 42
  • 40. Explain explained 05/11/14 11:56 enhance result with a signal Since we got the wrong document on top with the previous fuzzy query we now want to help improve the results with a Signal. A signal can help to change the score in a way you prefer. In this case we make the score higher if there is an exact match. 45: Fuzzy query explain score for match Explain why adding a signal query as a should query with a match query does change the order of the results. No match means a coord penalty. found term must (fuzzy) should (match) description:basik 0.26101 0.26101 description:basic^0.8 0.31438 * 0.5 (coord 1/2) 46: Function score query using popularity One query that is used a lot on news sites is the function_score query. With this query you can change the score based on another field like the popularity or recency. In this slide we discuss the effect on the explain output for such a query. GET /blogging/_search?explain http://localhost:9200/_plugin/preso/#/print Page 40 of 42
  • 41. Explain explained 05/11/14 11:56 { "query": { "function_score": { "query": { "match": { "description": "elasticsearch" } }, "functions": [ { "field_value_factor": { "field": "popularity", "factor": 1.2, "modifier": "ln" } } ] } } } structure of the score calculation function score [*] description:elasticsearch Math.min ln(doc[popularity].value * factor=1.2) maxBoost 47: Summarizing the take away Explain the right process to produce the right results. http://localhost:9200/_plugin/preso/#/print Page 41 of 42
  • 42. Explain explained 05/11/14 11:56 The right process to produce the right results. Use the correct analyzer, Construct the right query, Analyze the results with your users, Explain the results using explain/validate and improve. 48: Questions I am here the whole day Place holder sheet that can be used during the questions moment. jettro.coenradie@luminis.eu @jettroCoenradie https://github.com/jettro/preso-explain http://localhost:9200/_plugin/preso/#/print Page 42 of 42