Populariteitscores in Elastic Search

Martijn
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.

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
: Past1 / 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!