WordPress on monipuolinen sisällönhallintajärjestelmä, jossa on paljon sisäänrakennettuja toiminnallisuuksia. Yksi näistä on haku. Valitettavasti se ei ole kuitenkaan erityisen kehittynyt: oletuksena haku hakee tuloksia ainoastaan sivujen ja kirjoitusten otsikoista ja leipäteksistä. Haku ei osaa hakea tekstiä räätälöidyistä kentistä. Jos esimerkiksi käytät Advanced Custom Fields -lisäosaa, kaikkien näiden kenttien sisältö on haulle näkymätöntä.
WordPress -filosofian mukaan sisäänrakennettuja toiminallisuuksia voi ja pitääkin laajentaa kolmannen osapuolen lisäosien avulla. Meillä onkin kaksi erittäin hyvää vaihtoehtoa haun parantamiseen: SearchWP ja Relevanssi. Tässä kirjoituksessa käsitellään SearchWP:tä.
Pelkästään asentamalla SearchWP:n, WordPressin haku paranee huomattavasti. Hakuun voi liittää mukaan kaikki tarvittavat kentät ja kirjoitustyypit. Eri kentille voi antaa eri painoarvoja, esimerkiksi jos hakutermi esiintyy otsikossa, se on todennäköisesti tärkeämpi kuin sana joka esiintyy artikkelin leipätekstissä. Haku myös listaa tulokset relevanssin mukaisesti, mitä useampi hakutermin sana esiintyy tuloksessa, sitä korkeammalle se nousee.
Toisin kuin WordPressin oletushaku, SearchWP käyttää hakuindeksiä. Kaikki sivustolla käytettävät sanat ja tieto siitä, missä kirjoituksessa niitä käytetään tallennetaan tietokantaan. Näin tiettyä hakusanaa vastaavat dokumentit voidaan noutaa nopeasti tietokannasta.
Esimerkki hakuindeksistä. Hakusanoja vastaavat dokumentit on tallennettu tietokantaan.
Stemmaus on tapa parantaa haun tarkkuutta. Esimerkiksi jos käyttäjä tekee haun hakusanalla “koirien kouluttaminen” hänelle on todennäköisesti relevantti myös sivu, joka otsikko on “kuinka kouluttaa koira”. Vaikka näissä kummassakin on kaksi samaa sanaa, “kouluttaminen” ja “koira”, naiivi hakukone ei osaa yhdistää näitä sivuja toisiinsa, koska sanat ovat eri muodossa. Stemmauksessa sanoista poistetaan päätteet ennen kuin ne tallennetaan tietokantaan. Esimerkiksi tekstissä esiintyvä termi “koirien kouluttaminen” voitaisiin stammata muotoon “koir koulut”. Sama prosessi tehdään käyttäjän antamalle hakusanalle. Näin haku saadaan kohdistumaan dokumentteihin, joissa on hakusanan eri muotoja eikä sanaa tarvitse antaa tismalleen siinä muodossa jossa se esiintyy dokumentissa.
Stemmaus on yksinkertaista ja toimivaa kielissä kuten englannissa, jossa sanoilla on vain muutamia muotoja. Englanninkielinen stemmeri tuleekin mukana SearchWP:ssä. Stemmaaminen on kuitenkin haastavaa suomen kielessä, koska siinä on satoja erilaisia sanan päätteitä. Tälläisissä tapauksissa voidaan stemmauksen sijaan käyttää lemmausta, jossa sana muutetaan perusmuotoon ennen kuin se indeksoidaan. Toisin kuin stemmaus joka on perustuu päätteiden poistamiseen ja saattaa välillä poistaa päätteitä väärin, lemmaus perustuu sanakirjaan ja toimii tämän takia tarkemmin.
Suomen kielen lemmauksessa voi käyttää avoimen lähdekoodin Voikko-kirjastoa.
Halusin selvittää kuinka WordPressin hakutulosten tarkkuutta voisi parantaa Voikon avulla. Päädyin kirjoittamaan SearchWP-yhteensopivan lisäosan joka lemmaa sanat indeksoinnin aikana. SearchWP:n oma stemmaustuki ei valitettavasti toiminut lemmauksen kanssa, koska se oli suunniteltu ainoastaan stemmausta varten. Näin ollen se ei toiminut jos saman stemmi poikkesi perusmuodosta edes yhdellä kirjaimella. Päädyin lopulta tallentamaan dokumentissa esiintyvien sanojen perusmuodot hakuindeksiin normaalien sanamuotojen lisäksi. Näin dokumentit voi löytää hausta täsmällisten sanojen lisäksi myös perusmuodolla. Lisäosassa on myös vaihtoehto lisätä käyttäjän syöttämään hakutermiin sanojen lemmatut muodot.
Yksi haaste oli saada Voikko toimimaan WordPressissä. Voikon voi asentaa useampiin Linux-distibuutioihin, mutta siinä ei ole rajapintaa, joka toimisi PHP:n kanssa. Päädyin lopulta käyttämään Voikon Node.js-versiota, joka on käännetty alkuperäisestä C-kirjastosta Emscriptenin avulla. Koska kirjaston käyttäminen oli komentoriviltä liian hidasta, kirjoitin Express-frameworkillä web servicen, jota voi käyttää HTTP:n yli. Näin Voikko toimii WordPress-lisäosassa, kunhan vain määrittelet URL-osoitteen, johon API on asennettu.
Voikon analyze-komennolla voi hakea tietoja yksittäisestä suomen kielen sanasta
Näin WordPressin hausta saa kahdella lisäosalla paljon tarkemman. Käyttäjäkokemus parantuu, kun hakija löytää enemmän relevantteja hakutuloksia eikä hänen tarvitse miettiä missä muodossa hakutermi pitää antaa. Vaikka haku ei tietenkään vedä vertoja Googlelle, joka osaa hakutermien lisäksi myös ymmärtää käyttäjän aikomukset, on se huomattavasti WordPressin oletushakua parempi. Suomen kieli lisää omat haasteensa haun toteuttamiseen.
Esimerkki SearchWP Finnish Base Forms -lisäosalla toteutetusta hausta. Haku ymmärtää käyttäjän syöttämän hakusanan eri muodot oikein.
SearchWP Finnish Base Forms -lisäosa on ladattavissa GitHubista.
Päivitys: Jos käytät Relevanssia SearchWP:n sijasta, löytyy tälle myös oma versio pluginista.