Populariteitscores in Elastic Search

Martijn null

Martijn

2 min lezen , ~4 ~uur om te bouwen

Verbeter de zoekfunctie van je Vendure shop door product populariteit mee te nemen in je ElasticSearch resultaten. Dit combineert relevantie met populariteit om slimmere zoekresultaten te geven.

Populariteitscores in Elastic Search

Installeer de ElasticSearch-plugin

Je kunt de ElasticSearch plugin installeren met deze handleiding. Je hebt wel ergens een Elastic Cluster nodig. Bonsai.io heeft een aantal goedkopere beheerde ElasticSearch opties voor kleinere shops. Voor grotere winkels kun je ElasticSearch misschien beter zelf hosten of kiezen voor de hosting van Elastic zelf.

Installeer de Populariteitsscores-plugin

Installeer vervolgens deze plugin om populariteitsscores per product te berekenen.

Zorg dat ElasticSearch de populariteitsscore indexeert

Voeg de populariteitsscore van elk product toe aan de ElasticSearch-index, zodat we deze tijdens de query kunnen gebruiken om bepaalde resultaten hoger te plaatsen. Hiervoor gebruiken we de custom product mappings option in de ElasticSearch plugin.

// vendure-config.ts
ElasticsearchPlugin.init({
  host: process.env.ELASTIC_SEARCH_URL!,
  port: 443,
  customProductMappings: {
  popularityScore: {
  graphQlType: 'Int!',
  valueFn: (product) => (product.customFields als any)?.popularityScore || 0,
  }
 }
}

Vergeet niet je producten opnieuw te indexeren voordat je verder gaat met de volgende stap!

Populaire documenten opvoeren

Nu ElasticSearch op de hoogte is van de populariteit van elk product, kunnen we de rangschikking van populaire producten tijdens zoekopdrachten opvoeren. De volgende code wijzigt de oorspronkelijke score van een zoekresultaat, waardoor de resultaten opnieuw worden gerangschikt op basis van populariteit.

Je kunt de query die naar ElasticSearch wordt gestuurd aanpassen met de mapQuery optie van de plugin.

ElasticsearchPlugin.init({
  host: process.env.ELASTIC_SEARCH_URL!,
  port: 443,
  customProductMappings: {
    popularityScore: {
      graphQlType: "Int!",
      valueFn: (product) => (product.customFields as any)?.popularityScore || 0,
    },
  },
  searchConfig: {
    mapQuery: (query, { term }) => {
      if (!term) {
        return query;
      }
      return {
        function_score: {
          field_value_factor: {
            field: "product-popularityScore",
            factor: 1.2, // Lichte impact van populariteit
            modifier: "sqrt", // 'sqrt' vlakt grote populariteitswaarden af
            missing: 1,
          },
          boost_mode: "sum", // Voegt populariteitsinvloed toe aan de relevantie van de query
          // De oorspronkelijke query die is gemaakt door Vendure
          query,
        },
      };
    },
  },
});

Populariteit- en relevantiescores aanpassen

Het kan zijn dat je wat moet experimenteren met de factor, modifier, en boost_mode instellingen om de rankings te krijgen die je wilt.

Beschikbare modifier opties:

  • none: Er wordt geen transformatie toegepast; de ruwe waarde wordt gebruikt.
  • log: Vermindert de impact van grote waarden.
  • log1p: Verwerkt kleine of nulwaarden zonder problemen.
  • sqrt: Matigt de impact van grote waarden.
  • reciprocal: Past 1 / waarde toe. Geeft voorrang aan documenten met kleinere veldwaarden.

Beschikbare boost_mode opties:

  • multiply: Vermenigvuldigt de query score met de veldwaarde.
  • sum: Telt de veldwaarde op bij de query score.
  • replace: Vervangt de query score door de veldwaarde.
  • max: Neemt de hoogste van de queryscore of de veldwaarde.
  • min: Neemt de laagste van de query score of veldwaarde.
  • avg: Gebruikt het gemiddelde van de queryscore en de veldwaarde.

Dat is het!


Heb je hulp nodig bij het implementeren van Search of plug-ins in je website? Wij zijn er om je te helpen!

martijn@pinelab.studio