liking relevance - php north east 2014
DESCRIPTION
Enabling Solr or ElasticSearch in your PHP application isn't that hard these days anymore. There are multiple libraries available which can turn any collection of data into a searchable index making it as accessible as the PHP language itself. But how do you become a pro in creating the right schema, query and data analyzer? This talk will take the attendee knee deep into the problems we faced in analyzing, faceting, getting the right user experience and of course the relevant results for the second-hand car site AutoTrack where you have to ability to search on more then 200 different attributes of a car! Now you may calculate how many unique different search queries that sums up to…TRANSCRIPT
![Page 1: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/1.jpg)
TITEL DAG MAAND JAARPHP NORTH EAST 2014 JEROEN VAN DIJK
LIKING
RELEVANCE
![Page 2: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/2.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WILL I FIND WHAT I’M LOOKING FOR?
![Page 3: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/3.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
129 LINKEDIN PROFILE MATCHES
SEARCHING JEROEN VAN DIJK?
![Page 4: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/4.jpg)
imap://[email protected]: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
![Page 5: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/5.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPGjoind.in/10916
LINK: JOIND.IN
![Page 6: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/6.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHAT IS AUTOTRACK?
![Page 7: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/7.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
HOW MANY OPTIONS DO I HAVE?
![Page 8: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/8.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
NEED MORE?
![Page 9: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/9.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHERE TO START?
![Page 10: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/10.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
HOW DO YOU SEARCH?
SOLR
![Page 11: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/11.jpg)
imap://[email protected]: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
![Page 12: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/12.jpg)
imap://[email protected]: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>
![Page 13: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/13.jpg)
imap://[email protected]: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>
![Page 14: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/14.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
![Page 15: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/15.jpg)
imap://[email protected]: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>
![Page 16: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/16.jpg)
imap://[email protected]: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
![Page 17: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/17.jpg)
imap://[email protected]: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
![Page 18: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/18.jpg)
imap://[email protected]: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
![Page 19: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/19.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
NO SQL?
SELECT * FROM …
![Page 20: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/20.jpg)
imap://[email protected]: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!
![Page 21: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/21.jpg)
imap://[email protected]: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
![Page 22: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/22.jpg)
imap://[email protected]: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 Solarium\Client($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_informatie,score&sort=score desc
![Page 23: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/23.jpg)
imap://[email protected]: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_informatie,score&sort=score desc&defType=dismax&qf=uitvoering^2.3 text^0.9
![Page 24: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/24.jpg)
imap://[email protected]: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_coordinaat,155000,463000)
![Page 25: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/25.jpg)
imap://[email protected]: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
![Page 26: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/26.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPGQUERIES
![Page 27: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/27.jpg)
imap://[email protected]: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 *]
![Page 28: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/28.jpg)
imap://[email protected]: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.topsnelheid.facet.range.end=250&f.topsnelheid.facet.range.gap=10
![Page 29: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/29.jpg)
imap://[email protected]: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.topsnelheid.facet.range.end=250&f.topsnelheid.facet.range.gap=10
![Page 30: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/30.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
HOW DO YOU DEFINE A CUSTOM RANGE?
![Page 31: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/31.jpg)
imap://[email protected]: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]
![Page 32: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/32.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
BUT WHAT ABOUT THE OTHER FIELDS?
![Page 33: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/33.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
RESULT
GROUPING
![Page 34: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/34.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHAT ABOUT DIFFERENT CAR OPTIONS?
![Page 35: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/35.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHAT ABOUT DIFFERENT CAR OPTIONS?
![Page 36: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/36.jpg)
imap://[email protected]: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=score asc&group=true &group.field=uitvoering_carrosserievorm
![Page 37: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/37.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
PIVOT
FACETING
![Page 38: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/38.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
ISN’T THAT GOOGLE SPREADSHEETS?
![Page 39: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/39.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHAT IS A DECISION TREE?
!
Audi !
!
A3 A4 !
![Page 40: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/40.jpg)
imap://[email protected]: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
![Page 41: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/41.jpg)
imap://[email protected]: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
![Page 42: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/42.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
MULTI SELECT
FACETING
![Page 43: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/43.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHERE ARE THE ZEROES?
![Page 44: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/44.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
FACET MINCOUNT 0
![Page 45: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/45.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHERE DID LPG GO?
![Page 46: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/46.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
FACET MINCOUNT 1
![Page 47: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/47.jpg)
imap://[email protected]: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=aanbieder_id:1&fq=merk:AUDI
![Page 48: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/48.jpg)
imap://[email protected]: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=aanbieder_id:1&fq=merk:AUDI&fq=model:A4
![Page 49: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/49.jpg)
imap://[email protected]: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=aanbieder_id:1&fq=merk:AUDI&fq=model:A4
![Page 50: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/50.jpg)
imap://[email protected]: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
![Page 51: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/51.jpg)
imap://[email protected]: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
![Page 52: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/52.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
WHERE ARE THE COUNTS?
![Page 53: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/53.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
FACET MINCOUNT 0
![Page 54: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/54.jpg)
imap://[email protected]: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
![Page 55: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/55.jpg)
imap://[email protected]: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]
![Page 56: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/56.jpg)
imap://[email protected]: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]
![Page 57: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/57.jpg)
imap://[email protected]: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
![Page 58: Liking Relevance - PHP North East 2014](https://reader034.vdocuments.site/reader034/viewer/2022051613/54c7cf274a7959755a8b45b8/html5/thumbnails/58.jpg)
imap://[email protected]:993/fetch%3EUID%3E/INBOX%3E13466?part=1.2&type=image/jpeg&filename=foto.JPG
Thank you!
Jeroen van Dijk | jrvandijk | joind.in/10916