Los motores de búsqueda requieren un alto rendimiento en la recuperación de datos. Para satisfacer esta demanda, OpenSearch ofrece un proceso de ordenamiento en dos etapas: ordenamiento preliminar y ordenamiento fino. La etapa de ordenamiento preliminar actúa como un filtro inicial que identifica rápidamente los documentos de mayor calidad entre los resultados de búsqueda originales. Los N documentos principales de esta etapa pasan luego al ordenamiento fino, donde se evalúan con mayor detalle. En consecuencia, el ordenamiento preliminar influye significativamente en el rendimiento, mientras que el ordenamiento fino afecta principalmente la calidad de la clasificación. Por lo tanto, una expresión de ordenamiento preliminar debe ser sencilla y eficaz, y utilizar solo los factores más críticos de la etapa de ordenamiento fino. Tanto el ordenamiento preliminar como el fino se configuran mediante expresiones de ordenamiento.
Una expresión de ordenamiento (fórmula de clasificación) permite personalizar la forma en que se clasifican los resultados de búsqueda. Es posible ordenar los resultados si se especifica la expresión en una consulta. Una expresión de ordenamiento admite operaciones básicas (aritméticas, relacionales, lógicas, bit a bit y condicionales), funciones matemáticas y ranking features. Para aplicaciones comunes, como foros y sitios de noticias, OpenSearch proporciona expression templates. Puede seleccionar una plantilla adecuada y modificarla para crear su propia expresión.
Antes de configurar la clasificación por relevancia (ordenamiento fino), es importante comprender la política de ordenamiento predeterminada. Después de que una consulta y otras cláusulas recuperan los documentos, estos ingresan a la etapa de ordenamiento. Para obtener más información, consulte sort clause. Si no se especifica una cláusula de ordenamiento, o si esta indica explícitamente RANK, se activa la fase de puntuación por relevancia.
El diseño de las expresiones de ordenamiento preliminar y fino depende de sus requisitos de búsqueda. Para obtener detalles sobre cómo diseñar factores de clasificación en varios escenarios típicos, consulte el artículo Relevance in Practice en Mejores prácticas.
Las expresiones de ordenamiento requieren valores numéricos o campos numéricos para todas las operaciones básicas, como las operaciones aritméticas, relacionales, lógicas y condicionales. La mayoría de las funciones no admiten campos de tipo cadena.
Operaciones básicas
|
Operación |
Operador |
Descripción |
||
|
Unaria |
- |
Operador de negación. Niega el valor de una expresión. Ejemplo: -1 o -max(width). |
||
|
Aritmética |
+, -, *, / |
Ejemplo: width / 10. |
||
|
Relacional |
==, !=, >, <, >=, <= |
Ejemplo: width>=400. |
||
|
Lógica |
and, or, ! |
Ejemplo: width>=400 and height >= 300, o !(a > 1 and b < 2). |
||
|
Bit a bit |
&, |
, ^ |
Ejemplo: 3 & (price ^ pubtime) + (price |
pubtime). |
|
Condicional |
if(cond, thenValue, elseValue) |
Si |
||
|
in |
i in (value1, value2, …, valuen) |
Si |
Funciones matemáticas
|
Función |
Descripción |
|
max(a, b) |
Devuelve el mayor valor entre a y b. |
|
min(a, b) |
Devuelve el menor valor entre a y b. |
|
ln(a) |
Devuelve el logaritmo natural de a. |
|
log2(a) |
Devuelve el logaritmo en base 2 de a. |
|
log10(a) |
Devuelve el logaritmo en base 10 de a. |
|
sin(a) |
Función seno. |
|
cos(a) |
Función coseno. |
|
tan(a) |
Función tangente. |
|
asin(a) |
Función arcoseno. |
|
acos(a) |
Función arcocoseno. |
|
atan(a) |
Función arcotangente. |
|
ceil(a) |
Redondea a hacia arriba al entero más cercano. Por ejemplo, ceil(4.2) devuelve 5. |
|
floor(a) |
Redondea a hacia abajo al entero más cercano. Por ejemplo, floor(4.6) devuelve 4. |
|
sqrt(a) |
Devuelve la raíz cuadrada de a. Por ejemplo, sqrt(4) devuelve 2. |
|
pow(a,b) |
Devuelve a elevado a la potencia de b. Por ejemplo, pow(2, 3) devuelve 8. |
|
now() |
Devuelve la hora actual en segundos desde la época Unix (00:00:00 UTC, 1 de enero de 1970). |
|
random() |
Devuelve un valor aleatorio en el rango [0, 1]. |
Funciones integradas
OpenSearch ofrece un amplio conjunto de built-in functions, incluidas funciones para servicios basados en ubicación (LBS), texto y actualidad. Puede combinar estas funciones en expresiones de ordenamiento para lograr una clasificación por relevancia eficaz.
Plugin de Cava
Cava es un lenguaje de programación de alto rendimiento desarrollado por el equipo del motor de OpenSearch basado en LLVM. Su sintaxis es similar a la de Java y su rendimiento es comparable al de C++. Cava es un lenguaje de programación orientado a objetos que admite compilación justo a tiempo (JIT) e incluye diversas comprobaciones de seguridad para garantizar la solidez de los programas. Puede usar Cava y sus bibliotecas para crear plugins de ordenamiento personalizados en OpenSearch. En comparación con las expresiones de ordenamiento estándar, los plugins de Cava ofrecen las siguientes ventajas:
Mayor personalización: Cava proporciona características de sintaxis más amplias que las expresiones, como bucles
fory definiciones de funciones y clases, lo que permite implementar lógica de negocio personalizada.Mantenimiento más sencillo: Los plugins de ordenamiento escritos en Cava son más legibles y fáciles de mantener que las expresiones complejas.
Curva de aprendizaje reducida: La sintaxis de Cava es similar a la de Java, por lo que resulta fácil de aprender para los desarrolladores de Java.
Nota: Los plugins de Cava solo son compatibles con aplicaciones exclusivas.
Procedimiento
Este ejemplo demuestra cómo configurar el ordenamiento preliminar y el ordenamiento fino mediante una función de ordenamiento por relevancia de texto.
Cree una política de ordenamiento preliminar. En la consola de OpenSearch, vaya a Sort Configuration > Policy Management y haga clic en Create. Introduzca un Policy Name, establezca Scope en Rough Sort, configure Type como Expression y haga clic en Next.
Seleccione static_bm25 como Scoring Characteristics y establezca el peso en 10. Un peso de 10 significa que la puntuación se multiplica por 10 durante el cálculo. También puede seleccionar un campo de búsqueda y establecer un peso para este. El campo debe ser un campo de atributo y de tipo numérico, como INT, DOUBLE o FLOAT. La puntuación de field value * weight se suma a la puntuación total de ordenamiento.
Por ejemplo, seleccione el campo sale_price en Search Field y establezca su peso en 0.08.
Una vez completada la configuración, se le redirigirá a la página de gestión de políticas.
Cree una política de ordenamiento fino. En la consola de OpenSearch, vaya a Sort Configuration > Policy Management y haga clic en Create. Introduzca un Policy Name, establezca Scope en Fine Sort, configure Type como Expression y haga clic en Next.
En el paso de configuración de ordenamiento, seleccione un campo de la lista desplegable Field, introduzca la expresión de ordenamiento text_relevance(brand) en el editor y luego haga clic en Completed. Una vez completada la configuración, se le redirigirá a la página de configuración de ordenamiento.
-
Consulte el efecto del ordenamiento. En la página Search Test, establezca el parámetro
first_rank_namecon el nombre de su política de ordenamiento preliminar, por ejemplo,test_1. Establezca el parámetrosecond_rank_namecon el nombre de su política de ordenamiento fino, por ejemplo,test_2. Active el interruptor Show Sort Details para consultar los detalles de puntuación de cada documento y función.NotaLa puntuación de documentos se realiza en dos etapas: ordenamiento preliminar y ordenamiento fino. Después de que una consulta recupera y filtra los documentos, estos ingresan a la etapa de ordenamiento preliminar. La expresión de ordenamiento preliminar selecciona los documentos con puntuaciones más altas. Luego, los N mejores resultados pasan a la etapa de ordenamiento fino para una puntuación detallada basada en la expresión de ordenamiento fino. Finalmente, se devuelven los resultados óptimos. La lógica de puntuación es la siguiente:
Si solo se configura una política de ordenamiento preliminar, la puntuación del documento es (10000 + el resultado de la expresión de ordenamiento preliminar). La puntuación total tiene un límite máximo de 20,000.
Si solo se configura una política de ordenamiento fino, la puntuación del documento es (10000 + el resultado de la expresión de ordenamiento fino). La puntuación total no tiene límite superior.
Si se configuran tanto políticas de ordenamiento preliminar como de ordenamiento fino, la puntuación final de los documentos que entran en la etapa de ordenamiento fino es (10000 + el resultado de la expresión de ordenamiento fino). La puntuación final de los documentos restantes es (10000 + el resultado de la expresión de ordenamiento preliminar), y esta puntuación tiene un límite máximo de 20,000.
Puede crear varias reglas de ordenamiento preliminar y fino, pero una consulta solo puede usar una regla de ordenamiento preliminar y una de ordenamiento fino a la vez.
ImportanteEl parámetro
first_rank_namesolo admite un nombre de expresión de ordenamiento.El parámetro
second_rank_namesolo admite un nombre de expresión de ordenamiento.
Ejemplos de configuración del SDK
Ejemplo del SDK de Java:
// Set the rough and fine sort expressions. This example uses "default".
Rank rank =new Rank();
rank.setFirstRankName("default"); // The name of the rough sort policy.
rank.setSecondRankName("default"); // The name of the fine sort policy.
rank.setReRankSize(5); // The number of documents for fine sorting.
Ejemplo del SDK de PHP:
// Specify the rough sort expression.
$params->setFirstRankName('default');
// Specify the fine sort expression.
$params->setSecondRankName('default');
Nota:
Si especifica políticas de ordenamiento en su código, estas anularán las políticas predeterminadas configuradas en la consola.
-
Para consultar los detalles de ordenamiento en el código:
Método: Agregue el parámetro
format:fulljsona la cláusula config.En la respuesta,
sortExprValuescontiene la puntuación del documento."sortExprValues": [ "10000.0399786383" ], "property": { }sortExprValueses una matriz que contiene los valores de los campos de ordenamiento en la cláusula de ordenamiento. Ejemplo:sort=-price;-RANKEn este caso,
sortExprValueses[price, document score].Si no se establece
sort, el valor predeterminado es la puntuación del documento.