SlideShare a Scribd company logo
Full-Text Search
Explained
Philipp Krenn @xeraa
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
Infrastructure | Developer Advocate
Who uses
Databases?
Who uses
Search?
Database
vs
Full-Text Search
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
But I can do...
SELECT *
FROM my_table
WHERE my_text LIKE ‘%my_term%’
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
1. Performance
B-Tree
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
2. Features
Fuzziness, synonyms, scoring,...
Store
Indexing
Remove formating
Indexing
Tokenize
Indexing
Stop words
Indexing
Stemming
http://snowballstem.org
Indexing
Synonyms
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
Apache Lucene
Elasticsearch
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
https://cloud.elastic.co
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
---
version: '2'
services:
kibana:
image: docker.elastic.co/kibana/kibana:5.2.2
links:
- elasticsearch
ports:
- 5601:5601
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:5.2.2
cap_add:
- IPC_LOCK
volumes:
- esdata1:/usr/share/elasticsearch/data
ports:
- 9200:9200
volumes:
esdata1:
driver: local
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
Example
These are <em>not</em> the droids you
are looking for.
html_strip Char Filter
These are not the droids you are looking
for.
standard Tokenizer
These are not the droids you are
looking for
lowercase Token Filter
these are not the droids you are
looking for
stop Token Filter
droids you looking
snowball Token Filter
droid you look
GET /_analyze
{
"analyzer": "english",
"text": "These are not the droids you are looking for."
}
{
"tokens": [
{
"token": "droid",
"start_offset": 18,
"end_offset": 24,
"type": "<ALPHANUM>",
"position": 4
},
{
"token": "you",
"start_offset": 25,
"end_offset": 28,
"type": "<ALPHANUM>",
"position": 5
},
...
]
}
GET /_analyze
{
"char_filter": [
"html_strip"
],
"tokenizer": "standard",
"filter": [
"lowercase",
"stop",
"snowball"
],
"text": "These are <em>not</em> the droids you are looking for."
}
{
"tokens": [
{
"token": "droid",
"start_offset": 27,
"end_offset": 33,
"type": "<ALPHANUM>",
"position": 4
},
{
"token": "you",
"start_offset": 34,
"end_offset": 37,
"type": "<ALPHANUM>",
"position": 5
},
...
]
}
Stop Words
a an and are as at be but by for if in into is
it no not of on or such that the their then
there these they this to was will with
https://github.com/apache/lucene-solr/blob/master/lucene/
core/src/java/org/apache/lucene/analysis/standard/
StandardAnalyzer.java#L44-L50
Italian
Questi non sono i droidi che state
cercando.
Italian
droid state cercand
GET /_analyze
{
"analyzer": "italian",
"text": "Questi non sono i droidi che state cercando."
}
{
"tokens": [
{
"token": "droid",
"start_offset": 18,
"end_offset": 24,
"type": "<ALPHANUM>",
"position": 4
},
{
"token": "state",
"start_offset": 29,
"end_offset": 34,
"type": "<ALPHANUM>",
"position": 6
},
...
]
}
Italian Stop Words
https://github.com/apache/lucene-solr/blob/master/lucene/
analysis/common/src/resources/org/apache/lucene/analysis/
snowball/italian_stop.txt
Italian with the English
Analyzer
questi non sono i droidi che
state cercand
Detecting Languages
https://github.com/spinscale/
elasticsearch-ingest-langdetect
Languages in 5.0
arabic, armenian, basque, brazilian, bulgarian, catalan, cjk,
czech, danish, dutch, english, finnish, french, galician, german,
greek, hindi, hungarian, indonesian, irish, italian, latvian,
lithuanian, norwegian, persian, portuguese, romanian, russian,
sorani, spanish, swedish, turkish, thai
Language Rules
English: Philipp's → philipp
French: l'église → eglis
German: äußerst → ausserst
Another Example
Obi-Wan never told you what happened to
your father.
Another Example
obi wan never told you what
happen your father
Another Example
<b>No</b>. I am your father.
Another Example
i am your father
Elasticsearch
Index, typ, mapping
Multi-Language Support
One language per index
One language per type
One language per field
PUT /starwars
{
"settings": {
"analysis": {
"filter": {
"my_synonym_filter": {
"type": "synonym",
"synonyms": [
"droid,machine",
"father,dad"
]
}
},
"analyzer": {
"my_analyzer": {
"char_filter": [
"html_strip"
],
"tokenizer": "standard",
"filter": [
"lowercase",
"stop",
"snowball",
"my_synonym_filter"
]
}
}
}
},
"mappings": {
"quotes": {
"properties": {
"quote": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
}
GET /starwars/_mapping
GET /starwars/_settings
PUT /starwars/quotes/1
{
"quote": "These are <em>not</em> the droids you are looking for."
}
PUT /starwars/quotes/2
{
"quote": "Obi-Wan never told you what happened to your father."
}
PUT /starwars/quotes/3
{
"quote": "<b>No</b>. I am your father."
}
GET /starwars/quotes/1
GET /starwars/quotes/1/_source
Inverted Index
ID 1 ID 2 ID 3
am 0 0 1[2]
droid 1[4] 0 0
father 0 1[9] 1[4]
happen 0 1[6] 0
i 0 0 1[1]
look 1[7] 0 0
never 0 1[2] 0
obi 0 1[0] 0
told 0 1[3] 0
wan 0 1[1] 0
what 0 1[5] 0
you 1[5] 1[4] 0
your 0 1[8] 1[3]
Search
POST /starwars/_search
{
"query": {
"match_all": { }
}
}
GET vs POST
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 1,
"hits": [
{
"_index": "starwars",
"_type": "my_type",
"_id": "2",
"_score": 1,
"_source": {
"quote": "Obi-Wan never told you what happened to your father."
}
},
...
POST /starwars/_search
{
"query": {
"match": {
"quote": "droid"
}
}
}
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.39556286,
"hits": [
{
"_index": "starwars",
"_type": "quotes",
"_id": "1",
"_score": 0.39556286,
"_source": {
"quote": "These are <em>not</em> the droids you are looking for."
}
}
]
}
}
POST /starwars/_search
{
"query": {
"match": {
"quote": "dad"
}
}
}
...
"hits": {
"total": 2,
"max_score": 0.41913947,
"hits": [
{
"_index": "starwars",
"_type": "quotes",
"_id": "3",
"_score": 0.41913947,
"_source": {
"quote": "<b>No</b>. I am your father."
}
},
{
"_index": "starwars",
"_type": "quotes",
"_id": "2",
"_score": 0.39291072,
"_source": {
"quote": "Obi-Wan never told you what happened to your father."
}
}
]
}
}
POST /starwars/_search
{
"query": {
"match_phrase": {
"quote": "I am your father"
}
}
}
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1.5665855,
"hits": [
{
"_index": "starwars",
"_type": "quotes",
"_id": "3",
"_score": 1.5665855,
"_source": {
"quote": "<b>No</b>. I am your father."
}
}
]
}
}
POST /starwars/_search
{
"query": {
"match_phrase": {
"quote": "I am not your father"
}
}
}
{
"took": 15,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
POST /starwars/_search
{
"query": {
"match_phrase": {
"quote": {
"query": "I am not your father",
"slop": 1
}
}
}
}
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1.0409548,
"hits": [
{
"_index": "starwars",
"_type": "quotes",
"_id": "3",
"_score": 1.0409548,
"_source": {
"quote": "<b>No</b>. I am your father."
}
}
]
}
}
POST /starwars/_search
{
"query": {
"match": {
"quote": {
"query": "van",
"fuzziness": "AUTO"
}
}
}
}
{
"took": 14,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.18155496,
"hits": [
{
"_index": "starwars",
"_type": "quotes",
"_id": "2",
"_score": 0.18155496,
"_source": {
"quote": "Obi-Wan never told you what happened to your father."
}
}
]
}
}
POST /starwars/_search
{
"query": {
"match": {
"quote": {
"query": "ovi-van",
"fuzziness": 1
}
}
}
}
{
"took": 109,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.3798467,
"hits": [
{
"_index": "starwars",
"_type": "quotes",
"_id": "2",
"_score": 0.3798467,
"_source": {
"quote": "Obi-Wan never told you what happened to your father."
}
}
]
}
}
FuzzyQuery History
http://blog.mikemccandless.com/2011/03/lucenes-fuzzyquery-is-100-times-faster.html
Before: Brute force
Now: Levenshtein Automaton
http://blog.notdot.net/2010/07/Damn-Cool-Algorithms-Levenshtein-Automata
SELECT *
FROM starwars
WHERE quote LIKE "?an" OR
quote LIKE "V?n" OR
quote LIKE "Va?"
Scoring
Term Frequency /
Inverse Document
Frequency (TF/IDF)
Search one term
BM25
Default in Elasticsearch 5.0
https://speakerdeck.com/elastic/improved-text-scoring-with-
bm25
Term Frequency
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
Inverse Document
Frequency
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
Field-Length Norm
Putting it Together
score(q,d) =
queryNorm(q)
· coord(q,d)
· ∑ (
tf(t in d)
· idf(t)²
· t.getBoost()
· norm(t,d)
) (t in q)
POST /starwars/_search?explain
{
"query": {
"match": {
"quote": "father"
}
}
}
...
"_explanation": {
"value": 0.41913947,
"description": "weight(Synonym(quote:dad quote:father) in 0) [PerFieldSimilarity], result of:",
"details": [
{
"value": 0.41913947,
"description": "score(doc=0,freq=2.0 = termFreq=2.0n), product of:",
"details": [
{
"value": 0.2876821,
"description": "idf(docFreq=1, docCount=1)",
"details": []
},
{
"value": 1.4569536,
"description": "tfNorm, computed from:",
"details": [
{
"value": 2,
"description": "termFreq=2.0",
"details": []
},
...
Score
0.41913947: i am your father
0.39291072: obi wan never told you
what happen your father
Vector Space Model
Search multiple terms
Score each term
Vectorize
Calculate angle
Search your father
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
Function Score
Script, weight, random, field value, decay
(geo or date)
POST /starwars/_search
{
"query": {
"function_score": {
"query": {
"match": {
"quote": "father"
}
},
"random_score": {}
}
}
}
Conclusion
Indexing
Formatting
Tokenize
Lowercase, Stop Words, Stemming
Synonyms
Scoring
Term Frequency
Inverse Document Frequency
Field-Length Norm
Vector Space Model
Grazie!
Questions?
Philipp Krenn @xeraa
PS: Stickers
More
POST /starwars/_search
{
"query": {
"match": {
"quote": "father"
}
},
"highlight": {
"pre_tags": [
"<tag>"
],
"post_tags": [
"</tag>"
],
"fields": {
"quote": {}
}
}
}
...
"hits": [
{
"_index": "starwars",
"_type": "quotes",
"_id": "3",
"_score": 0.41913947,
"_source": {
"quote": "<b>No</b>. I am your father."
},
"highlight": {
"quote": [
"<b>No</b>. I am your <tag>father</tag>."
]
}
},
...
Boolean Queries
must must_not should filter
POST /starwars/_search
{
"query": {
"bool": {
"must": {
"match": {
"quote": {
"query": "father"
}
}
},
"should": [
{
"match": {
"quote": {
"query": "your"
}
}
},
{
"match": {
"quote": {
"query": "obi"
}
}
}
]
}
}
}
...
"hits": {
"total": 2,
"max_score": 0.96268076,
"hits": [
{
"_index": "starwars",
"_type": "quotes",
"_id": "2",
"_score": 0.96268076,
"_source": {
"quote": "Obi-Wan never told you what happened to your father."
}
},
{
"_index": "starwars",
"_type": "quotes",
"_id": "3",
"_score": 0.73245656,
"_source": {
"quote": "<b>No</b>. I am your father."
}
}
]
}
}
POST /starwars/_search
{
"query": {
"bool": {
"filter": {
"match": {
"quote": {
"query": "father"
}
}
},
"should": [
{
"match": {
"quote": {
"query": "your"
}
}
},
{
"match": {
"quote": {
"query": "obi"
}
}
}
]
}
}
}
...
"hits": {
"total": 2,
"max_score": 0.56977004,
"hits": [
{
"_index": "starwars",
"_type": "quotes",
"_id": "2",
"_score": 0.56977004,
"_source": {
"quote": "Obi-Wan never told you what happened to your father."
}
},
{
"_index": "starwars",
"_type": "quotes",
"_id": "3",
"_score": 0.31331712,
"_source": {
"quote": "<b>No</b>. I am your father."
}
}
]
}
}
POST /starwars/_search
{
"query": {
"bool": {
"must": {
"match": {
"quote": {
"query": "father"
}
}
},
"should": [
{
"match": {
"quote": {
"query": "your"
}
}
},
{
"match": {
"quote": {
"query": "obi"
}
}
},
{
"match": {
"quote": {
"query": "droid"
}
}
}
],
"minimum_number_should_match": 2
}
}
}
...
"hits": {
"total": 1,
"max_score": 0.96268076,
"hits": [
{
"_index": "starwars",
"_type": "quotes",
"_id": "2",
"_score": 0.96268076,
"_source": {
"quote": "Obi-Wan never told you what happened to your father."
}
}
]
}
}
Boosting
Default 1 — greater or smaller
POST /starwars/_search
{
"query": {
"bool": {
"must": {
"match": {
"quote": {
"query": "father"
}
}
},
"should": [
{
"match": {
"quote": {
"query": "your"
}
}
},
{
"match": {
"quote": {
"query": "obi",
"boost": 3
}
}
}
]
}
}
}
...
"hits": {
"total": 2,
"max_score": 1.5324509,
"hits": [
{
"_index": "starwars",
"_type": "quotes",
"_id": "2",
"_score": 1.5324509,
"_source": {
"quote": "Obi-Wan never told you what happened to your father."
}
},
{
"_index": "starwars",
"_type": "quotes",
"_id": "3",
"_score": 0.73245656,
"_source": {
"quote": "<b>No</b>. I am your father."
}
}
]
}
}
Suggestion
Suggest a similar text
_search end point
_suggest deprecated
POST /starwars/_search
{
"query": {
"match": {
"quote": "fath"
}
},
"suggest": {
"my_suggestion" : {
"text" : "drui",
"term" : {
"field" : "quote"
}
}
}
}
...
"hits": {
"total": 0,
"max_score": null,
"hits": []
},
"suggest": {
"my_suggestion": [
{
"text": "drui",
"offset": 0,
"length": 4,
"options": [
{
"text": "droid",
"score": 0.5,
"freq": 1
}
]
}
]
}
}
NGram
Partial matches
Trigram
Edge Gram
GET /_analyze
{
"char_filter": [
"html_strip"
],
"tokenizer": {
"type": "ngram",
"min_gram": "3",
"max_gram": "3",
"token_chars": [
"letter"
]
},
"filter": [
"lowercase"
],
"text": "These are <em>not</em> the droids you are looking for."
}
{
"tokens": [
{
"token": "the",
"start_offset": 0,
"end_offset": 3,
"type": "word",
"position": 0
},
{
"token": "hes",
"start_offset": 1,
"end_offset": 4,
"type": "word",
"position": 1
},
{
"token": "ese",
"start_offset": 2,
"end_offset": 5,
"type": "word",
"position": 2
},
{
"token": "are",
"start_offset": 6,
"end_offset": 9,
"type": "word",
"position": 3
},
...
GET /_analyze
{
"char_filter": [
"html_strip"
],
"tokenizer": {
"type": "edge_ngram",
"min_gram": "1",
"max_gram": "3",
"token_chars": [
"letter"
]
},
"filter": [
"lowercase"
],
"text": "These are <em>not</em> the droids you are looking for."
}
{
"tokens": [
{
"token": "t",
"start_offset": 0,
"end_offset": 1,
"type": "word",
"position": 0
},
{
"token": "th",
"start_offset": 0,
"end_offset": 2,
"type": "word",
"position": 1
},
{
"token": "the",
"start_offset": 0,
"end_offset": 3,
"type": "word",
"position": 2
},
{
"token": "a",
"start_offset": 6,
"end_offset": 7,
"type": "word",
"position": 3
},
{
"token": "ar",
"start_offset": 6,
"end_offset": 8,
"type": "word",
"position": 4
},
...
Combining Analyzers
Reindex
Store multiple times
Combine scores
PUT /starwars_extended
{
"settings": {
"analysis": {
"filter": {
"my_synonym_filter": {
"type": "synonym",
"synonyms": [
"droid,machine",
"father,dad"
]
},
"my_ngram_filter": {
"type": "ngram",
"min_gram": "3",
"max_gram": "3",
"token_chars": [
"letter"
]
}
},
"analyzer": {
"my_lowercase_analyzer": {
"char_filter": [
"html_strip"
],
"tokenizer": "whitespace",
"filter": [
"lowercase"
]
},
"my_full_analyzer": {
"char_filter": [
"html_strip"
],
"tokenizer": "standard",
"filter": [
"lowercase",
"stop",
"snowball",
"my_synonym_filter"
]
},
"my_ngram_analyzer": {
"char_filter": [
"html_strip"
],
"tokenizer": "whitespace",
"filter": [
"lowercase",
"stop",
"my_ngram_filter"
]
}
}
}
},
"mappings": {
"quotes": {
"properties": {
"quote": {
"type": "text",
"fields": {
"lowercase": {
"type": "text",
"analyzer": "my_lowercase_analyzer"
},
"full": {
"type": "text",
"analyzer": "my_full_analyzer"
},
"ngram": {
"type": "text",
"analyzer": "my_ngram_analyzer"
}
}
}
}
}
}
}
POST /_reindex
{
"source": {
"index": "starwars"
},
"dest": {
"index": "starwars_extended"
}
}
POST /starwars_extended/_search?explain
{
"query": {
"multi_match": {
"query": "obiwan",
"fields": [
"quote",
"quote.lowercase",
"quote.full",
"quote.ngram"
],
"type": "most_fields"
}
}
}
...
"hits": {
"total": 1,
"max_score": 0.47685796,
"hits": [
{
"_shard": "[starwars_extended][2]",
"_node": "OsGbL-tZQJ-A8HO2PyDfhA",
"_index": "starwars_extended",
"_type": "quotes",
"_id": "2",
"_score": 0.47685796,
"_source": {
"quote": "Obi-Wan never told you what happened to your father."
},
...
"weight(
Synonym(quote.ngram:biw quote.ngram:iwa quote.ngram:obi quote.ngram:wan)
in 0) [PerFieldSimilarity], result of:"
DELETE /starwars
DELETE /starwars_extended
Different Analyzers for
Indexing and Searching
Per query
In the mapping
GET /starwars_extended/_search
{
"query": {
"match": {
"quote.ngram": {
"query": "the",
"analyzer": "standard"
}
}
}
}
...
"hits": [
{
"_index": "starwars_extended",
"_type": "quotes",
"_id": "2",
"_score": 0.38254172,
"_source": {
"quote": "Obi-Wan never told you what happened to your father."
}
},
{
"_index": "starwars_extended",
"_type": "quotes",
"_id": "3",
"_score": 0.36165747,
"_source": {
"quote": "<b>No</b>. I am your father."
}
}
]
...
POST /starwars_extended/_close
PUT /starwars_extended/_settings
{
"analysis": {
"filter": {
"my_edgegram_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 10
}
},
"analyzer": {
"my_edgegram_analyzer": {
"char_filter": [
"html_strip"
],
"tokenizer": "whitespace",
"filter": [
"lowercase",
"my_edgegram_filter"
]
}
}
}
}
POST /starwars_extended/_open
PUT /starwars_extended/quotes/_mapping
{
"properties": {
"quote": {
"type": "text",
"fields": {
"edgegram": {
"type": "text",
"analyzer": "my_edgegram_analyzer",
"search_analyzer": "standard"
}
}
}
}
}
PUT /starwars_extended/quotes/4
{
"quote": "I find your lack of faith disturbing."
}
PUT /starwars_extended/quotes/5
{
"quote": "That... is why you fail."
}
POST /starwars_extended/_search
{
"query": {
"match": {
"quote.ngram": "faith"
}
}
}
...
"hits": [
{
"_index": "starwars_extended",
"_type": "quotes",
"_id": "4",
"_score": 1.3019705,
"_source": {
"quote": "I find your lack of faith disturbing."
}
},
{
"_index": "starwars_extended",
"_type": "quotes",
"_id": "5",
"_score": 0.3812654,
"_source": {
"quote": "That... is why you fail."
}
}
]
...
POST /starwars_extended/_search
{
"query": {
"match": {
"quote.edgegram": "faith"
}
}
}
...
"hits": {
"total": 1,
"max_score": 0.41821626,
"hits": [
{
"_index": "starwars_extended",
"_type": "quotes",
"_id": "4",
"_score": 0.41821626,
"_source": {
"quote": "I find your lack of faith disturbing."
}
}
]
...
Image Credits
Schnitzel https://flic.kr/p/9m27wm
Architecture https://flic.kr/p/6dwCAe
Conchita https://flic.kr/p/nBqSHT

More Related Content

ODP
Terms of endearment - the ElasticSearch Query DSL explained
clintongormley
 
PDF
Elasticsearch intro output
Tom Chen
 
PPTX
Good practices for PrestaShop code security and optimization
PrestaShop
 
PPTX
Example-driven Web API Specification Discovery
Javier Canovas
 
PPT
What's New in ZF 1.10
Ralph Schindler
 
PDF
Fazendo mágica com ElasticSearch
Pedro Franceschi
 
PPTX
Let's write secure Drupal code! - DrupalCamp Belarus 2019
Balázs Tatár
 
PDF
WIRED and the WP REST API
kvignos
 
Terms of endearment - the ElasticSearch Query DSL explained
clintongormley
 
Elasticsearch intro output
Tom Chen
 
Good practices for PrestaShop code security and optimization
PrestaShop
 
Example-driven Web API Specification Discovery
Javier Canovas
 
What's New in ZF 1.10
Ralph Schindler
 
Fazendo mágica com ElasticSearch
Pedro Franceschi
 
Let's write secure Drupal code! - DrupalCamp Belarus 2019
Balázs Tatár
 
WIRED and the WP REST API
kvignos
 

What's hot (20)

PPT
Ant
sundar22in
 
TXT
Agile Testing Days 2018 - API Fundamentals - postman collection
JoEllen Carter
 
PDF
Dart Power Tools
Matt Norris
 
PDF
Questioning the status quo
Ivano Pagano
 
ODP
Web Scraping with PHP
Matthew Turland
 
PDF
When RSS Fails: Web Scraping with HTTP
Matthew Turland
 
PDF
PHP Experience 2016 - [Workshop] Elastic Search: Turbinando sua aplicação PHP
iMasters
 
PDF
Web Scraping with PHP
Matthew Turland
 
PDF
Elasticsearch And Ruby [RuPy2012]
Karel Minarik
 
PDF
Elasticsearch in 15 Minutes
Karel Minarik
 
PDF
Elasticsearch (Rubyshift 2013)
Karel Minarik
 
PPTX
Open Source Search: An Analysis
Justin Finkelstein
 
PPTX
Introduction to Azure DocumentDB
Alex Zyl
 
PPTX
Stop the noise! - Introduction to the JSON:API specification in Drupal
Björn Brala
 
KEY
Domain Specific Languages (EclipseCon 2012)
Sven Efftinge
 
PPT
Advanced Json
guestfd7d7c
 
PDF
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
James Titcumb
 
PDF
A Few of My Favorite (Python) Things
Michael Pirnat
 
ODP
Getting started with MongoDB and PHP
gates10gen
 
ODP
ELK Stack - Turn boring logfiles into sexy dashboard
Georg Sorst
 
Agile Testing Days 2018 - API Fundamentals - postman collection
JoEllen Carter
 
Dart Power Tools
Matt Norris
 
Questioning the status quo
Ivano Pagano
 
Web Scraping with PHP
Matthew Turland
 
When RSS Fails: Web Scraping with HTTP
Matthew Turland
 
PHP Experience 2016 - [Workshop] Elastic Search: Turbinando sua aplicação PHP
iMasters
 
Web Scraping with PHP
Matthew Turland
 
Elasticsearch And Ruby [RuPy2012]
Karel Minarik
 
Elasticsearch in 15 Minutes
Karel Minarik
 
Elasticsearch (Rubyshift 2013)
Karel Minarik
 
Open Source Search: An Analysis
Justin Finkelstein
 
Introduction to Azure DocumentDB
Alex Zyl
 
Stop the noise! - Introduction to the JSON:API specification in Drupal
Björn Brala
 
Domain Specific Languages (EclipseCon 2012)
Sven Efftinge
 
Advanced Json
guestfd7d7c
 
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
James Titcumb
 
A Few of My Favorite (Python) Things
Michael Pirnat
 
Getting started with MongoDB and PHP
gates10gen
 
ELK Stack - Turn boring logfiles into sexy dashboard
Georg Sorst
 
Ad

Viewers also liked (20)

PDF
Component-Based UI Architectures for the Web - Andrew Rota - Codemotion Rome...
Codemotion
 
PDF
Web Based Virtual Reality - Tanay Pant - Codemotion Rome 2017
Codemotion
 
PPTX
An Introduction to Apache Ignite - Mandhir Gidda - Codemotion Rome 2017
Codemotion
 
PPTX
Pronti per la legge sulla data protection GDPR? No Panic! - Domenico Maracci,...
Codemotion
 
PDF
Invader Studios: sviluppatori da “Incubo” - Tiziano Bucci - Codemotion Rome ...
Codemotion
 
PPTX
Commodore 64 Mon Amour(2): sprite multiplexing. Il caso Catalypse e altre sto...
Codemotion
 
PDF
Kunos Simulazioni and Assetto Corsa, behind the scenes- Alessandro Piva, Fabr...
Codemotion
 
PDF
Il game audio come processo ingegneristico - Davide Pensato - Codemotion Rome...
Codemotion
 
PDF
Thinking Functionally - John Stevenson - Codemotion Rome 2017
Codemotion
 
PDF
Comics and immersive storytelling in Virtual Reality - Fabio Corrirossi - Cod...
Codemotion
 
PDF
Docker Inside/Out: the ‘real’ real-world of stacking containers in production...
Codemotion
 
PDF
Cyber Analysts: who they are, what they do, where they are - Marco Ramilli - ...
Codemotion
 
PDF
S3, Cassandra or Outer Space? Dumping Time Series Data using Spark - Demi Be...
Codemotion
 
PDF
Unreal Engine 4 Blueprints: Odio e amore Roberto De Ioris - Codemotion Rome 2017
Codemotion
 
PDF
Galateo semi-serio dell'Open Source - Luigi Dell' Aquila - Codemotion Rome 2017
Codemotion
 
PDF
Meetup Code Garden Roma e Java User Group Roma: metodi asincroni con Spring -...
Codemotion
 
PDF
Monitoring Big Data Systems Done "The Simple Way" - Demi Ben-Ari - Codemotion...
Codemotion
 
PDF
From a Developer's POV: is Machine Learning Reshaping the World? - Simone Sca...
Codemotion
 
PDF
Microservices in GO - Massimiliano Dessì - Codemotion Rome 2017
Codemotion
 
PDF
Does Your Web App Speak Schadenfreude? - Greg Rewis - Codemotion Rome 2017
Codemotion
 
Component-Based UI Architectures for the Web - Andrew Rota - Codemotion Rome...
Codemotion
 
Web Based Virtual Reality - Tanay Pant - Codemotion Rome 2017
Codemotion
 
An Introduction to Apache Ignite - Mandhir Gidda - Codemotion Rome 2017
Codemotion
 
Pronti per la legge sulla data protection GDPR? No Panic! - Domenico Maracci,...
Codemotion
 
Invader Studios: sviluppatori da “Incubo” - Tiziano Bucci - Codemotion Rome ...
Codemotion
 
Commodore 64 Mon Amour(2): sprite multiplexing. Il caso Catalypse e altre sto...
Codemotion
 
Kunos Simulazioni and Assetto Corsa, behind the scenes- Alessandro Piva, Fabr...
Codemotion
 
Il game audio come processo ingegneristico - Davide Pensato - Codemotion Rome...
Codemotion
 
Thinking Functionally - John Stevenson - Codemotion Rome 2017
Codemotion
 
Comics and immersive storytelling in Virtual Reality - Fabio Corrirossi - Cod...
Codemotion
 
Docker Inside/Out: the ‘real’ real-world of stacking containers in production...
Codemotion
 
Cyber Analysts: who they are, what they do, where they are - Marco Ramilli - ...
Codemotion
 
S3, Cassandra or Outer Space? Dumping Time Series Data using Spark - Demi Be...
Codemotion
 
Unreal Engine 4 Blueprints: Odio e amore Roberto De Ioris - Codemotion Rome 2017
Codemotion
 
Galateo semi-serio dell'Open Source - Luigi Dell' Aquila - Codemotion Rome 2017
Codemotion
 
Meetup Code Garden Roma e Java User Group Roma: metodi asincroni con Spring -...
Codemotion
 
Monitoring Big Data Systems Done "The Simple Way" - Demi Ben-Ari - Codemotion...
Codemotion
 
From a Developer's POV: is Machine Learning Reshaping the World? - Simone Sca...
Codemotion
 
Microservices in GO - Massimiliano Dessì - Codemotion Rome 2017
Codemotion
 
Does Your Web App Speak Schadenfreude? - Greg Rewis - Codemotion Rome 2017
Codemotion
 
Ad

More from Codemotion (20)

PDF
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Codemotion
 
PDF
Pompili - From hero to_zero: The FatalNoise neverending story
Codemotion
 
PPTX
Pastore - Commodore 65 - La storia
Codemotion
 
PPTX
Pennisi - Essere Richard Altwasser
Codemotion
 
PPTX
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Codemotion
 
PPTX
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Codemotion
 
PPTX
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Codemotion
 
PPTX
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Codemotion
 
PDF
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Codemotion
 
PDF
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Codemotion
 
PDF
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Codemotion
 
PDF
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Codemotion
 
PDF
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Codemotion
 
PDF
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Codemotion
 
PPTX
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Codemotion
 
PPTX
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
Codemotion
 
PDF
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Codemotion
 
PDF
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Codemotion
 
PDF
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Codemotion
 
PDF
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Codemotion
 
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Codemotion
 
Pompili - From hero to_zero: The FatalNoise neverending story
Codemotion
 
Pastore - Commodore 65 - La storia
Codemotion
 
Pennisi - Essere Richard Altwasser
Codemotion
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Codemotion
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Codemotion
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Codemotion
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Codemotion
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Codemotion
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Codemotion
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Codemotion
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Codemotion
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Codemotion
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Codemotion
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Codemotion
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
Codemotion
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Codemotion
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Codemotion
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Codemotion
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Codemotion
 

Recently uploaded (20)

PDF
Using Anchore and DefectDojo to Stand Up Your DevSecOps Function
Anchore
 
PPTX
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
PPTX
Agile Chennai 18-19 July 2025 Ideathon | AI Powered Microfinance Literacy Gui...
AgileNetwork
 
PDF
Trying to figure out MCP by actually building an app from scratch with open s...
Julien SIMON
 
PDF
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
PDF
Oracle AI Vector Search- Getting Started and what's new in 2025- AIOUG Yatra ...
Sandesh Rao
 
PDF
SparkLabs Primer on Artificial Intelligence 2025
SparkLabs Group
 
PDF
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
PPTX
IT Runs Better with ThousandEyes AI-driven Assurance
ThousandEyes
 
PDF
A Strategic Analysis of the MVNO Wave in Emerging Markets.pdf
IPLOOK Networks
 
PDF
MASTERDECK GRAPHSUMMIT SYDNEY (Public).pdf
Neo4j
 
PDF
Security features in Dell, HP, and Lenovo PC systems: A research-based compar...
Principled Technologies
 
PDF
Responsible AI and AI Ethics - By Sylvester Ebhonu
Sylvester Ebhonu
 
PDF
How ETL Control Logic Keeps Your Pipelines Safe and Reliable.pdf
Stryv Solutions Pvt. Ltd.
 
PPTX
Simple and concise overview about Quantum computing..pptx
mughal641
 
PPTX
Applied-Statistics-Mastering-Data-Driven-Decisions.pptx
parmaryashparmaryash
 
PDF
How Open Source Changed My Career by abdelrahman ismail
a0m0rajab1
 
PPTX
Introduction to Flutter by Ayush Desai.pptx
ayushdesai204
 
PDF
Unlocking the Future- AI Agents Meet Oracle Database 23ai - AIOUG Yatra 2025.pdf
Sandesh Rao
 
PDF
Economic Impact of Data Centres to the Malaysian Economy
flintglobalapac
 
Using Anchore and DefectDojo to Stand Up Your DevSecOps Function
Anchore
 
New ThousandEyes Product Innovations: Cisco Live June 2025
ThousandEyes
 
Agile Chennai 18-19 July 2025 Ideathon | AI Powered Microfinance Literacy Gui...
AgileNetwork
 
Trying to figure out MCP by actually building an app from scratch with open s...
Julien SIMON
 
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
Oracle AI Vector Search- Getting Started and what's new in 2025- AIOUG Yatra ...
Sandesh Rao
 
SparkLabs Primer on Artificial Intelligence 2025
SparkLabs Group
 
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
IT Runs Better with ThousandEyes AI-driven Assurance
ThousandEyes
 
A Strategic Analysis of the MVNO Wave in Emerging Markets.pdf
IPLOOK Networks
 
MASTERDECK GRAPHSUMMIT SYDNEY (Public).pdf
Neo4j
 
Security features in Dell, HP, and Lenovo PC systems: A research-based compar...
Principled Technologies
 
Responsible AI and AI Ethics - By Sylvester Ebhonu
Sylvester Ebhonu
 
How ETL Control Logic Keeps Your Pipelines Safe and Reliable.pdf
Stryv Solutions Pvt. Ltd.
 
Simple and concise overview about Quantum computing..pptx
mughal641
 
Applied-Statistics-Mastering-Data-Driven-Decisions.pptx
parmaryashparmaryash
 
How Open Source Changed My Career by abdelrahman ismail
a0m0rajab1
 
Introduction to Flutter by Ayush Desai.pptx
ayushdesai204
 
Unlocking the Future- AI Agents Meet Oracle Database 23ai - AIOUG Yatra 2025.pdf
Sandesh Rao
 
Economic Impact of Data Centres to the Malaysian Economy
flintglobalapac
 

Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017