Synoniemen in search met behulp van Querqy

-

Er is één onderwerp waar zelfs de meest ervaren search engineers hoofdpijn van krijgen: synoniemen bestaande uit meerdere woorden. Er zijn enkele manieren om hiermee om te gaan, één daarvan is een tool genaamd Querqy. Querqy is gemaakt door René Kriegler.

Het doel van deze blogpost is om Querqy voor Solr te introduceren, zodat u op een gemakkelijke manier kunt experimenteren met Docker. Daarnaast laat ik u zien hoe u een andere tool genaamd SMUI gebruikt. Deze grafische gebruikersinterface helpt u met het schrijven van regels.

De afgelopen week heb ik gesproken met een aantal mensen die verantwoordelijk zijn voor het toevoegen van synoniemen aan hun e-commerce zoekoplossing. Het gaat hierbij om een integratie van een e-commerceplatform en Solr 4.8.1. De gebruikte Solr-versie zorgt voor een aantal beperkingen. Daarnaast zijn er beperkingen vanwege de integratie met het e-commerce platform.
Ik moest het probleem van synoniemen van meerdere woorden uitleggen. Als je hier nog niet eerder over hebt gehoord en geïnteresseerd bent, raadpleeg dan de bronnen voor meer informatie over dit technische probleem. Mijn gesprekspartners hadden een tool gevonden om te gebruiken om zoekresultaten te beïnvloeden. Ik moest ze echter helaas vertellen dat ze deze tool niet kunnen gebruiken, omdat ze hiermee een deel van de zoekresultaten ook negatief beïnvloeden. Tijdens mijn zoektocht naar een passende oplossing herinnerde ik mij een lezing van René Kriegler over Querqy. Querqy is een tool voor het herschrijven van queries, waarin je veel aanpassingen kunt doen. Ik kon geen versie vinden die ik voor Solr 4.8.1. kon gebruiken, maar ik wilde mij toch graag verdiepen in dit programma.

Het opzetten van een testomgeving met Docker

Als je het zelf wilt proberen, neem dan een kijkje in mijn github-repo: https://github.com/jettro/querqy-tryout
Ik wil niet dat dit een uitgebreide Docker tutorial wordt. Ik gebruik Docker vooral om zaken beheersbaarder te maken. Querqy wordt geleverd als een plug-in voor Solr, die goed samenwerkt met Docker. Je kunt het benodigde JAR bestand vinden via de link op de Querqy website. Voor het gemak heb ik de specifieke versie die ik gebruikt heb in mijn github-repo opgeslagen. Allereerst moeten we onze eigen Docker container maken met het JAR bestand voor Querqy. Ten tweede maken we een Docker compose met drie containers. Voor SMUI hebben we een MySQL-database nodig. Hiervoor gebruikt u Solr en een SMUI container. Hieronder ziet u de Docker containerconfiguratie voor de Querqy container.

 

FROM solr:slim
COPY ./lib/*.jar /opt/solr/dist
EXPOSE 8983
CMD ["solr-precreate", "gettingstarted"]
COPY ./lib/ /var/solr/data/gettingstarted/conf/solrconfig.xml

Het volgende blok laat de docker-compose.yml zien met de drie genoemde containers.

version: "3"

services:
  solr:
    container_name: my_solr
    build:
      context: .
      dockerfile: ./Dockerfile
    image: my_solr
    restart: "no"
    volumes:
      - "./solrdata/:/var/solr/"
    ports:
      - "8983:8983"

  db:
    image: mysql:5.7
    restart: "no"
    environment:
      MYSQL_DATABASE: 'smui'
      # So you don't have to use root, but you can if you like
      MYSQL_USER: 'smui'
      # You can use whatever password you like
      MYSQL_PASSWORD: 'smui'
      # Password for root access
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      #  : 
      - '3306:3306'
    expose:
      # Opens port 3306 on the container
      - '3306'
      # Where our data will be persisted
    volumes:
      - ./mysql-db:/var/lib/mysql

  smui:
    image: pbartusch/smui
    restart: "no"
    environment:
      - "SMUI_DB_URL=jdbc:mysql://db:3306/smui?autoReconnect=true&useSSL=false"
      - "SMUI_2SOLR_SOLR_HOST=solr:8983"
      - "SMUI_2SOLR_SRC_TMP_FILE=/smui/temp/rules.txt"
    ports:
      - "9000:9000"
    expose:
      - '9000'
    volumes:
      - ./smui_path:/smui/temp

Ik heb helaas enkele problemen met de automatische vervanging van de rules.txt met behulp van het meegeleverde SMUI script. Daarom kopieer ik het regelbestand zoals gegenereerd door SMUI met de hand. Er zijn ook enkele standaardinstellingen die u kunt gebruiken en maar één keer hoeft te draaien. U vindt ze hieronder:

# Initialize SMUI
curl -X PUT -H "Content-Type: application/json" -d '{"name":"gettingstarted", "description":"Gettingstarted"}' http://localhost:9000/api/v1/solr-index

# Copy the solr config
cp ./lib/solrconfig.xml ./solrdata/data/gettingstarted/conf/solrconfig.xml

# Copy the rules.txt as generated by SMUI
cp ./smui_path/rules.txt ./solrdata/data/gettingstarted/rules.txt

Solr opzetten

Nu zijn we klaar om de Solr core op te zetten. Eerst moeten we twee velden toevoegen, vervolgens data toevoegen en vastleggen en tot slot de core herladen. Als u PAW gebruikt voer dan alle opdrachten hiermee uit, anders moet u de curl commands uitvoeren.

 

## Add field title
curl -X "POST" "http://localhost:8983/solr/gettingstarted/schema" \
     -H 'Content-Type: application/json' \
     -H 'commitWithin: 1000' \
     -H 'overwrite: true' \
     -d $'{
  "add-field": {
    "multiValued": false,
    "name": "title",
    "type": "text_general",
    "stored": true
  }
}'

## Add field category
curl -X "POST" "http://localhost:8983/solr/gettingstarted/schema" \
     -H 'Content-Type: application/json' \
     -H 'commitWithin: 1000' \
     -H 'overwrite: true' \
     -d $'{
  "add-field": {
    "multiValued": false,
    "name": "category",
    "type": "string",
    "stored": true
  }
}'

## ADD all docs
curl -X "POST" "http://localhost:8983/solr/gettingstarted/update" \
     -H 'Content-Type: application/json' \
     -H 'commitWithin: 1000' \
     -H 'overwrite: true' \
     -d $'[
  {
    "title": "My trip to San Francisco",
    "category": "travel"
  },
  {
    "title": "My hobby is horseback riding",
    "category": "sports"
  },
  {
    "title": "IT",
    "category": "movie"
  },
  {
    "title": "IT chapter two",
    "category": "movie"
  },
  {
    "title": "IT chapter one",
    "category": "movie"
  },
  {
    "title": "Clean it",
    "category": "housing"
  }
]'

Een stap die ik nog niet heb genoemd is het wijzigen van de Solr configuratie om het opnieuw schrijven van de Querqy query mogelijk te maken. Deze stap is gedocumenteerd in de Querqy bestanden. Bekijk het solrconfig.xml bestand in de git repository; het relevante deel is de toevoeging van een queryparser met de naam querqy. Dit deel configureert de re-write chain evenals het loggen.

Kopieer de solrconfig.xml van de lib naar de Solr kernconfiguratie, herlaad de kern opnieuw en je bent klaar om te beginnen!

De eerste regel toevoegen

Ik ga de documentatie hier niet helemaal beschrijven. Ik wil je wel een idee geven over de beschikbare opties. Er zijn twee delen voor elke regel: input matching en output regels.
Input matching – selecteer een of meerdere woorden, u kunt specificeren door ze alleen te selecteren als de volledige query, als de query ermee begint, of als de query ermee eindigt. Een andere truc is dat je het begin van een woord kunst selecteren om de rest te gebruiken in het synoniem. Hier volgen een aantal voorbeelden:
“IT” -> selecteer alleen queries die volledig IT zijn, geen andere termen
“Huis -> selecteer alleen de queries die beginnen met huis
Ebook” -> selecteer alleen queries die eindigen met ebook
Sofa* -> match queries zoals Sofabed en zoek op Sofa bed

Output regels – Er zijn verschillende regels die u kunt kiezen en gebruiken. Eentje waar we deze blog door zijn begonnen is synoniemen bestaande uit meerdere woorden. De regel die ik zelf graag toevoeg is het boosten van een specifieke categorie.

 

cheap notebook =>
	UP(10): * price:[350 TO 450]
	DOWN(20): * category:accessories

Naast het geven van een boost kun je op bijna dezelfde manier ook filters toevoegen.

notebook =>
	FILTER: * -category:accessories

Daarnaast is er de optie om termen te verwijderen. De laatste regels die ik aandacht wil geven heten decorate rules. Met deze regels kunt u een zoekresultaat geven met een re-direct.

faq =>
	DECORATE: redirect, /service/faq

Er zijn nog veel meer geavanceerde opties. Bekijk de Querqy documentatie voor meer toelichting over deze opties.

Wat Querqy doet

Hoewel het leuk is dat Querqy doet wat het doet en het ons helpt met synoniemen, bent u misschien ook benieuwd hoe het werkt. Om een voorbeeld te geven gebruiken we de debug-optie in Solr. Hiermee kunnen we de query controleren nadat Querqy het herschreef.
Het eerste voorbeeld is de query: Trip SF

SF =>
    SYNONYM: San Francisco
(title:trip (title:sf | (+title:san +title:francisco)^0.5))~2

The overeenkomende regel is:
Let op of de ‘|’ tussen de originele synoniemclausule van de zoekopdracht en de negatieve boost voor het synoniem overeenkomen.

Een ander interessant voorbeeld is de film IT. IT is een veel voorkomend woord. Met de volgende versie van de film nu uit zoeken veel mensen de titels IT Chapter One en IT Chapter Two. We kunnen een regel maken van het woord IT. Het probleem hierbij is dat IT Chapter Two uit meerdere woorden bestaat. Clean IT bevat slechts twee woorden. Op basis van een normale score zou dit resultaat hoger scoren in zoekresultaten dat de nieuwe IT films. Voeg daarom een regel toe om de films hoger in de zoekresultaten te laten komen wanneer iemand op IT zoekt. In onderstaande afbeeldingen ziet u hoe u dit kunt doen in SMUI en het bijbehorende resultaat van het versturen van de query IT.

Ik hoop dat u nu een idee heeft over de kracht van Querqy. Raadpleeg de documentatie om meer te weten te komen over alle andere mogelijkheden.

https://github.com/renekrie/querqy https://github.com/pbartusch/smui https://lucidworks.com/post/multi-word-synonyms-solr-adds-query-time-support/ https://opensourceconnections.com/blog/2013/10/27/why-is-multi-term-synonyms-so-hard-in-solr/ https://github.com/jettro/querqy-tryout