Compartir tecnología

Puntuación personalizada de Elasticsearch y puntuación con script

2024-07-12

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

En Elasticsearch, el mecanismo de puntuación predeterminado (como el algoritmo BM25) puede proporcionar una buena clasificación de los resultados de búsqueda en la mayoría de los casos. Sin embargo, en algunos escenarios específicos, es posible que necesitemos realizar una clasificación más refinada de los resultados de búsqueda según las necesidades comerciales. En este momento, Elasticsearch proporciona funciones de puntuación personalizada (Consulta de puntuación de función) y puntuación de script (Puntuación de script) para satisfacer estas necesidades complejas. Este artículo detallará cómo personalizar la puntuación y la puntuación de scripts en Elasticsearch.

1. Puntuación personalizada (consulta de puntuación de función)

1.1 Definición y principio

La puntuación personalizada nos permite modificar la puntuación predeterminada para cada documento en función de un conjunto de funciones predefinidas. Estas funciones pueden calcular nuevas calificaciones en función de los valores de los campos del documento, los criterios de consulta u otros factores. En última instancia, Elasticsearch combinará la puntuación original con la puntuación personalizada para determinar la clasificación de los resultados de búsqueda.

1.2 Funciones de uso común

Elasticsearch proporciona una variedad de funciones integradas para puntuación personalizada, que incluyen, entre otras:

  • peso: Asigne un peso uniforme a todos los documentos coincidentes.
  • factor_valor_campo: Calcule la calificación según los valores de los campos del documento.
  • puntuación aleatoria: genera una puntuación aleatoria para el documento.
  • función de decaimiento: Calcule la puntuación de caída en función de la distancia entre el documento y un punto determinado (como la ubicación geográfica, el tiempo, etc. Las funciones de caída comunes incluyen gaussiana (gauss), lineal (lineal), exponencial (exp), etc.
  • puntuación del script: utilice secuencias de comandos personalizadas para calcular las calificaciones.

1.3 Ejemplo

Supongamos que tenemos un sitio web de comercio electrónico y los usuarios quieren considerar tanto el precio del producto como las calificaciones al buscar productos.nosotros podemos usarfunction_scoreConsulta para cumplir este requisito:

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

En este ejemplo utilizamosfield_value_factor La función calcula una calificación personalizada basada en el precio y la calificación del artículo. Los precios utilizan una caída recíproca (reciprocal ), de modo que el producto con un precio más bajo tenga una puntuación más alta; la puntuación utiliza el valor del campo directamente. Finalmente, sumamos las calificaciones de ambas funciones y reemplazamos las calificaciones originales.

2. Puntuación del guión

2.1 Definición y principio

La puntuación de secuencias de comandos nos permite utilizar un lenguaje de secuencias de comandos personalizado (como Painless) para calcular la puntuación de un documento. Este enfoque proporciona la mayor flexibilidad y puede calcular puntuaciones basándose en casi cualquier lógica.

2.2 Ejemplo

Supongamos que queremos ajustar la calificación en función de la cantidad de inventario del producto. Los productos con menos inventario tendrán calificaciones más altas.nosotros podemos usarscript_scorefunción para lograr este requisito:

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

En este ejemplo, utilizamos el lenguaje de programación Painless para calcular la calificación. El script determina la cantidad de inventario del producto (doc['stock'].value ) calcula una puntuación. Cuanto mayor es la cantidad del inventario, menor es la puntuación; cuanto menor es la cantidad del inventario, mayor es la puntuación. Luego multiplicamos esta puntuación por la calificación original para ajustar la clasificación final de los resultados de búsqueda.

3. Resumen

La puntuación personalizada y la puntuación de script son funciones potentes proporcionadas por Elasticsearch, que nos permiten refinar los resultados de búsqueda según las necesidades comerciales. Al utilizar racionalmente estas funciones, podemos mejorar la experiencia del usuario y satisfacer las diversas necesidades de los usuarios. Sin embargo, cabe señalar que la puntuación personalizada y la puntuación de scripts pueden aumentar la complejidad de las consultas y el costo computacional, por lo que los pros y los contras deben sopesarse en aplicaciones prácticas y usarse con precaución.