Partage de technologie

Notation personnalisée Elasticsearch et notation scriptée

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Dans Elasticsearch, le mécanisme de notation par défaut (tel que l'algorithme BM25) peut fournir un bon classement des résultats de recherche dans la plupart des cas. Cependant, dans certains scénarios spécifiques, nous devrons peut-être effectuer un tri plus raffiné des résultats de recherche en fonction des besoins de l'entreprise. À l'heure actuelle, Elasticsearch propose des fonctions de notation personnalisée (Function Score Query) et de script (Script Score) pour répondre à ces besoins complexes. Cet article explique en détail comment personnaliser la notation et la notation de script dans Elasticsearch.

1. Notation personnalisée (requête de score de fonction)

1.1 Définition et principe

La notation personnalisée nous permet de modifier la note par défaut de chaque document en fonction d'un ensemble de fonctions prédéfinies. Ces fonctions peuvent calculer de nouvelles notes en fonction des valeurs des champs du document, des critères de requête ou d'autres facteurs. En fin de compte, Elasticsearch combinera le score d'origine avec le score personnalisé pour déterminer le classement des résultats de recherche.

1.2 Fonctions couramment utilisées

Elasticsearch fournit une variété de fonctions intégrées pour une notation personnalisée, notamment :

  • poids: Attribuez un poids uniforme à tous les documents correspondants.
  • facteur_de_valeur_de_champ: Calculez la note en fonction des valeurs des champs dans le document.
  • score aléatoire: Génère un score aléatoire pour le document.
  • fonction de décroissance: Calculez le score d'atténuation en fonction de la distance entre le document et un certain point (tel que l'emplacement géographique, l'heure, etc.). Les fonctions d'atténuation courantes incluent gaussienne (gauss), linéaire (linéaire), exponentielle (exp), etc.
  • script_score: utilisez des scripts personnalisés pour calculer les notes.

1.3 Exemple

Supposons que nous ayons un site Web de commerce électronique et que les utilisateurs souhaitent prendre en compte à la fois le prix et les notes du produit lors de la recherche de produits.on peut utiliserfunction_scoreRequête pour répondre à cette exigence :

GET /products/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "name": "手机"
        }
      },
      "functions": [
        {
          "field_value_factor": {
            "field": "price",
            "modifier": "reciprocal",
            "params": {
              "scale": 100
            }
          }
        },
        {
          "field_value_factor": {
            "field": "rating",
            "missing": 1.0
          }
        }
      ],
      "score_mode": "sum",
      "boost_mode": "replace"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

Dans cet exemple, nous utilisonsfield_value_factor La fonction calcule une note personnalisée en fonction du prix et de la note de l'article. Les prix utilisent la décroissance réciproque (reciprocal ), de sorte que le produit avec un prix inférieur ait un score plus élevé ; le score utilise directement la valeur du champ. Enfin, nous ajoutons les notes des deux fonctions et remplaçons les notes d'origine.

2. Partition du scénario

2.1 Définition et principe

La notation de script nous permet d'utiliser un langage de script personnalisé (tel que Painless) pour calculer la note d'un document. Cette approche offre la plus grande flexibilité et peut calculer les scores sur la base de presque toutes les logiques.

2.2 Exemple

Supposons que nous souhaitions ajuster la note en fonction de la quantité en stock du produit. Les produits avec moins de stock auront des notes plus élevées.on peut utiliserscript_scorefonction pour répondre à cette exigence :

GET /products/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "name": "手机"
        }
      },
      "functions": [
        {
          "script_score": {
            "script": {
              "source": "Math.max(0, 1 - doc['stock'].value / 100.0)",
              "lang": "painless"
            }
          }
        }
      ],
      "score_mode": "multiply",
      "boost_mode": "replace"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

Dans cet exemple, nous utilisons le langage de script Painless pour calculer la note. Le script détermine la quantité en stock du produit (doc['stock'].value ) calcule un score. Plus la quantité en stock est élevée, plus le score est faible ; plus la quantité en stock est faible, plus le score est élevé ; Nous multiplions ensuite ce score par la note d'origine pour ajuster le classement final des résultats de recherche.

3. Résumé

La notation personnalisée et la notation de script sont des fonctionnalités puissantes fournies par Elasticsearch, qui nous permettent d'affiner les résultats de recherche en fonction des besoins de l'entreprise. En utilisant rationnellement ces fonctions, nous pouvons améliorer l’expérience utilisateur et répondre aux divers besoins des utilisateurs. Cependant, il convient de noter que la notation personnalisée et la notation de script peuvent augmenter la complexité des requêtes et le coût de calcul. Les avantages et les inconvénients doivent donc être pesés dans les applications pratiques et utilisés avec prudence.