WordPress Zoeken in volledige tekst met ElasticSearch

WordPress is een geweldig stukje software: het maakt miljoenen websites van websites mogelijk, hoewel de native zoekfunctie niet zo krachtig is als mogelijk. In feite gebruikt Automattic zelf een andere oplossing voor zoeken op WordPress.com. Bekijk een geweldige blogpost en presentatie op blogpost en presentatie op Elasticsearch op Automattic.

Het probleem met WordPress Search

Wat is er mis met de zoekfunctie van WordPress? Simpel gezegd, het is een naïeve oplossing met eenvoudige MySQL-query voor opzoeken.

  • WordPress sorteert het zoekresultaat op de leeftijd van het bericht anders dan hoe relevant het resultaat is voor de zoekterm.
  • De zoekopdracht is slechts een combinatie van NET ZOALS, met % Query% wat betekent dat er geen index wordt gebruikt. Zonder indexering kan het uw database snel doden op een site met veel verkeer als u veel zoekt.
  • Het zoekt naar de exacte zin. Als ik naar "zsh op arch linux" zoek, geeft WordPress nul resultaten, ook al heb je veel posts met deze woorden. Normaal verwacht je niet dat een gebruiker een exacte zin invoert, of wel?
  • Het biedt geen ondersteuning voor fuzzy zoeken. Als gebruikers een typfout maken, hebben ze geen kans om een ​​verwacht resultaat te krijgen.

Laten we een lyrische site bedenken waarbij gebruikers verschillende woorden van het nummer onthouden en de tekst van een heel nummer willen vinden. Om dit complexer te maken, laten we zeggen dat gebruikers mogelijk geen Engelssprekende spreker zijn en een Engels nummer proberen te vinden. Ze zullen zeer waarschijnlijk typfouten maken bij het typen van Engels, en zonder fuzzy search verliezen we die gebruikers.

We zullen deze problemen oplossen door een zoekmachine te gebruiken om onze gegevens te indexeren en te doorzoeken. We kunnen denken aan het gebruik van MySQL Full Text Search of iets dergelijks. Hoewel het mogelijk is, is het misschien niet de beste oplossing. U moet een schema definiëren, u moet de standaard WordPress-database wijzigen, indexen toevoegen, enzovoort.

Wanneer u een grote tafel opnieuw wilt indexeren, kunt u een vergrendeling introduceren en voorkomen dat de site een nieuwe post of inzending accepteert. Bovendien is dat nog steeds een hit voor uw MySQL-database. Op veelbelovende sites met veel zoekacties, kan het de database vertragen. Wanneer u een product zoals ElasticSearch gebruikt, verwijdert u die dingen. Het is snel, efficiënt, geoptimaliseerd voor zoeken met veel extra functies en het is zelfs een schemaloze betekenis die u kunt toevoegen, gemakkelijk velden kunt verwijderen.

In deze zelfstudie bespreken we de volgende twee stappen:

  1. ElasticSearch instellen.
  2. Configureer een plug-in om de gegevens in ElasticSearch te indexeren en te doorzoeken.

Het goede ding is dat de plugin terugvalt naar de standaard WordPress-zoekopdracht als de ElasticSearch-server uitvalt.

Vereisten

Je moet een VPS gebruiken om er een zoekmachine op te installeren. Als u een normale shared hosting-service gebruikt, kunt u OpenShift als alternatieve server gebruiken om onze zoekmachine later te installeren.

De schoonheid van ElasticSearch

ElasticSearch is een flexibele en krachtige, gedistribueerde, realtime zoek- en analyse-engine. U kunt de gegevens erin verzenden en deze indexeren en snel beschikbaar maken voor zoeken. Het is sterk geoptimaliseerd voor zijn taak: zoeken. Meer dan dat, de resultaten bevatten een waarde van hoe goed de gegevens overeenkwamen met de zoekterm. ElasticSearch wordt zelfs geleverd met een REST API waarmee je gemakkelijk zoekopdrachten kunt doorzoeken of ermee kunt spelen tijdens het testen / ontwikkelen met een tool zoals Sense.

Bekijk de startpagina als u er meer over wilt weten. Hun site is uitgebreid gedocumenteerd. Raadpleeg de pagina over Stack Overflow voor meer informatie.

1. ElasticSearch op uw server installeren

Afhankelijk van uw Linux-distributie, moet u mogelijk de documentatie raadplegen om te zien hoe ElasticSearch moet worden geïnstalleerd. U kunt ook de generieke zelfstudie van ElasticSearch volgen.

Ubuntu / Debian (of op APT gebaseerde distributies)

$ 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 update # We heb Java nodig voor ElasticSearch $ sudo apt-get install openjdk-7-jre-headless -y $ sudo apt-get install elasticsearch # Run elasticsearch bij het opstarten $ sudo update-rc.d elasticsearch default default 95 10 $ sudo / etc / init. d / elasticsearch start

Centos / RedHat (of YUM-gebaseerde distributies)

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

Plaats dit na installatie in het ElasticSearch-configuratiebestand:

[elasticsearch-1.1] name = Elasticsearch-repository voor 1.1.x packagesbaseurl = http: //packages.elasticsearch.org/elasticsearch/1.1centerpgpgcheck=1gpgkey=http: //packages.elasticsearch.org/GPG-KEY-elasticsearchenabled=1

Sla het bestand op. En blijf installeren met yum. Merk op dat we Java 6 vanuit een repository van derden moeten installeren als je CentOS-repository geen Java 6 heeft.

$ sudo yum install elasticsearch # Maak het roon tijdens het opstarten $ sudo / sbin / chkconfig --add elasticsearch # We hebben Java6 + nodig voor ElasticSearch # Negeer dit gedeelte als je Java6 + $ sudo rpm had - import http://apt.sw.be /RPM-GPG-KEY.dag.txt $ sudo wget http://packages.sw.be/rpmforgesrelease/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 install java-1.6.0-openjdk.x86_64 -y # Start het $ sudo service elasticsearch start 

Nadat u ElasticSearch hebt gestart, kunt u bevestigen dat het goed werkt door uw domein op poort 9200 te bezoeken als yourdomain.com:9200 in browser of door het uitvoeren van een Krul verzoek.

$ curl 127.0.0.1:9200 "ok": true, "status": 200, "name": "Jessica Jones", "version": "number": "0.90.7", "build_hash": "36897d07dadcb70886db7f149e645ed3d44eb5f2 "," build_timestamp ":" 2013-11-13T12: 06: 54Z "," build_snapshot ": false," lucene_version ":" 4.5.1 "," tagline ":" You Know, for Search "

Als je geen VPS hebt en toch wilt gebruiken, kun je een platform zoals OpenShift gebruiken om ElasticSearch erop te installeren. Als u ElasticSearch op uw server hebt geïnstalleerd, gaat u verder met het volgende gedeelte.

2. ElasticSearch installeren op OpenShift

ElasticSearch kan eenvoudig worden geïnstalleerd via het downloaden van het softwarepakket en het uitvoeren van het binaire bestand. Java 6 is de enige afhankelijkheid die het heeft. OpenShift geeft ons een soort van virtuele server waar we onze eigen software op kunnen installeren.

Registreer voor een account op https://www.openshift.com/. Meld u vervolgens aan op uw dashboard of voer deze URL in https://openshift.redhat.com/app/console/applications nadat u bent ingelogd. Klik op 'Toepassingen', typ 'DIY' om het vak te filteren.

Klik vervolgens op de titel "Doe-het-zelf 0.1" om de applicatie aan uw account toe te voegen. Dit betekent dat we de applicatie zelf zullen instellen. Vanaf hier heeft u de mogelijkheid om uw app een naam te geven en een subdomein te krijgen appnamesubdomain.rhccloud.com. Wacht even totdat de provisioning is voltooid en klik vervolgens op "Doorgaan naar de pagina met het toepassingsoverzicht" om naar de pagina met toepassingsoverzicht te gaan.

Op die pagina ziet u de domeinnaam van uw toepassing. We hebben het later nodig om de ElasticSearch-server-URL te configureren. Rechtsonder kunt u de "Remote Access" zien. Met deze toegang kunnen we de shell-opdracht en het installatie-item uitvoeren, net zoals we doen met een normale VPS. We zullen SSH-informatie verzamelen voor externe toegang tot onze app en ElasticSearch daarop installeren.

Merk op ssh [email protected] opdracht, gebruiken we deze om externe toegang tot onze server op OpenShift te krijgen. diy-notyim.rhcloud.com is uw serveradres, ssh is de opdracht die we gebruiken voor externe toegang.

Om in te loggen via SSH, moet je je publieke sleutel geven aan OpenShift. Klik op de omgeving tab en klik vervolgens op Voeg een nieuwe sleutel toe ...

Kopieer en plak de inhoud van uw openbare sleutel erin. Je schuine sleutel zit meestal in ~ / .Ssh / id_rsa.pub. Als u niet bekend bent met openbare sleutels, leest u deze zelfstudies over het genereren van deze sleutels:

  1. SSH-sleutels instellen
  2. SSH: wat en hoe

Nadat u uw sleutel op de OpenShift-website hebt toegevoegd, geeft u deze opdracht om er verbinding mee te maken. Houd er rekening mee dat uw adres anders is dan het mijne.

ssh [email protected]
Je wordt verwelkomd met een scherm als dit:
 ************************************************** ******************* U hebt toegang tot een service die alleen door geautoriseerde gebruikers kan worden gebruikt. Als u geen autorisatie heeft, stop dan het gebruik in een keer. Elk gebruik van de services is onderworpen aan de toepasselijke voorwaarden van de overeenkomst die te vinden zijn op: https://www.openshift.com/legal ******************* ************************************************** Welkom bij OpenShift shell Deze shell helpt je bij het beheer van OpenShift-applicaties. !!! BELANGRIJK !!! BELANGRIJK !!! BELANGRIJK !!! Shell-toegang is vrij krachtig en het is mogelijk dat u per ongeluk uw toepassing beschadigt. Ga voorzichtig te werk! Als het erger wordt, vernietig dan je applicatie met "rhc app delete" en maak het opnieuw !!! BELANGRIJK !!! BELANGRIJK !!! BELANGRIJK !!! Type "help" voor meer info. [diy-notyim.rhcloud.com 536ea3e4500446d9db000279] \>

We zullen ElasticSearch handmatig downloaden en installeren. We moeten het downloadbestand echter opslaan in een map $ OPENSHIFT_DATA_DIR vanwege de persistentie tussen inzet. Tijdens de implementatie verwijdert OpenShift bijna alle bestanden en mappen en gebruikt de buildinstructie in de toepassinghaak om uw toepassing te bouwen en te implementeren..

Merk op dat OpenShift een speciale map heeft die wordt gebruikt om persistente gegevens tussen meerdere implementaties op te slaan. $ OPENSHIFT_DATA_DIR is het omgevingsvariabele opslagpad. Geef de onderstaande opdracht opdracht om ElasticSearch te downloaden, installeren en uitvoeren.

$ 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 
Als je eenmaal binnen de map bent elasticsearch-1.1.1, je moet de sleutels en waarden in het bestand wijzigen config / elasticsearch.yml. U kunt nano of vi / vim gebruiken om het bestand te bewerken en die waarde te bewerken
network.host: $ OPENSHIFT_DIY_IP transport.tcp.port: 3306 http.port: $ OPENSHIFT_DIY_PORT discovery.zen.ping.multicast.ingabled: false discovery.zen.ping.unicast.hosts: []
Nadat u deze hebt bewerkt en opgeslagen. Start ElasticSearch.
# Stop standaard DIY-app om de poort vrij te maken $ ctl_app stop $ bin / elasticsearch &
Wacht even om te starten. Vanaf hier is uw ElasticSearch-URL bereikbaar via het domein dat we eerder hebben ingesteld. In mijn geval is het http://diy-notyim.rhccloud.com. Merk op dat we geen standaard poort 9200 gebruiken omdat OpenShift ons niet toestaat om eraan te binden; daarom gebruiken we poort 8080 die wordt ingesteld door de omgevingsvariabele $ OPENSHIFT_DIY_PORT. We binden alleen voor ons interne IP-adres en OpenShift zal voor ons doorsturen naar openbaar IP op poort 80. Daarom hebt u direct toegang tot de URL http://diy-notyim.rhccloud.com zonder een poort op te geven. We moeten ook de interne DIY-app stoppen met ctl_app stop om de poort vrij te geven voordat u begint elasticsearch.Het uitvoeren van ElasticSearch op OpenShift, waarbij poort 8080 wordt gebonden in plaats van poort 9200

3. De plug-in instellen

Download en installeer plug-in in de WordPress plug-inrepository. Extraheer het in de wp-content / plugins map en activeer het. Of als u gebruikt wp-cli, het is eenvoudig als taart.

wp installeert fantastic-elasticsearch wp activeert fantastic-elasticsearch

Herladen van het WordPress-dashboard, een nieuw menu-item voor ElasticSearch zou moeten verschijnen. Van hier, laten we het configureren.

De meeste velden zijn duidelijk beschreven om u te helpen bij het instellen ervan. Hieronder zijn enkele samenvatten.

WordPress-integratie

Dit tabblad bevat de instelling om ElasticSearch in te schakelen of niet. Op dit tabblad kunnen we ook selecteren welke categorieën binnen ElasticSearch moeten worden opgenomen.

Server instellingen

Configureer de ElasticSearch-server en indexnaam. De indexnaam is vergelijkbaar met de databasenaam in MySQL. Je hebt een MySQL-server en meerdere databases erin. U kunt elke naam daar gebruiken zolang deze door een andere service wordt gebruikt.

Als ElasticSearch op dezelfde machine is geïnstalleerd en de standaardinstelling gebruikt, kunt u de servernaam leeg laten; anders geef je je URL op. Als ik bijvoorbeeld OpenShift gebruikte zoals beschreven, zou ik http://diy-notyim.rhcloud.com/ invoeren als de server-URL.

Inhoudsindexering

U kunt kiezen welke velden voor het posttype, postveld of taxonomie moeten worden geïndexeerd door ElasticSearch. Zodra een item is geïndexeerd, kan het worden doorzocht via ElasticSearch. U kunt ervoor kiezen om berichten, pagina's, aangepaste velden of elk aangepast berichttype te indexeren, afhankelijk van wat u nodig hebt.

Resultaat Scoren

Dit is belangrijk om het resultaat te sorteren. Een overeenkomst in de berichttitel kan bijvoorbeeld nauwkeuriger worden beschouwd dan een overeenkomst in berichtinhoud. Daarom moeten we een scorewaarde kleiner maken voor berichtinhoud. Evenzo, als een tag-match waardevoller is dan een match in de titel, zullen we een hogere waarde instellen voor post_tag.

Mijn score-instelling, moet u wijzigen en dit naar uw eigen behoefte aanpassen

Fuzziness Prefix Length

Dit verwijst naar het aantal tekens dat kan worden verwisseld om overeen te komen met woorden. Bijvoorbeeld: als ik heb gezocht Lonux, dan Linux is nog steeds een match: L (i) nux-> L (o) nux. Hoe kleiner het getal, hoe beter de prestaties. Stel dit niet te hoog in. Ik denk dat 0-2 het meest redelijk is.

Index beheren

Nadat alles is geconfigureerd of gewijzigd, is het tijd om de wijziging toe te passen. Wanneer u op re-index klikt, zou het iets moeten tonen zoals hieronder:

Nadat het indexeren is voltooid. Probeer iets op uw site te zoeken, zoek naar een zin, schakel het zoeken in of uit tussen standaard en ElasticSearch om het verschil te zien. Hier is mijn zoekresultaat met de standaard WordPress-zoekopdracht:

Geen resultaat bij het zoeken naar zsh arch linux met standaardzoekopdracht

Hier is het zoekresultaat met ElasticSearch.

Een stelletje post met ElasticSearch

Conclusie

Met slechts een paar eenvoudige stappen hebben we een krachtige zoekmachine ingesteld op onze site. Hoe nauwkeuriger het zoekresultaat, hoe beter onze bezoekers zullen hebben. Als uw site veel verkeer heeft en een enkele ElasticSearch-installatie niet kan verwerken, kunt u meer knooppunten toevoegen aan ElasticSearch om een ​​gedistribueerde zoekopdracht uit te voeren.

Merk op dat ElasticSearch standaard niet wordt geleverd met authenticatie, maar dat u waarschijnlijk een firewall moet gebruiken om de toegang tot ElasticSearch van openbare IP-adressen te beperken. Of misschien is een betere manier om ElasticSearch aan interne IP te binden en deze alleen via LAN beschikbaar te maken.

Laat commentaar achter en laat ons weten hoe uw site werkt na het installeren van deze plug-in.