SlideShare a Scribd company logo
1 of 58
Download to read offline
TITEL DAG MAAND JAARPHP NORTH EAST 2014 JEROEN VAN DIJK
LIKING
RELEVANCE
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WILL I FIND WHAT I’M LOOKING FOR?
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
129 LINKEDIN PROFILE MATCHES
SEARCHING JEROEN VAN DIJK?
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
enrise.com/jeroen-van-dijk
phpbenelux.eu/jeroen-van-dijk
jrdk.nl/jeroen-van-dijk
twitter.com/jrvandijk
LINK: JEROEN VAN DIJK
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
joind.in/10916
LINK: JOIND.IN
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHAT IS AUTOTRACK?
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
HOW MANY OPTIONS DO I HAVE?
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
NEED MORE?
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHERE TO START?
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
HOW DO YOU SEARCH?
SOLR
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
SCHEMA.XML, WHERE DO I START?
├── contrib
├── dist
├── docs
├── example
│   ├── solr
│   │   ├── bin
│   │   └── collection1
│   │   └── conf
│   │   ├── admin-extra.html
│   │   ├── admin-extra.menu-bottom.html
│   │   ├── admin-extra.menu-top.html
│   │   ├── currency.xml
│   │   ├── elevate.xml
│   │   ├── mapping-FoldToASCII.txt
│   │   ├── mapping-ISOLatin1Accent.txt
│   │   ├── protwords.txt
│   │   ├── schema.xml
│   │   ├── scripts.conf
│   │   ├── solrconfig.xml
│   │   ├── spellings.txt
│   │   ├── stopwords.txt
│   │   ├── synonyms.txt
│   │   ├── update-script.js
└── licenses
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
DID YOU READ THE SCHEMA.XML?
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <schema name="example" version="1.5">
3 <!--
4 This is the Solr schema file. This file should be named "schema.xml" and
5 should be in the conf directory under the solr home
6 (i.e. ./solr/conf/schema.xml by default)
7 or located where the classloader for the Solr webapp can find it.
8
9 This example schema is the recommended starting point for users.
10 It should be kept correct and concise, usable out-of-the-box.
11
12 For more information, on how to customize this file, please see
13 http://wiki.apache.org/solr/SchemaXml
14 -->
15 <types>
16 <!-- There is 61Kb of example schema -->
17 </types>
18 <fields>
19 <!-- documented in this file! -->
20 </fields>
21 <uniqueKey>id</uniqueKey>
22 <defaultSearchField>text</defaultSearchField>
23 </schema>
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHAT ARE TYPES AND FIELDS?
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <schema name="cars" version="1.5">
3 <types>
4 <!-- A plain string type -->
5 <fieldType name="string" class=“solr.StrField"
6 sortMissingLast="true" omitNorms="true"/>
7 <!-- The model type for tokenizing & filtering synonyms -->
8 <fieldtype name="modelType" class="solr.TextField">
9 <analyzer type="query">
10 <tokenizer class="solr.KeywordTokenizerFactory"/>
11 <filter class="solr.SynonymFilterFactory" synonyms="models.
12 querytime.txt" ignoreCase="false"
13 expand="true"/>
14 </analyzer>
15 </fieldtype>
16 </types>
17 <fields>
18 <field name="merk" type="string" indexed="true" stored="true"
19 termVectors="true"/>
20 <field name="model" type="modelType" indexed="true" stored="true"/>
21 </fields>
22 <!-- ... -->
23 </schema>
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHAT’S THE USAGE OF A COPY FIELD?
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <schema name="cars" version="1.5">
3 <types>
4 <!-- ... -->
5 </types>
6 <fields>
7 <!-- ... -->
8 <field name="text" type="text" indexed="true" stored="false"
9 multiValued="true"/>
10 </fields>
11 <uniqueKey>auto_id</uniqueKey>
12 <defaultSearchField>text</defaultSearchField>
13 <solrQueryParser defaultOperator="OR"/>
14
15 <copyField source="merk" dest="text"/>
16 <copyField source="model" dest="text"/>
17 <copyField source="uitvoering" dest="text"/>
18 <copyField source="aanbieder_informatie" dest="text"/>
19 <copyField source="interieur_kleur" dest="text"/>
20 <copyField source="bouwjaar" dest="text"/>
21 </schema>
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
HOW DID YOU INDEX DATA?
§Using Solr since version 1.3
§CSV & XML update request handlers
§Data import handler
§Explicitly chose Solr XML import
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
CAN IT BE MORE ABSTRACT?
Database
!
!
Nightly bulk export Trigger item export
!
!
Mapping
!
!
Solr
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
DO YOU HAVE SOME TIPS?
§Analyze your data up front
§Do not store, what you don’t want to visualize!
§Pay extra attention to columns you want to sort
§Create a well defined copy field for the query
§Do not use Solr as your persistent storage
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
NO SQL?
SELECT * FROM …
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHICH QUERY HANDLERS ARE THERE?
§Standard
§Disjunction Max
§Extended Disjunction Max
§Create your own based on the above!
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHAT IS SOLARIUM?
Extensible PHP Library
Usable in any PHP based framework
Abstracts raw Solr communication
@basdenooijer / @solariumproject
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
IS IT THAT EASY WITH SOLARIUM?
1 // get a select query instance
2 $client = new SolariumClient($config);
3 $query = $client->createSelect();
4
5 // define the output field
6 $query->setFields(array('auto_id', 'merk_model_uitvoering',
7 'aanbieder_informatie', 'score'));
8 $query->setSorts(array('score' => 'desc'));
9
10 // set the query
11 $query->setQuery('audi +avant +abs');
12
13 $resultset = $client->select($query);
select?q=audi +avant +abs
&fl=auto_id,merk_model_uitvoering,aanbieder_informa
tie,score&sort=score desc
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
HOW DO I USE THE DISMAX REQUEST HANDLER?
1 // define the output field
2 $query->setFields(array('auto_id', 'merk_model_uitvoering',
3 'aanbieder_informatie', 'score'));
4 $query->setSorts(array('score' => 'desc'));
5
6 // get the dismax component and set a boost query
7 $dismax = $query->getDisMax();
8 $dismax->setQueryFields('uitvoering^2.3 text^0.9');
9 // set the query
10 $query->setQuery('audi +avant +abs');
11
12 $resultset = $client->select($query);
select?q=audi +avant +abs&
fl=auto_id,merk_model_uitvoering,aanbieder_informat
ie,score&sort=score
desc&defType=dismax&qf=uitvoering^2.3 text^0.9
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHAT IS A BOOST FUNCTION?
1 // define the output field
2 $query->setFields(array('auto_id', 'merk_model_uitvoering',
2 'score'));
3 $query->setSorts(array('score' => 'asc'));
4
5 // get the dismax component and set a boost function
6 $dismax = $query->getDisMax();
7 $dismax->setBoostFunctions(
8 ‘sqedist(x_coordinaat,y_coordinaat,155000,463000)');
9
10 // set the query
11 $query->setQuery('audi +avant +abs');
select?q=audi +avant +abs
&fl=auto_id,merk_model_uitvoering,score&sort=score
asc&defType=dismax&bf=sqedist(x_coordinaat,y_coordi
naat,155000,463000)
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHY NOT USE WGS84 FOR DISTANCE SEARCH?
!
Solr 4.0 introduced
!
SpatialRecursivePrefixTreeFieldType
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
QUERIES
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHAT IS THE LUCENE RANGE QUERY SYNTAX?
maximum_speed:[1 TO 10]
publication_date:[20140301 TO 20140318]
publication_date:[* TO NOW]
any_range:[* TO *]
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
HOW DO I CREATE A RANGE QUERY?
1 // get the facetset component
2 $facetSet = $query->getFacetSet();
3
4 // create a facet field instance and set options
5 $facet = $facetSet->createFacetRange('topsnelheid');
6 $facet->setField('topsnelheid');
7 $facet->setStart(120);
8 $facet->setGap(10);
9 $facet->setEnd(250);
10
11 // this executes the query and returns the result
12 $resultset = $client->select($query);
select?facet=true&facet.range={!key=topsnelheid}
topsnelheid&f.topsnelheid.facet.range.start=90&f.to
psnelheid.facet.range.end=250&f.topsnelheid.facet.r
ange.gap=10
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
HOW DO I CREATE A RANGE QUERY?
=== Topsnelheid ===
[ ] 120.0 [31]
[ ] 130.0 [616]
[ ] 140.0 [2842]
[ ] 150.0 [17254]
[ ] 160.0 [15869]
[ ] 170.0 [25597]
[ ] 180.0 [29735]
[ ] 190.0 [25370]
[ ] 200.0 [17624]
[ ] 210.0 [10256]
[ ] 220.0 [6611]
[ ] 230.0 [3322]
[ ] 240.0 [1768]
select?facet=true&facet.range={!key=topsnelheid}
topsnelheid&f.topsnelheid.facet.range.start=90&f.to
psnelheid.facet.range.end=250&f.topsnelheid.facet.r
ange.gap=10
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
HOW DO YOU DEFINE A CUSTOM RANGE?
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHAT IS A FACET MULTI QUERY?
1 // get the facetset component
2 $facetSet = $query->getFacetSet();
3
4 // create a facet field instance and set options
5 $facet = $facetSet->createFacetMultiQuery(
6 array('key' => 'topsnelheid'));
7 $facet->createQuery(
8 'topsnelheid[*TO140]', 'topsnelheid:[* TO 140]');
9 $facet->createQuery(
10 'topsnelheid[141TO150]', 'topsnelheid:[141 TO 150]');
11
12 // this executes the query and returns the result
13 $resultset = $client->select($query);
select?facet=true&facet.query={!
key=topsnelheid[*TO140]}topsnelheid:[* TO
140]&facet.query={!key=topsnelheid[141TO150]}
topsnelheid:[141 TO 150]
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
BUT WHAT ABOUT THE OTHER FIELDS?
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
RESULT
GROUPING
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHAT ABOUT DIFFERENT CAR OPTIONS?
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHAT ABOUT DIFFERENT CAR OPTIONS?
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
CREATING GROUPING QUERY
1 // define the output field
2 $query->setFields(array('auto_id',
3 'merk_model_uitvoering', 'score'));
3 $query->setSorts(array('score' => 'asc'));
4
5 // get group component and create two query groups
6 $group = $query->getGrouping();
7 $group->addField('uitvoering_carrosserievorm');
8
9 $query->setQuery('+cabriolet +abs');
select?q=+cabriolet
+abs&fl=auto_id,merk_model_uitvoering,score&sort=sc
ore asc&group=true
&group.field=uitvoering_carrosserievorm
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
PIVOT
FACETING
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
ISN’T THAT GOOGLE SPREADSHEETS?
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHAT IS A DECISION TREE?
!
Audi
!
!
A3 A4
!
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
IS IT EASY TO CREATE A PIVOT FACET?
1 $query->setQuery('+cabriolet +abs');
2
3 // get the facetset component
4 $facetSet = $query->getFacetSet();
5
6 // create a facet pivot instance
7 $facet = $facetSet->createFacetPivot('merk-model');
8 $facet->addFields('merk,model');
9
10 // this executes the query and returns the result
11 $resultset = $client->select($query);
select?q=+cabriolet +abs
&facet=true&facet.pivot=merk,model
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
SEEMS SO I GUESS?
[ ] AUDI [7]
[ ] -- A4 [7]
[ ] BMW [4]
[ ] -- 3-SERIE [3]
[ ] -- 1-SERIE [1]
[ ] VOLKSWAGEN [3]
[ ] -- GOLF [2]
[ ] -- NEW BEETLE [1]
[ ] PEUGEOT [3]
[ ] -- 207 [1]
[ ] -- 306 [1]
[ ] -- 307 [1]
select?q=+cabriolet +abs
&facet=true&facet.pivot=merk,model
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
MULTI SELECT
FACETING
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHERE ARE THE ZEROES?
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
FACET MINCOUNT 0
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHERE DID LPG GO?
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
FACET MINCOUNT 1
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
DO YOU SEE ONLY THE RELEVANT MODELS?
=== Model ===
[ ] A3 (11)
[ ] A4 (19)
[ ] A6 (7)
[ ] A8 (2)
!
!
facet=true&facet.field=model&facet.mincount=1&fq=aa
nbieder_id:1&fq=merk:AUDI
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
IS THIS THE EXPECTED RESULT?
=== Model ===
[ ] A3 (11)
[X] A4 (19)
[ ] A6 (7)
[ ] A8 (2)
!
!
facet=true&facet.field=model&facet.mincount=1&fq=aa
nbieder_id:1&fq=merk:AUDI&fq=model:A4
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
OR THIS ONE?
=== Model ===
[X] A4 (19)
!
!
facet=true&facet.field=model&facet.mincount=1&fq=aa
nbieder_id:1&fq=merk:AUDI&fq=model:A4
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
TAGGING AND EXCLUDING TO THE RESCUE?
1 $query->addFilterQueries(array(
2 array('key'=>'aanbieder_id', ‘query’=>'aanbieder_id:1',
3 'tag'=>'inner'),
4 array('key'=>'merk', 'query'=>'merk:AUDI',
5 'tag'=>'inner'),
6 array('key'=>'model', 'query'=>'model:A4',
7 'tag'=>'outer')));
8
9 // get the facetset component
10 $facetSet = $query->getFacetSet();
11 $facetSet->setMinCount(1);
12 $facetSet->createFacetField(array('key'=>'model',
13 ‘field'=>'model', 'exclude'=>'outer'));
facet=true&facet.field={!key=model ex=outer}
model&facet.mincount=1&
fq={!tag:inner}aanbieder_id:1&fq={!tag=inner}
merk:AUDI&fq={!tag=outer}model:A4
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
IS THIS BETTER?
=== Model ===
[ ] A3 (11)
[X] A4 (19)
[ ] A6 (7)
[ ] A8 (2)
!
!
facet=true&facet.field={!key=model ex=outer}
model&facet.mincount=1&
fq={!tag:inner}aanbieder_id:1&fq={!tag=inner}
merk:AUDI&fq={!tag=outer}model:A4
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHERE ARE THE COUNTS?
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
FACET MINCOUNT 0
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
DID YOU JUST CREATE THE FACET TWICE?
1 $query->addFilterQueries(array(
2 array('query'=>'aanbieder_id:1', 'tag'=>'inner'),
3 array('query'=>'carrosserievorm:CABRIOLET',
4 'tag'=>'outer')));
5
6 // get the facetset component and add fields
7 $facetSet = $query->getFacetSet();
9
9 $facetSet->createFacetField(array('key'=>'cv',
10 'field'=>'carrosserievorm', 'exclude'=>'outer'));
11 $facetSet->createFacetField(array('key'=>'cv_internal',
12 'field'=>'carrosserievorm'));
select?facet=true&fq={!tag=inner}aanbieder_id:1&
fq={!tag=outer}carrosserievorm:CABRIOLET&
facet.field={!key=cv ex=outer}carrosserievorm&
facet.field={!key=cv_internal}carrosserievorm
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHAT IS THE EXPECTED RESULT?
=== CV ===
[ ] HATCHBACK [514]
[ ] STATIONWAGEN [510]
[ ] SEDAN [188]
[ ] MPV [185]
[ ] SUV/TERREINWAGEN [108]
[X] CABRIOLET [71]
select?facet=true&fq={!tag=inner}aanbieder_id:1&
fq={!tag=outer}carrosserievorm:CABRIOLET&
facet.field={!key=cv ex=outer}carrosserievorm&
facet.field={!key=cv_internal}carrosserievorm
=== CV_INTERNAL ===
[ ] HATCHBACK [0]
[ ] STATIONWAGEN [0]
[ ] SEDAN [0]
[ ] MPV [0]
[ ] SUV/TERREINWAGEN [0]
[ ] COUPE [0]
[ ] BEDRIJFSWAGEN [0]
[X] CABRIOLET [26]
[ ] PERSONENBUS [0]
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHAT IS THE EXPECTED RESULT?
!
=== CV ===
[ ] HATCHBACK [0]
[ ] STATIONWAGEN [0]
[ ] SEDAN [0]
[ ] MPV [0]
[ ] SUV/TERREINWAGEN [0]
[X] CABRIOLET [26]
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
INTERESTED IN SOME STATISTICS?
1 index, 2 web applications
!
250.000 cars, over 200 attributes per car
!
Only ~ 500Mb search index, easily run in memory
imap://mvdpolder@mail.enrise.com:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
Thank you!
Jeroen van Dijk | jrvandijk | joind.in/10916

More Related Content

Similar to Liking Relevance - PHP North East 2014

Os Pruett Sessionnotes
Os Pruett SessionnotesOs Pruett Sessionnotes
Os Pruett Sessionnotesoscon2007
 
Drupal Development (Part 2)
Drupal Development (Part 2)Drupal Development (Part 2)
Drupal Development (Part 2)Jeff Eaton
 
Biglietti, prego! A ticket for the (command) bus
Biglietti, prego! A ticket for the (command) busBiglietti, prego! A ticket for the (command) bus
Biglietti, prego! A ticket for the (command) busFrancesco Face
 
Data20161007
Data20161007Data20161007
Data20161007capegmail
 
Curso Symfony - Clase 4
Curso Symfony - Clase 4Curso Symfony - Clase 4
Curso Symfony - Clase 4Javier Eguiluz
 
Apache Solr Search Mastery
Apache Solr Search MasteryApache Solr Search Mastery
Apache Solr Search MasteryAcquia
 
Private slideshow
Private slideshowPrivate slideshow
Private slideshowsblackman
 
Rugalytics | Ruby Manor Nov 2008
Rugalytics | Ruby Manor Nov 2008Rugalytics | Ruby Manor Nov 2008
Rugalytics | Ruby Manor Nov 2008Rob
 
Bag Of Tricks From Iusethis
Bag Of Tricks From IusethisBag Of Tricks From Iusethis
Bag Of Tricks From IusethisMarcus Ramberg
 
Why Hacking WordPress Search Isn't Some Big Scary Thing
Why Hacking WordPress Search Isn't Some Big Scary ThingWhy Hacking WordPress Search Isn't Some Big Scary Thing
Why Hacking WordPress Search Isn't Some Big Scary ThingChris Reynolds
 
คู่มือการใช้โปรแกรม Pharmacy MTM
คู่มือการใช้โปรแกรม Pharmacy MTMคู่มือการใช้โปรแกรม Pharmacy MTM
คู่มือการใช้โปรแกรม Pharmacy MTMKris Phueakkham
 
Itsecteam shell
Itsecteam shellItsecteam shell
Itsecteam shellady36
 
Let jQuery Rock Your World
Let jQuery Rock Your WorldLet jQuery Rock Your World
Let jQuery Rock Your WorldMatt Gifford
 
Forms in AngularJS
Forms in AngularJSForms in AngularJS
Forms in AngularJSEyal Vardi
 
Andres ortiz - Universal Exchange
Andres ortiz - Universal ExchangeAndres ortiz - Universal Exchange
Andres ortiz - Universal ExchangeBentonGeometry
 

Similar to Liking Relevance - PHP North East 2014 (20)

Os Pruett Sessionnotes
Os Pruett SessionnotesOs Pruett Sessionnotes
Os Pruett Sessionnotes
 
Drupal Development (Part 2)
Drupal Development (Part 2)Drupal Development (Part 2)
Drupal Development (Part 2)
 
Biglietti, prego! A ticket for the (command) bus
Biglietti, prego! A ticket for the (command) busBiglietti, prego! A ticket for the (command) bus
Biglietti, prego! A ticket for the (command) bus
 
Data20161007
Data20161007Data20161007
Data20161007
 
Curso Symfony - Clase 4
Curso Symfony - Clase 4Curso Symfony - Clase 4
Curso Symfony - Clase 4
 
Apache Solr Search Mastery
Apache Solr Search MasteryApache Solr Search Mastery
Apache Solr Search Mastery
 
Private slideshow
Private slideshowPrivate slideshow
Private slideshow
 
Rugalytics | Ruby Manor Nov 2008
Rugalytics | Ruby Manor Nov 2008Rugalytics | Ruby Manor Nov 2008
Rugalytics | Ruby Manor Nov 2008
 
Bag Of Tricks From Iusethis
Bag Of Tricks From IusethisBag Of Tricks From Iusethis
Bag Of Tricks From Iusethis
 
Why Hacking WordPress Search Isn't Some Big Scary Thing
Why Hacking WordPress Search Isn't Some Big Scary ThingWhy Hacking WordPress Search Isn't Some Big Scary Thing
Why Hacking WordPress Search Isn't Some Big Scary Thing
 
Daily notes
Daily notesDaily notes
Daily notes
 
คู่มือการใช้โปรแกรม Pharmacy MTM
คู่มือการใช้โปรแกรม Pharmacy MTMคู่มือการใช้โปรแกรม Pharmacy MTM
คู่มือการใช้โปรแกรม Pharmacy MTM
 
Symfony2
Symfony2Symfony2
Symfony2
 
Itsecteam shell
Itsecteam shellItsecteam shell
Itsecteam shell
 
SUMO simulation CODES AND STEPS
SUMO simulation CODES AND STEPSSUMO simulation CODES AND STEPS
SUMO simulation CODES AND STEPS
 
Let jQuery Rock Your World
Let jQuery Rock Your WorldLet jQuery Rock Your World
Let jQuery Rock Your World
 
Forms in AngularJS
Forms in AngularJSForms in AngularJS
Forms in AngularJS
 
Ipad gump
Ipad gumpIpad gump
Ipad gump
 
R57.Php
R57.PhpR57.Php
R57.Php
 
Andres ortiz - Universal Exchange
Andres ortiz - Universal ExchangeAndres ortiz - Universal Exchange
Andres ortiz - Universal Exchange
 

More from Jeroen van Dijk

WordPress REST API hacking
WordPress REST API hackingWordPress REST API hacking
WordPress REST API hackingJeroen van Dijk
 
The Enterprise Wor/d/thy/Press
The Enterprise Wor/d/thy/PressThe Enterprise Wor/d/thy/Press
The Enterprise Wor/d/thy/PressJeroen van Dijk
 
WordPress REST API hacking
WordPress REST API hackingWordPress REST API hacking
WordPress REST API hackingJeroen van Dijk
 
The Enterprise Wor/d/thy/Press
The Enterprise Wor/d/thy/PressThe Enterprise Wor/d/thy/Press
The Enterprise Wor/d/thy/PressJeroen van Dijk
 
Beacons in Appcelerator Titanium
Beacons in Appcelerator TitaniumBeacons in Appcelerator Titanium
Beacons in Appcelerator TitaniumJeroen van Dijk
 
Teaming up WordPress API with Backbone.js in Titanium
Teaming up WordPress API with Backbone.js in TitaniumTeaming up WordPress API with Backbone.js in Titanium
Teaming up WordPress API with Backbone.js in TitaniumJeroen van Dijk
 
Teaming up WordPress API with Backbone.js in Titanium
Teaming up WordPress API with Backbone.js in TitaniumTeaming up WordPress API with Backbone.js in Titanium
Teaming up WordPress API with Backbone.js in TitaniumJeroen van Dijk
 
An app on the shoulders of giants
An app on the shoulders of giantsAn app on the shoulders of giants
An app on the shoulders of giantsJeroen van Dijk
 
Refactoring using Codeception
Refactoring using CodeceptionRefactoring using Codeception
Refactoring using CodeceptionJeroen van Dijk
 
To SQL or No(t)SQL - PHPNW12
To SQL or No(t)SQL - PHPNW12To SQL or No(t)SQL - PHPNW12
To SQL or No(t)SQL - PHPNW12Jeroen van Dijk
 
Socializing a world of travel
Socializing a world of travelSocializing a world of travel
Socializing a world of travelJeroen van Dijk
 
Varnish, the high performance valhalla?
Varnish, the high performance valhalla?Varnish, the high performance valhalla?
Varnish, the high performance valhalla?Jeroen van Dijk
 
Varnish, the high performance valhalla?
Varnish, the high performance valhalla?Varnish, the high performance valhalla?
Varnish, the high performance valhalla?Jeroen van Dijk
 
Edge Side Includes in Zend Framework without Varnish
Edge Side Includes in Zend Framework without VarnishEdge Side Includes in Zend Framework without Varnish
Edge Side Includes in Zend Framework without VarnishJeroen van Dijk
 

More from Jeroen van Dijk (14)

WordPress REST API hacking
WordPress REST API hackingWordPress REST API hacking
WordPress REST API hacking
 
The Enterprise Wor/d/thy/Press
The Enterprise Wor/d/thy/PressThe Enterprise Wor/d/thy/Press
The Enterprise Wor/d/thy/Press
 
WordPress REST API hacking
WordPress REST API hackingWordPress REST API hacking
WordPress REST API hacking
 
The Enterprise Wor/d/thy/Press
The Enterprise Wor/d/thy/PressThe Enterprise Wor/d/thy/Press
The Enterprise Wor/d/thy/Press
 
Beacons in Appcelerator Titanium
Beacons in Appcelerator TitaniumBeacons in Appcelerator Titanium
Beacons in Appcelerator Titanium
 
Teaming up WordPress API with Backbone.js in Titanium
Teaming up WordPress API with Backbone.js in TitaniumTeaming up WordPress API with Backbone.js in Titanium
Teaming up WordPress API with Backbone.js in Titanium
 
Teaming up WordPress API with Backbone.js in Titanium
Teaming up WordPress API with Backbone.js in TitaniumTeaming up WordPress API with Backbone.js in Titanium
Teaming up WordPress API with Backbone.js in Titanium
 
An app on the shoulders of giants
An app on the shoulders of giantsAn app on the shoulders of giants
An app on the shoulders of giants
 
Refactoring using Codeception
Refactoring using CodeceptionRefactoring using Codeception
Refactoring using Codeception
 
To SQL or No(t)SQL - PHPNW12
To SQL or No(t)SQL - PHPNW12To SQL or No(t)SQL - PHPNW12
To SQL or No(t)SQL - PHPNW12
 
Socializing a world of travel
Socializing a world of travelSocializing a world of travel
Socializing a world of travel
 
Varnish, the high performance valhalla?
Varnish, the high performance valhalla?Varnish, the high performance valhalla?
Varnish, the high performance valhalla?
 
Varnish, the high performance valhalla?
Varnish, the high performance valhalla?Varnish, the high performance valhalla?
Varnish, the high performance valhalla?
 
Edge Side Includes in Zend Framework without Varnish
Edge Side Includes in Zend Framework without VarnishEdge Side Includes in Zend Framework without Varnish
Edge Side Includes in Zend Framework without Varnish
 

Recently uploaded

Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesZilliz
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 

Recently uploaded (20)

Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector Databases
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 

Liking Relevance - PHP North East 2014