Slide 1

Slide 1 text

better searching with elasticsearch Sunday, 3 November 2013

Slide 2

Slide 2 text

richard miller @mr_r_miller richarddmiller.co.uk sensiolabs uk Sunday, 3 November 2013

Slide 3

Slide 3 text

why worry about search? Sunday, 3 November 2013

Slide 4

Slide 4 text

ok, so what might someone want from search? Sunday, 3 November 2013

Slide 5

Slide 5 text

Given I am a hungry person When I search for somewhere to eat Then I should see relevant results And they should be ordered by relevance Sunday, 3 November 2013

Slide 6

Slide 6 text

yep, no problem Sunday, 3 November 2013

Slide 7

Slide 7 text

Given I am a hungry person When I search for somewhere to eat Then I should see results for relevant reviews Sunday, 3 November 2013

Slide 8

Slide 8 text

sure Sunday, 3 November 2013

Slide 9

Slide 9 text

Given I am a hungry person When I search for somewhere to eat Then I should see results for similar words Sunday, 3 November 2013

Slide 10

Slide 10 text

yeah, we can do that do that Sunday, 3 November 2013

Slide 11

Slide 11 text

Given I am a hungry person When I search for somewhere to eat near me Then I should see results close to my location Sunday, 3 November 2013

Slide 12

Slide 12 text

that’s certainly possible Sunday, 3 November 2013

Slide 13

Slide 13 text

Given I am a hungry person When I typo entering my search terms Then I should see “did you mean?” suggestions Sunday, 3 November 2013

Slide 14

Slide 14 text

well other sites do that, so why not? Sunday, 3 November 2013

Slide 15

Slide 15 text

Given I am a hungry person When I start entering my search terms Then I should see suggestions straight away Sunday, 3 November 2013

Slide 16

Slide 16 text

ok, ok Sunday, 3 November 2013

Slide 17

Slide 17 text

Given I am a hungry person When I start searching for somewhere to eat Then I should be able to filter my results Sunday, 3 November 2013

Slide 18

Slide 18 text

now this we can do Sunday, 3 November 2013

Slide 19

Slide 19 text

Given I am a hungry person When I start view details of somewhere to eat Then I should see suggestions of similar eateries Sunday, 3 November 2013

Slide 20

Slide 20 text

yep, yep Sunday, 3 November 2013

Slide 21

Slide 21 text

Given I am a restaurateur When I upload my PDF menu Then hungry people should be able to search it Sunday, 3 November 2013

Slide 22

Slide 22 text

hmm... Sunday, 3 November 2013

Slide 23

Slide 23 text

well let’s get the easy stuff out of the way Sunday, 3 November 2013

Slide 24

Slide 24 text

Given I am a hungry person When I search for somewhere to eat Then I should see relevant results And they should be ordered by relevance Sunday, 3 November 2013

Slide 25

Slide 25 text

SELECT * FROM eateries WHERE NAME LIKE “%searchterm%” Sunday, 3 November 2013

Slide 26

Slide 26 text

multiple searchterms? Sunday, 3 November 2013

Slide 27

Slide 27 text

...WHERE ( name LIKE “%multiple%” OR name LIKE “%searchterm%”) Sunday, 3 November 2013

Slide 28

Slide 28 text

but wait... Sunday, 3 November 2013

Slide 29

Slide 29 text

but wait... ...multiple fields Sunday, 3 November 2013

Slide 30

Slide 30 text

...WHERE ( name LIKE “%multiple%” OR name LIKE “%searchterm%”... Sunday, 3 November 2013

Slide 31

Slide 31 text

...OR desc LIKE “%multiple%” OR desc LIKE “%searchterm%”) Sunday, 3 November 2013

Slide 32

Slide 32 text

Given I am a hungry person When I search for somewhere to eat Then I should see relevant results And they should be ordered by relevance Sunday, 3 November 2013

Slide 33

Slide 33 text

ORDER? Sunday, 3 November 2013

Slide 34

Slide 34 text

Given I am a hungry person When I search for somewhere to eat Then I should see relevant results And they should be ordered by relevance Sunday, 3 November 2013

Slide 35

Slide 35 text

the Sunday, 3 November 2013

Slide 36

Slide 36 text

the with Sunday, 3 November 2013

Slide 37

Slide 37 text

the with be Sunday, 3 November 2013

Slide 38

Slide 38 text

the but with be Sunday, 3 November 2013

Slide 39

Slide 39 text

the but with be it Sunday, 3 November 2013

Slide 40

Slide 40 text

it the but with be food Sunday, 3 November 2013

Slide 41

Slide 41 text

oh ok, Sunday, 3 November 2013

Slide 42

Slide 42 text

oh ok, full text search... Sunday, 3 November 2013

Slide 43

Slide 43 text

SELECT * FROM eateries MATCH (name, desc) AGAINST( “multiple searchterms”) Sunday, 3 November 2013

Slide 44

Slide 44 text

that should do! Sunday, 3 November 2013

Slide 45

Slide 45 text

what was left? Sunday, 3 November 2013

Slide 46

Slide 46 text

Given I am a hungry person When I search for somewhere to eat Then I should see results for relevant reviews Sunday, 3 November 2013

Slide 47

Slide 47 text

...LEFT JOIN... Sunday, 3 November 2013

Slide 48

Slide 48 text

Given I am a hungry person When I search for somewhere to eat Then I should see results for similar words Sunday, 3 November 2013

Slide 49

Slide 49 text

grilled Sunday, 3 November 2013

Slide 50

Slide 50 text

grilling grilled Sunday, 3 November 2013

Slide 51

Slide 51 text

grilling grilled grills Sunday, 3 November 2013

Slide 52

Slide 52 text

grill grilling grilled grills Sunday, 3 November 2013

Slide 53

Slide 53 text

Given I am a hungry person When I search for somewhere to eat near me Then I should see results close to my location Sunday, 3 November 2013

Slide 54

Slide 54 text

elasticsearch Sunday, 3 November 2013

Slide 55

Slide 55 text

distributed, schemaless, document oriented, Lucene based search engine with a REST API Sunday, 3 November 2013

Slide 56

Slide 56 text

github Sunday, 3 November 2013

Slide 57

Slide 57 text

stackoverflow Sunday, 3 November 2013

Slide 58

Slide 58 text

gov.uk Sunday, 3 November 2013

Slide 59

Slide 59 text

foursquare Sunday, 3 November 2013

Slide 60

Slide 60 text

soundcloud Sunday, 3 November 2013

Slide 61

Slide 61 text

wget https://download.elasticsearch.org/ elasticsearch/elasticsearch/ elasticsearch-0.90.5.tar.gz tar -zxvf elasticsearch-0.90.5.tar.gz cd elasticsearch-0.90.5 Sunday, 3 November 2013

Slide 62

Slide 62 text

bin/elasticsearch Sunday, 3 November 2013

Slide 63

Slide 63 text

Lucene based Sunday, 3 November 2013

Slide 64

Slide 64 text

request curl -X GET http://localhost:9200/ Sunday, 3 November 2013

Slide 65

Slide 65 text

{ "ok" : true, "status" : 200, "name" : "Mr. Wu", "version" : { "number" : "0.90.5", "build_hash" : "c8714e8...dedee", "build_timestamp" : "2013-09-17T12:50:20Z", "build_snapshot" : false, "lucene_version" : "4.4" }, "tagline" : "You Know, for Search" } response Sunday, 3 November 2013

Slide 66

Slide 66 text

database index Sunday, 3 November 2013

Slide 67

Slide 67 text

table type Sunday, 3 November 2013

Slide 68

Slide 68 text

record document Sunday, 3 November 2013

Slide 69

Slide 69 text

distributed Sunday, 3 November 2013

Slide 70

Slide 70 text

0 1 2 3 4 Instance Sunday, 3 November 2013

Slide 71

Slide 71 text

0 1 Instance 1 Instance 2 Instance 3 2 3 4 Sunday, 3 November 2013

Slide 72

Slide 72 text

0 1 2 3 4 Instance 1 Instance 2 Instance 3 0 1 2 3 4 Sunday, 3 November 2013

Slide 73

Slide 73 text

document oriented Sunday, 3 November 2013

Slide 74

Slide 74 text

REST API Sunday, 3 November 2013

Slide 75

Slide 75 text

curl -XPOST 'http://localhost:9200/eatly/eateries/' -d '{ "name" : "Jeff''s Burgers", "desc" : "Blah Blah dirty burgers..." }' Sunday, 3 November 2013

Slide 76

Slide 76 text

curl -XPOST 'http://localhost:9200/eatly/eateries/' -d '{ "name" : "Jeff''s Burgers", "desc" : "Blah Blah dirty burgers..." }' Sunday, 3 November 2013

Slide 77

Slide 77 text

curl -XPOST 'http://localhost:9200/eatly/eateries/' -d '{ "name" : "Jeff''s Burgers", "desc" : "Blah Blah dirty burgers..." }' Sunday, 3 November 2013

Slide 78

Slide 78 text

{"ok":true,"_index":"eatly","_type":"eateries","_id":"EGHS ABBxQkaPR_DJxPxXZA","_version":1} Sunday, 3 November 2013

Slide 79

Slide 79 text

?pretty=true Sunday, 3 November 2013

Slide 80

Slide 80 text

{ "ok" : true, "_index" : "eatly", "_type" : "eateries", "_id" : "cmElnobYSy6386TOUVbGZQ", "_version" : 1 } Sunday, 3 November 2013

Slide 81

Slide 81 text

curl -XPUT 'http://localhost:9200/eatly/eateries/1' -d '{ "name" : "Jeff''s Burgers", "desc" : "Blah Blah dirty burgers..." }' Sunday, 3 November 2013

Slide 82

Slide 82 text

{ "ok" : true, "_index" : "eatly", "_type" : "eateries", "_id" : "1", "_version" : 1 } Sunday, 3 November 2013

Slide 83

Slide 83 text

curl -XGET 'http://localhost:9200/eatly/eateries/1' Sunday, 3 November 2013

Slide 84

Slide 84 text

{ "_index" : "eatly", "_type" : "eateries", "_id" : "1", "_version" : 1, "exists" : true, "_source" : { "name" : "Jeff's Burgers", "desc" : "Blah Blah dirty burgers..." } } Sunday, 3 November 2013

Slide 85

Slide 85 text

curl -XPUT 'http://localhost:9200/eatly/eateries/1' -d '{ "name" : "Jeff''s Burger Joint" }' Sunday, 3 November 2013

Slide 86

Slide 86 text

{ "ok" : true, "_index" : "eatly", "_type" : "eateries", "_id" : "1", "_version" : 2 } Sunday, 3 November 2013

Slide 87

Slide 87 text

curl -XGET 'http://localhost:9200/eatly/eateries/1' Sunday, 3 November 2013

Slide 88

Slide 88 text

{ "_index" : "eatly", "_type" : "eateries", "_id" : "1", "_version" : 2, "exists" : true, "_source" : { "name" : "Jeff's Burger Joint" } } Sunday, 3 November 2013

Slide 89

Slide 89 text

curl -XDELETE 'http://localhost:9200/eatly/eateries/1' Sunday, 3 November 2013

Slide 90

Slide 90 text

curl -XGET 'http://localhost:9200/eatly/eateries/1' Sunday, 3 November 2013

Slide 91

Slide 91 text

{ "_index" : "eatly", "_type" : "eateries", "_id" : "1", "_version" : 2, "exists" : false } Sunday, 3 November 2013

Slide 92

Slide 92 text

search engine Sunday, 3 November 2013

Slide 93

Slide 93 text

curl -XGET '.../eatly/eateries/_search?q=name:Burger' Sunday, 3 November 2013

Slide 94

Slide 94 text

{ "took" : 7, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.15342641, "hits" : [ { "_index" : "eatly", "_type" : "eateries", "_id" : "1", "_score" : 0.15342641, "_source" : {"name" : "Jeff's Burger Joint"} } ] } } Sunday, 3 November 2013

Slide 95

Slide 95 text

http://localhost:9200/eatly/cafes,pubs/_search?q=Burger http://localhost:9200/eatly/_search?q=name:Burger http://localhost:9200/eatly,cookr/_search?q=name:Burger http://localhost:9200/_all/pubs/_search?q=name:Burger http://localhost:9200/_search?q=name:Burger' Sunday, 3 November 2013

Slide 96

Slide 96 text

schemaless? Sunday, 3 November 2013

Slide 97

Slide 97 text

schemaless? Sunday, 3 November 2013

Slide 98

Slide 98 text

curl -XPUT 'http://localhost:9200/eatly/' -d '{ "settings" : { "index" : { "number_of_shards" : 4 "number_of_replicas" : 2 } } }' Sunday, 3 November 2013

Slide 99

Slide 99 text

Given I am a hungry person When I search for somewhere to eat Then I should see relevant results And they should be ordered by relevance Sunday, 3 November 2013

Slide 100

Slide 100 text

name > desc Sunday, 3 November 2013

Slide 101

Slide 101 text

curl -XPUT '.../eatly/eateries/_mapping' -d '{ "eateries" : { "properties" : { "name" : {"type" : "string", "boost" : "1.5"}, "desc" : {"type" : "string"} } } }' Sunday, 3 November 2013

Slide 102

Slide 102 text

Given I am a hungry person When I search for somewhere to eat Then I should see results for relevant reviews Sunday, 3 November 2013

Slide 103

Slide 103 text

curl -XPUT '.../eatly/eateries/_mapping' -d '{ "eateries" : { "properties" : { "name" : {"type" : "string", "boost" : "1.5"}, "desc" : {"type" : "string"} "reviews" : { "properties" : { "review" : {"type" : "string"}, "reviewer" : {"type" : "string"} } } } } }' Sunday, 3 November 2013

Slide 104

Slide 104 text

curl -XPOST 'http://localhost:9200/eatly/eateries/' -d '{ "name" : "Jeff''s Burgers", "desc" : "Blah Blah dirty burgers...", "reviews" : [ { "review" : "Yadda, yadda, yadda", "reviewer" : "John Smith" }, { "review" : "na na na", "reviewer" : "Billy Badger" } ] }' Sunday, 3 November 2013

Slide 105

Slide 105 text

curl -XGET '.../eateries/_search?q=reviews.review:Burger' Sunday, 3 November 2013

Slide 106

Slide 106 text

Given I am a hungry person When I search for somewhere to eat Then I should see results for similar words Sunday, 3 November 2013

Slide 107

Slide 107 text

burgers I really enjoyed Jeff's Burger Joint, the burgers were excellent! can't fault it standard tokenizer I really enjoyed Jeff's Burger Joint the were excellent can't fault it Sunday, 3 November 2013

Slide 108

Slide 108 text

excellent! burgers I really enjoyed Jeff's Burger Joint, the burgers were excellent! can't fault it whitespace tokenizer I really enjoyed Jeff's Burger Joint, the were can't fault it Sunday, 3 November 2013

Slide 109

Slide 109 text

burgers I really enjoyed Jeff's Burger Joint, the burgers were excellent! can't fault it letter tokenizer I really enjoyed Jeff Burger Joint the were excellent can fault it s t Sunday, 3 November 2013

Slide 110

Slide 110 text

burgers I really enjoyed Jeff's Burger Joint, the burgers were excellent! can't fault it standard tokenizer + lowercase filter i really enjoyed jeff's burger joint the were excellent can't fault it Sunday, 3 November 2013

Slide 111

Slide 111 text

burgers I really enjoyed Jeff's Burger Joint, the burgers were excellent! can't fault it standard tokenizer + lowercase filter + stop filter i really enjoyed jeff's burger joint were excellent can't fault Sunday, 3 November 2013

Slide 112

Slide 112 text

burger I really enjoyed Jeff's Burger Joint, the burgers were excellent! can't fault it standard tokenizer + lowercase filter + stop filter + stemmer filter i realli enjoi jeff burger joint were excel can't fault Sunday, 3 November 2013

Slide 113

Slide 113 text

curl -XPUT 'http://localhost:9200/eatly/' -d '{ "settings" : { "index" : { "analysis" : { "analyzer" : { "snowball_analyzer" : { "type" : "snowball" } } } } } }' Sunday, 3 November 2013

Slide 114

Slide 114 text

curl -XPUT '.../eatly/eateries/_mapping' -d '{ "eateries" : { "properties" : { "name" : {"type" : "string", "boost" : "1.5"}, "desc" : { "type" : "string", "analyzer": "snowball_analyzer" } } } }' Sunday, 3 November 2013

Slide 115

Slide 115 text

curl -XPUT 'http://localhost:9200/eatly/' -d '{ "settings" : { "index" : { "analysis" : { "analyzer" : { "custom_analyzer" : { "type" : "custom", "tokenizer" : "lowercase" "filter" : ["stop", "extra_stop"] } }, "filter" : { "extra_stop":{ "type" : "stop", "stopwords" : ["food"] } } } } } }' Sunday, 3 November 2013

Slide 116

Slide 116 text

curl -XPUT '.../eatly/eateries/_mapping' -d '{ "eateries" : { "properties" : { "name" : {"type" : "string", "boost" : "1.5"}, "desc" : { "type" : "string", "analyzer": "custom_analyzer" } } } }' Sunday, 3 November 2013

Slide 117

Slide 117 text

query DSL Sunday, 3 November 2013

Slide 118

Slide 118 text

curl -XGET '.../eatly/eateries/_search' -d '{ "query" : { "match" : { "name" : "burger" } } }' Sunday, 3 November 2013

Slide 119

Slide 119 text

curl -XGET '.../eatly/eateries/_search' -d '{ "query" : { "match" : { "name" : "burger bar" } } }' Sunday, 3 November 2013

Slide 120

Slide 120 text

curl -XGET '.../eatly/eateries/_search' -d '{ "query" : { "match" : { "name" : { "query" : "burger bar", "operator" : "and" } } } }' Sunday, 3 November 2013

Slide 121

Slide 121 text

curl -XGET '.../eatly/eateries/_search' -d '{ "query" : { "multi_match" : { "query" : "burger bar", "fields" : ["name","desc","reviews.review"] } } }' Sunday, 3 November 2013

Slide 122

Slide 122 text

curl -XGET '.../eatly/eateries/_search' -d '{ "query" : { "multi_match" : { "query" : "burger bar", "fields" : ["name^2","desc","reviews.review"] } } }' Sunday, 3 November 2013

Slide 123

Slide 123 text

filters Sunday, 3 November 2013

Slide 124

Slide 124 text

Given I am a hungry person When I start searching for somewhere to eat Then I should be able to filter my results Sunday, 3 November 2013

Slide 125

Slide 125 text

curl -XPUT 'http://localhost:9200/eatly/eateries/1' -d '{ "name" : "Jeff''s Burger Joint", "desc" : "Blah Blah dirty burgers...", "tags" : ["greasy", "retro"] }' Sunday, 3 November 2013

Slide 126

Slide 126 text

curl -XGET '.../eatly/eateries/_search' -d '{ "query" : { "multi_match" : { "query" : "burger bar", "fields" : ["name^2", "desc", "reviews.review"] } }, "filter" : { "not" : { "terms" : { "tags" : ["greasy", "meaty"]} } } }' Sunday, 3 November 2013

Slide 127

Slide 127 text

query or filter? Sunday, 3 November 2013

Slide 128

Slide 128 text

Given I am a hungry person When I search for somewhere to eat near me Then I should see results close to my location Sunday, 3 November 2013

Slide 129

Slide 129 text

curl -XPUT '.../eatly/eateries/_mapping' -d '{ "eateries" : { "properties" : { "name" : {"type" : "string", "boost" : "1.5"}, "desc" : {"type" : "string"} "reviews" : { "properties" : { "review" : {"type" : "string"}, "reviewer" : {"type" : "string"} } }, "location" : { "type" : "geo_point" } } } }' Sunday, 3 November 2013

Slide 130

Slide 130 text

curl -XPOST 'http://localhost:9200/eatly/eateries/' -d '{ "name" : "Jeff''s Burgers", "desc" : "Blah Blah dirty burgers...", "reviews" : [ { "review" : "Yadda, yadda, yadda", "reviewer" : "John Smith" }, { "review" : "na na na", "reviewer" : "Billy Badger" } ], "location" : { "lat" : 41.12, "lon" : -71.34 } }' Sunday, 3 November 2013

Slide 131

Slide 131 text

curl -XGET '.../eatly/eateries/_search' -d '{ "sort" : [ { "_geo_distance" : { "eatery.location" : [-40, 70], "order" : "asc", "unit" : "miles" } } ], "query" : { "multi_match" : { "query" : "burger bar", "fields" : ["name^2","desc","reviews.review"] } } }' Sunday, 3 November 2013

Slide 132

Slide 132 text

sense (chrome extension) Sunday, 3 November 2013

Slide 133

Slide 133 text

head (elasticsearch plugin) Sunday, 3 November 2013

Slide 134

Slide 134 text

elastica Sunday, 3 November 2013

Slide 135

Slide 135 text

sherlock elasticsearch elasticsearch-php (official) Sunday, 3 November 2013

Slide 136

Slide 136 text

{ "require": { "ruflin/elastica": "v0.90.2.0" } } Sunday, 3 November 2013

Slide 137

Slide 137 text

$client = new \Elastica\Client(); Sunday, 3 November 2013

Slide 138

Slide 138 text

$index = $client->getIndex("eatly"); $type = $index->getType("eateries"); Sunday, 3 November 2013

Slide 139

Slide 139 text

$type->addDocument( new \Elastica\Document( null, array( "name" => "Jeff's Burger Joint", "desc" => "Blah Blah..." ) ) ); Sunday, 3 November 2013

Slide 140

Slide 140 text

$type->addDocument( new \Elastica\Document( $id, array( "id" => $id, "name" => "Jeff's Burger Joint", "desc" => "Blah Blah..." ) ) ); Sunday, 3 November 2013

Slide 141

Slide 141 text

$type->addDocuments($documents); $type->getDocument($id); $type->deleteId($id); $type->deleteDocument($document); $type->delete(); Sunday, 3 November 2013

Slide 142

Slide 142 text

$type->search("burger"); $type->search("burger", 10); $type->count("burger"); Sunday, 3 November 2013

Slide 143

Slide 143 text

$multiMatchQuery = new \Elastica\Query\MultiMatch(); $multiMatchQuery ->setQuery("burgers bar") ->setFields( array("name^2", "desc", "reviews.review") ) ; $query = new \Elastica\Query($multiMatchQuery); $query->setFilter( new \Elastica\Filter\BoolNot( new \Elastica\Filter\Terms( "tags", array("greasy", "meaty") ) ) ); $results = $type->search($query); Sunday, 3 November 2013

Slide 144

Slide 144 text

$mapping = new \Elastica\Type\Mapping(); $mapping->setType($type); $mapping->setProperties( array( "name" => array( "type" => "string" ), "desc" => array( "type" => "string", "boost" => 1.5 ) ) ); $mapping->send(); Sunday, 3 November 2013

Slide 145

Slide 145 text

Given I am a hungry person When I search for somewhere to eat Then I should see relevant results And they should be ordered by relevance ✔ Sunday, 3 November 2013

Slide 146

Slide 146 text

Given I am a hungry person When I search for somewhere to eat Then I should see results for relevant reviews ✔ Sunday, 3 November 2013

Slide 147

Slide 147 text

Given I am a hungry person When I search for somewhere to eat Then I should see results for similar words ✔ Sunday, 3 November 2013

Slide 148

Slide 148 text

Given I am a hungry person When I search for somewhere to eat near me Then I should see results close to my location ✔ Sunday, 3 November 2013

Slide 149

Slide 149 text

Given I am a hungry person When I start searching for somewhere to eat Then I should be able to filter my results ? Sunday, 3 November 2013

Slide 150

Slide 150 text

$facet = new \Elastica\Facet\Terms("tags"); $facet->setField("tags"); $facet->setSize(10); $facet->setOrder("reverse_count"); $query->addFacet($facet); Sunday, 3 November 2013

Slide 151

Slide 151 text

$facets = $resultSet->getFacets(); foreach ($facets["tags"]["terms"] as $facet) { printf( "%s: %s\n", $facet["term"], $facet["count"] ); } thai: 4 italian: 8 greek:4 Sunday, 3 November 2013

Slide 152

Slide 152 text

Given I am a hungry person When I start view details of somewhere to eat Then I should see suggestions of similar eateries Sunday, 3 November 2013

Slide 153

Slide 153 text

$type->moreLikeThis($document); Sunday, 3 November 2013

Slide 154

Slide 154 text

$type->moreLikeThis( new \Elastica\Document($id) ); Sunday, 3 November 2013

Slide 155

Slide 155 text

Given I am a restaurateur When I upload my PDF menu Then hungry people should be able to search it Sunday, 3 November 2013

Slide 156

Slide 156 text

bin/plugin -install \ elasticsearch/elasticsearch-mapper-attachments/1.9.0 Sunday, 3 November 2013

Slide 157

Slide 157 text

$propertyMapping = array( //... "menu" => array("type" => "attachment"), ) Sunday, 3 November 2013

Slide 158

Slide 158 text

$document->addFile('menu', $filepath); Sunday, 3 November 2013

Slide 159

Slide 159 text

Given I am a hungry person When I typo entering my search terms Then I should see “did you mean?” suggestions Sunday, 3 November 2013

Slide 160

Slide 160 text

$query = new \Elastica\Query( array( "query" => array(...), "suggest" => array( "check1" => array( "text" => "berger", "term" => array( "field" => "name" ) ) ) ) ); Sunday, 3 November 2013

Slide 161

Slide 161 text

$data = $results->getResponse()->getData(); print_r($data["suggest"]); Sunday, 3 November 2013

Slide 162

Slide 162 text

Array ( [check1] => Array ( [0] => Array ( [text] => berger [offset] => 0 [length] => 6 [options] => Array ( [0] => Array ( [text] => burger [score] => 0.8333333 [freq] => 1 ) ) ) ) ) Sunday, 3 November 2013

Slide 163

Slide 163 text

Given I am a hungry person When I start entering my search terms Then I should see suggestions straight away Sunday, 3 November 2013

Slide 164

Slide 164 text

$mapping->setProperties( array( "name" => array( "type" => "string" ), "desc" => array( "type" => "string", "boost" => 1.5 ), "name_suggest" => array( "type" => "completion" ) ) ); Sunday, 3 November 2013

Slide 165

Slide 165 text

new \Elastica\Document( $id, array( "id" => $id, "name" => "Jeff's Burger Joint", "name_suggest" => "Jeff's Burger Joint", "desc" => "Blah Blah..." ) ); Sunday, 3 November 2013

Slide 166

Slide 166 text

$query = array( "eateries" => array( "text" => 'j', "completion" => array( "field" => "name_suggest", ) ) ); Sunday, 3 November 2013

Slide 167

Slide 167 text

$response = $index->request( "_suggest", \Elastica\Request::GET, $query ); $data = $response->getData(); print_r($data["eateries"]); Sunday, 3 November 2013

Slide 168

Slide 168 text

Array ( [0] => Array ( [text] => j [offset] => 0 [length] => 1 [options] => Array ( [0] => Array ( [text] => Jeffs Burger Joint [score] => 1 ) ) ) ) Sunday, 3 November 2013

Slide 169

Slide 169 text

scripts Sunday, 3 November 2013

Slide 170

Slide 170 text

percolator scripts Sunday, 3 November 2013

Slide 171

Slide 171 text

percolator river scripts Sunday, 3 November 2013

Slide 172

Slide 172 text

data analysis percolator river scripts Sunday, 3 November 2013

Slide 173

Slide 173 text

data analysis percolator logstash river scripts Sunday, 3 November 2013

Slide 174

Slide 174 text

thank you! pytania? @mr_r_miller Sunday, 3 November 2013