WordPress Full Text Search med ElasticSearch

WordPress är en stor del av programvaran: Den har miljoner webbplatser men dess inbyggda sökfunktion är inte så kraftfull som möjligt. Faktum är att Automattic använder sig av en annan lösning för sökning på WordPress.com. Kolla in ett bra blogginlägg och en presentation på bloggpost och presentation på Elasticsearch hos Automattic.

WordPress-sökproblemet

Vad är det för fel på WordPress-sökning? Enkelt uttryckt är det en naiv lösning med enkel MySQL-fråga för uppslag.

  • WordPress sorterar sökresultatet efter åldern på inlägget annat än hur relevant resultatet är för söktermen.
  • Sökningen är bara en kombination av TYCKA OM, med %fråga% vilket betyder att inget index används. Utan indexering kan det snabbt döda din databas på en hög trafik webbplats om du har mycket sökning.
  • Det letar efter den exakta frasen. Om jag söker efter "zsh på arch Linux" returnerar WordPress nollresultat trots att du har många inlägg som innehåller dessa ord. Du brukar inte förvänta dig att en användare skriver in en exakt fras, gör du?
  • Den stöder inte fuzzy search. Om användarna skriver ett typsnitt har de ingen chans att få ett förväntat resultat.

Låt oss tänka på en lyrisk webbplats där användare kan komma ihåg flera ord av sången och vill hitta texterna till en hel sång. För att göra det mer komplext, låt oss säga att användare kanske inte är en engelsktalare och försöker hitta en engelsk sång. De är mycket sannolikt att skriva typsnitt när du skriver engelska, och utan fuzzy search, förlorar vi dessa användare.

Vi kommer att övervinna dessa problem genom att använda en sökmotor för att indexera och söka våra data. Vi kan tänka oss att använda MySQL Full Text Search eller något liknande. Medan det är möjligt kan det inte vara den bästa lösningen. Du måste definiera ett schema, du måste ändra standard WordPress-databasen, lägga till index och så vidare.

När du vill omregistrera ett stort bord kan du införa ett lås och förhindra att webbplatsen accepterar ett nytt inlägg eller inlämning. Dessutom är det fortfarande en träff i din MySQL-databas. På högtrafik webbplats med mycket sökning kan det sakta ner databasen. När du använder en produkt som ElasticSearch eliminerar du dessa saker. Det är snabbt, effektivt, optimerat för sökning med massor av extrafunktioner, och det är till och med schema-mindre vilket innebär att du kan lägga till, ta bort fält lätt.

I denna handledning går vi igenom följande två steg:

  1. Ställa in ElasticSearch.
  2. Konfigurera ett plugin för att indexera data i ElasticSearch och söka det.

Det bästa är att plugin kommer att återgå till standard WordPress-sökning om ElasticSearch-servern går ner.

Krav

Du måste använda en VPS för att installera en sökmotor på den. Om du använder en vanlig delad webbtjänst kan du använda OpenShift som alternativ server för att installera vår sökmotor senare.

The Beauty of ElasticSearch

ElasticSearch är en flexibel och kraftfull, distribuerad, realtidssöknings- och analysmotor. Du kan skicka data till den, och få den index och tillgänglig för sökning snabbt. Det är mycket optimerat för sitt jobb: Söka. Mer än det innehåller resultaten ett värde på hur bra data matchade sökordet. ElasticSearch levereras även med ett REST API så att du enkelt kan söka eller spela med det under testning / utveckling med ett verktyg som Sense.

Kassa på hemsidan om du vill lära dig mer om det. Deras webbplats dokumenteras i stor utsträckning. För ytterligare vägledning, kolla sidan på Stack Overflow.

1. Installera ElasticSearch på din server

Beroende på din Linux-distribution kan du behöva referera till dokumentationen för att se hur du installerar ElasticSearch. Alternativt kan du följa den generiska handledningen av ElasticSearch.

Ubuntu / Debian (eller APT-baserade distributioner)

$ wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch | apt-key add - $ sudo sh-c "echo" deb http://packages.elasticsearch.org/elasticsearch/1.1/debian stable main "> /etc/apt/sources.list" $ sudo apt-get uppdatering # Vi behöver Java för ElasticSearch $ sudo apt-get install openjdk-7-jre-headless -y $ sudo apt-get install elasticsearch # Kör elastisk sökning när du startar upp $ sudo update-rc.d elasticsearch standard 95 10 $ sudo / etc / init. d / elasticsearch start

Centos / RedHat (eller YUM-baserade distributioner)

$ rpm --import http://packages.elasticsearch.org/GPG-KEY-elasticsearch$ vim /etc/yum.repos.d/elastic.repo

Efter installationen, placera det i konfigurationsfilen ElasticSearch:

[elasticsearch-1.1] name = Elasticsearch repository för 1.1.x packagesbaseurl = http: //packages.elasticsearch.org/elasticsearch/1.1/centosgpgcheck=1gpgkey=http: //packages.elasticsearch.org/GPG-KEY-elasticsearchenabled=1

Spara filen. Och fortsätt att installera med yum. Observera att vi måste installera Java 6 från tredje parts arkiv om ditt CentOS-depot inte har Java 6.

$ sudo yum installera elasticsearch # Gör det roon när du startar $ sudo / sbin / chkconfig - lägg elasticsearch # Vi behöver Java6 + för ElasticSearch # Ignorera det här avsnittet om du hade Java6 + $ sudo rpm --import http://apt.sw.be /RPM-GPG-KEY.dag.txt $ sudo wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm $ sudo rpm -Uhv rpmforge -release-0.5.2-2.el6.rf.x86_64.rpm $ sudo yum installera java-1.6.0-openjdk.x86_64 -y # Starta det $ sudo service elasticsearch start 

Efter att du startat ElasticSearch kan du bekräfta att den fungerar korrekt genom att besöka din domän på port 9200 som yourdomain.com:9200 i webbläsare eller genom att utföra en ringla begäran.

$ curl 127.0.0.1:9200 "ok": sant "status": 200, "namn": "Jessica Jones", "version": "number": "0.90.7", "build_hash": "36897d07dadcb70886db7f149e645ed3d44eb5f2 "," build_timestamp ":" 2013-11-13T12: 06: 54Z "," build_snapshot ": falskt," lucene_version ":" 4.5.1 "," tagline ":" Du vet, för sökning "

Om du inte har en VPS och fortfarande vill använda den kan du använda en plattform som OpenShift för att installera ElasticSearch på den. Om du installerade ElasticSearch på din server, gå vidare till nästa avsnitt.

2. Installera ElasticSearch på OpenShift

ElasticSearch kan enkelt installeras via nedladdning av mjukvarupaketet och kör binären. Java 6 är det enda beroende som den har. OpenShift ger oss en form av en virtuell server som vi kan installera vår egen programvara på den.

Registrera dig för ett konto på https://www.openshift.com/. Logga sedan in på instrumentpanelen eller skriv in den här adressen https://openshift.redhat.com/app/console/applications efter att du har loggat in. Klicka på "Program", Skriv "DIY" för att filtrera rutan.

Klicka sedan på titeln "Gör-det-själv 0.1" för att lägga till programmet på ditt konto. Det innebär att vi kommer att installera programmet själva. Härifrån har du möjlighet att namnge din app och få en underdomän som appnamesubdomain.rhccloud.com. Vänta ett ögonblick för att provisioning ska slutföras och klicka sedan på "Fortsätt till programöversiktssidan" för att gå till din översiktssida för program.

På den sidan ser du domännamnet på din ansökan. Vi behöver det senare för att konfigurera webbadressen för ElasticSearch-servern. Nederst till höger kan du se "fjärråtkomst". Med den här åtkomsten kommer vi att kunna köra kommandot Shell och installera saker precis som vi gör med en vanlig VPS. Vi samlar SSH-information till fjärråtkomst i vår app och installerar ElasticSearch på den.

Notera ssh [email protected] kommando, vi kommer att använda den för att fjärråtkomst till vår server på OpenShift. diy-notyim.rhcloud.com är din serveradress, ssh är det kommando vi använder för fjärråtkomst.

För att logga in via SSH måste du ge din offentliga nyckel till OpenShift. Klicka på Miljö fliken och klicka sedan på Lägg till ny nyckel ...

Kopiera och klistra in innehållet på din offentliga nyckel i det. Din pubic nyckel är vanligtvis i ~ / .Ssh / id_rsa.pub. Om du inte är bekant med offentliga nycklar, läs dessa handledning om hur du genererar dem:

  1. Ställa in SSH-tangenter
  2. SSH: Vad och Hur

När du har lagt till din nyckel på OpenShift-webbplatsen, utfärdar du det här kommandot för att ansluta till det. Observera att din adress kommer att skilja sig från min.

ssh [email protected]
Du kommer att välkomnas med en skärm så här:
 ************************************************** ******************* Du får tillgång till en tjänst som endast används av behöriga användare. Om du inte har behörighet, avbryt användningen genast. Eventuella användningar av tjänsterna omfattas av gällande villkor i avtalet, som finns på: https://www.openshift.com/legal ******************* ************************************************** Välkommen till OpenShift-skalet Det här skalet hjälper dig att hantera OpenShift-applikationer. !!! VIKTIG !!! VIKTIG !!! VIKTIG !!! Shell-åtkomst är ganska kraftfull och det är möjligt för dig att oavsiktligt skada din ansökan. Fortsätt med försiktighet! Om det värre kommer värst, förstör din ansökan med "rhc app delete" och återskapa det !!! VIKTIG !!! VIKTIG !!! VIKTIG !!! Skriv "hjälp" för mer info. [diy-notyim.rhcloud.com 536ea3e4500446d9db000279] \>

Vi kommer att ladda ner och installera ElasticSearch manuellt. Vi måste dock lagra nedladdningsfilen i mappen $ OPENSHIFT_DATA_DIR på grund av dess uthållighet mellan utplacering. Under implementeringen avlägsnar OpenShift nästan alla filer och mappar och använder bygginstruktionen i applikationskroken för att bygga och distribuera din ansökan.

Observera att OpenShift har en särskild mapp som används för att lagra uthållig data mellan flera implementeringar. $ OPENSHIFT_DATA_DIR är den miljövariabla lagringsbanan. Problem nedan för att ladda ner, installera och köra ElasticSearch.

$ cd $ OPENSHIFT_DATA_DIR $ wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.1.1.tar.gz $ tar xvf elasticsearch-1.1.1.tar.gz $ cd elasticsearch-1.1.1 
När du är inne i mappen elasticsearch-1.1.1, du måste ändra nycklarna och värdena i filen config / elasticsearch.yml. Du kan använda nano eller vi / vim för att redigera filen och redigera det här värdet
network.host: $ OPENSHIFT_DIY_IP transport.tcp.port: 3306 http.port: $ OPENSHIFT_DIY_PORT discovery.zen.ping.multicast.enabled: false discovery.zen.ping.unicast.hosts: []
När du redigerar och sparar den. Starta ElasticSearch.
# Stoppa standard DIY app för att släppa porten $ ctl_app stop $ bin / elasticsearch &
Vänta en stund för att den ska startas. Härifrån kan din ElasticSearch-URL nås via den domän som vi installerat tidigare. I mitt fall är det http://diy-notyim.rhccloud.com. Observera att vi inte använder standardport 9200 eftersom OpenShift inte tillåter oss att binda till det. Därför använder vi port 8080 som fastställs av miljövariabeln $ OPENSHIFT_DIY_PORT. Vi binder bara till vår interna IP, och OpenShift kommer att vidarebefordra till allmän IP på port 80 för oss. På grund av det kan du komma direkt till URL http://diy-notyim.rhccloud.com utan att ange någon port. Vi måste också stoppa DIY intern app med ctl_app sluta släppa porten innan du kör elasticsearch.Kör ElasticSearch på OpenShift, bindande på port 8080 istället för port 9200

3. Ställa in plugin

Hämta och installera plugin från WordPress plugin-arkiv. Extrahera det i wp-content / plugins mappen och aktivera den. Eller om du använder wp-cli, det är lätt som paj.

wp installera fantastiskt-elasticsearch wp aktivera fantastiskt-elasticsearch

Om du laddar om WordPress-instrumentpanelen ska ett nytt menyalternativ för ElasticSearch visas. Härifrån, låt oss konfigurera det.

De flesta fälten beskrivs tydligt för att hjälpa dig att ställa upp det. Nedan följer några sammanfattningar.

WordPress Integration

Den här fliken innehåller inställningen för att aktivera ElasticSearch eller inte. Med den här fliken kan vi också välja vilka kategorier som ska finnas i ElasticSearch.

Serverinställningar

Konfigurera ElasticSearch-servern och indexnamnet. Indexnamnet är som databasnamnet i MySQL. Du har en MySQL-server och flera databaser inuti den. Du kan använda namnet där så länge det används av olika tjänster.

Om ElasticSearch är installerat på samma maskin och använd standardinställningen kan du lämna servernamn tomt. Ange annars din webbadress. Om jag till exempel använde OpenShift som beskrivs om skulle jag ange http://diy-notyim.rhcloud.com/ som serverns URL.

Content Indexing

Du kan välja vilka posttyp, postfält eller taxonomifält som ska indexeras av ElasticSearch. När ett objekt är indexerat, kommer det att sökas via ElasticSearch. Du kan välja att indexera inlägg, sidor, anpassade fält eller någon anpassad posttyp beroende på ditt behov.

Resultatresultat

Det här är en viktig sak att sortera resultatet. Exempelvis kan en matchning i posttitel betraktas som mer exakt än en matchning i inläggsinnehåll. Därför bör vi sätta ett poängvärde mindre för inläggets innehåll. På samma sätt, om en tagg match är mer värdefull än en match i titeln, kommer vi att ange ett högre värde för post_tag.

Min poäng inställning, du bör ändra och anta det till ditt eget krav

Fuzziness Prefix Length

Detta hänvisar till antalet tecken kan bytas ut för att matcha ord. Till exempel: Om jag sökte efter Lonux, sedan Linux betraktar fortfarande en match: L (i) nux-> L (o) nux. Ju mindre antal, ju bättre prestanda. Ställ inte in det för högt. Jag tycker att 0-2 är mest rimliga.

Hantera index

När allt är konfigurerat eller ändrat, är det dags att tillämpa ändringen. När du klickar på nytt index ska det visa något som nedan:

Efter indexering är klar. Försök att söka efter något på din webbplats, söka efter en fras, växla sökningen till / från mellan standard och ElasticSearch för att se skillnaden. Här är mitt sökresultat med standard WordPress-sökning:

Inget resultat när du söker zsh arch linux med standard sökning

Här är sökresultatet med ElasticSearch.

Ett gäng stolpe med ElasticSearch

Slutsats

Med några få enkla steg har vi satt upp en kraftfull sökmotor på vår webbplats. Ju mer exakt sökresultatet är desto bättre upplevelse kommer besökarna att ha. Om din webbplats har tung trafik och en enda ElasticSearch-installation inte kan hantera sökning, kan du lägga till fler noder till ElasticSearch för att göra en distribuerad sökning.

Observera att ElasticSearch som standard inte kommer med autentisering, men du bör nog använda en brandvägg för att begränsa tillgången till ElasticSearch från offentliga IP-adresser. Eller kanske ett bättre sätt är att binda ElasticSearch till intern IP och göra den tillgänglig endast via LAN.

Vänligen lämna kommentar och meddela hur din webbplats fungerar efter installationen av det här plugin.