Views: zoeken op verschillende velden tegelijkertijd

Probleemstelling

Je kunt makkelijk in een view een veldfilter zichtbaar maken. vb Straat vb Postnummer. In sommige gevallen is het praktisch als je zou kunnen tegelijkertijd op meerdere velden filteren. Straat + Postnummer is zo'n voorbeeld. Er zijn nu eenmaal veel Kerkstraten in Vlaanderen en als je ook in hetzelfde veld het postnummer zou kunnen inputten, dan wordt de filter zeer bruikbaar, met auto-aanvulling natuurlijk...

Een tweede zaak die we moeten in het oog houden is de snelheid. Als er duizenden nodes zijn moeten we rekening houden dat de auto-aanvulling dit niet aankan.

Laten we beginnen met een simpel voorbeeld om de problematiek uiteen te zetten.

We willen in één zoekvenster, zowel op de straatnaam als op het postnummer filteren.

Hoe doe je dit?

Eerst moeten we een onderscheid maken tussen geïndexeerd zoeken en gewoon zoeken. Geïndexeerd zoeken doe je met de module Search API die op voorhand een tabel (index) aanmaakt van alle mogelijke zoektermen. Dit levert een enorme tijdswinst op, aangezien de zoekactie reeds vooraf heeft plaatsgehad. Daarvoor wordt er in de database een aparte tabel aangemaakt die de zoektermen bevat, samen met de links naar de inhoud die deze zoekterm moet opleveren. 

Als je bijvoorbeeld als staatnaam 'Kerkstraat' hebt en je hebt de processor op 3 tekens minimum ingesteld dan zal in deze index de volgende info opgeslagen worden. Ker, erk, rks, kst, str, tra, raa, aat. Die allen leiden naar Kerkstraat en de bijhorende node id's of taxonomie id's. Je begrijpt dat deze tabel aanzienlijk groot kan worden. Toch is dit noodzakelijk als je met meer dan honderd items werkt..

We gaan echter beide opties bespreken.

Niet-geïndexeerd zoeken op meerdere velden.

Om zowel op de straat als het postnummer te kunnen filteren moeten we een filter van het type 'veldenfilter combineren' gebruiken. dit wordt standaard voorzien in Drupal.


Je kiest de velden:


Yep.


en ja hoor.. bij het intypen van ofwel de straat of postnummer wordt er gefilterd.


Nadeel: het werkt perfect, maar auto-aanvulling (ook met de module Views autocomplete filters) werkt niet op beide velden tegelijkertijd. 

Geïndexeerd zoeken op meerdere velden

Om dit te doen heb je de volgende module nodig: Search API  https://www.drupal.org/project/search_api . Je hebt deze module ook nodig als je met facets werkt. Facets zijn hier echter onbruikbaar. Een keuzelijst of vinkjes met alle straten van Vlaanderen lijken me niet opportuun..

Je installeert best ook al de auto aanvulling voor dit soort zoekvensters : Search API Autocomplete https://www.drupal.org/project/search_api_autocomplete. Ik heb ondervonden dat deze laatste module niet compatibel is met de gewone Views autocomplete filter. Best deze laatste dus desinstalleren als je dit ooit gebruikt hebt..

Via de instellingen gaan we eerst een 'server' aanmaken. Geef het kind een naam en stel bvb deze zaken in.

Nu gaan we op deze server een index instellen.



Bij de processor van deze index (= tablad) stel je bij voorkeur dit in:


Nu gaan we de velden kiezen die moeten geïndexeerd worden.. Kies Fulltext als je op een gedeelte van de naam wilt zoeken (dan kan je filter 'bevat' instellen).

Nu komt het sleutelmoment... Je kan nu ook een veld toevoegen van het type 'aggregated field'. Dit type laat toe om een unie te maken van verschillende zoekvelden en brengt die samen tot één geheel.


Kies de velden


Nu moet je nog enkel indexeren. Dit moet je trouwens telkens doen als je de instellingen wijzigt. Bij duizenden items kan dit wel een tijdje duren..

Nu maken we de view aan die dit alles moet combineren. De view moet van het type index zijn, en NIET van de gebruikelijke 'Inhoud'.

 


Merk het filterveld 'Aggregated Field' op. Dit is het zoekvenster dat alles zal regelen.

De filter zou nu moeten werken, maar zonder auto-aanvulling.

Als je auto-aanvulling wilt voor de Search API, moet je de bijhorende module ingeschakeld hebben (zie vroeger). Je krijgt dan bij de search api instellingen een tabblad bij.

Stel in..

Nu moet je een weergavemodus kiezen. Je kunt de teaser instellen met de velden die je wilt tonen. Ik heb hier een nieuwe weergavemodus aangemaakt en gebruikt. Met wat CSS kan je deze dropdown naar je hand zetten... (altijd wat zoekwerk...) Als je de titel er niet bij wilt, zal je die moeten met CSS verwijderen ofwel een module gebruiken om die te verbergen. ( vb Exclude node title)



Als je nu met Feeds duizenden straten invoegt, dan zal dit principe nog altijd werken... 

Praktijkvoorbeeld

Een voorbeeldje dat films en hun productiejaar filtert voor een site met 25 000 films... 

Met de 2 velden: