La cláusula distinct diversifica los resultados de búsqueda al limitar la cantidad de documentos con el mismo valor de campo que aparecen en un conjunto de resultados. Esto evita que un valor dominante monopolice la página de resultados.
Casos de uso comunes:
Deduplicación: Devuelve solo un resultado por título, empresa o SKU de producto. Establezca
dist_count:1ydist_times:1para conservar exactamente un documento por valor de campo.Corrección de sesgo: Cuando un vendedor o autor domina los primeros resultados, utilice
dist_countydist_timespara limitar su proporción y mostrar documentos de otros valores.
Sintaxis
distinct=dist_key:<field>,dist_count:<n>,dist_times:<n>,reserved:<true|false>
Parámetros
|
Parámetro |
Tipo |
Obligatorio |
Predeterminado |
Descripción |
|
|
|
string |
Sí |
— |
El campo por el cual se dispersan los resultados. Debe ser un campo de atributo de tipo INT o LITERAL. |
|
|
|
int |
No |
1 |
Número de documentos que se extraen por cada operación de dispersión. |
|
|
|
int |
No |
1 |
Número de operaciones de dispersión que se ejecutan. |
|
|
|
true/false |
No |
true |
Indica si se conservan los documentos no extraídos. Establézcalo en |
|
|
|
true/false |
No |
false |
Se aplica únicamente cuando |
|
|
|
string |
No |
— |
Condición de filtro que exime a los documentos coincidentes de la dispersión. Los documentos eximidos se ordenan junto con el primer grupo de documentos dispersados. De forma predeterminada, todos los documentos se dispersan. |
|
|
|
float |
No |
— |
Uno o más umbrales de puntuación (separados por |
`) que dividen los documentos en categorías antes de la dispersión. Cada categoría se dispersa de forma independiente con los mismos valores de |
Cuando reserved se establece en false, los valores de respuesta total y viewtotal resultan inexactos. Si su aplicación utiliza estos valores para la paginación o visualización, consulte el complemento distinct uniq.
Funcionamiento de dist_count y dist_times
dist_count controla cuántos documentos se extraen por operación. dist_times controla cuántas operaciones se ejecutan. Los documentos extraídos se colocan al inicio del conjunto de resultados, según el orden de cada operación.
Datos de prueba:
|
Documento |
id |
name |
|
doc1 |
11 |
a |
|
doc2 |
22 |
a |
|
doc3 |
33 |
a |
|
doc4 |
44 |
b |
|
doc5 |
55 |
c |
|
doc6 |
66 |
c |
Ejemplo 1 — Extraer 2 documentos por operación, 1 operación:
distinct=dist_key:name,dist_count:2,dist_times:1,reserved:false
Resultado: doc1, doc2, doc4, doc5, doc6
Cada valor de name aporta hasta 2 documentos. name:a aporta doc1 y doc2; name:b aporta doc4; name:c aporta doc5 y doc6. doc3 (el tercer documento con name:a) se descarta.
Ejemplo 2 — Extraer 1 documento por operación, 2 operaciones:
distinct=dist_key:name,dist_count:1,dist_times:2,reserved:false
Resultado: doc1, doc4, doc5, doc2, doc6
La operación 1 toma el primer documento de cada valor: doc1 (a), doc4 (b), doc5 (c). La operación 2 toma el siguiente documento de cada valor: doc2 (a), doc6 (c). doc3 se descarta.
Ejemplo 3 — Extraer 1 documento por operación, 1 operación:
distinct=dist_key:name,dist_count:1,dist_times:1,reserved:false
Resultado: doc1, doc4, doc5
Se conserva un documento por valor. Todos los documentos restantes se descartan.
Parámetro grade
Utilice grade para clasificar los documentos en categorías basadas en puntuación antes de la dispersión. Cada categoría se dispersa de forma independiente con los mismos valores de dist_count y dist_times. Las categorías se ordenan siguiendo el mismo orden que la primera categoría.
Umbral único — grade:3.0 crea dos categorías:
|
Categoría |
Rango de puntuación |
|
Primera |
score < 3.0 |
|
Segunda |
score >= 3.0 |
Dos umbrales — grade:3.0|5.0 crea tres categorías:
|
Categoría |
Rango de puntuación |
|
Primera |
score < 3.0 |
|
Segunda |
3.0 <= score < 5.0 |
|
Tercera |
score >= 5.0 |
No hay límite en la cantidad de umbrales.
Notas de uso
La cláusula distinct es opcional.
Los campos referenciados en
dist_keydeben configurarse como campos de atributo en el esquema de la aplicación.dist_keysolo admite tipos de campo INT y LITERAL. Los campos ARRAY no son compatibles.Especifique solo un campo por cláusula distinct.
La función de ordenamiento no elimina duplicados. Para deduplicar por un campo (por ejemplo,
title), utilice una cláusula distinct condist_count:1ydist_times:1.
Complemento distinct uniq
Cuando reserved es false, los valores de respuesta total y viewtotal son inexactos. El complemento distinct uniq corrige estos valores cuando dist_times, dist_count y reserved se establecen en 1, 1 y false, respectivamente.
Para habilitar el complemento, agregue duniqfield:<field> al kvpairs clause:
kvpairs=duniqfield:<field>
El valor de <field> debe coincidir con dist_key.
Limitaciones:
Funciona únicamente cuando
dist_times=1,dist_count=1yreserved=false. Cambiar cualquiera de estos valores deshabilita el complemento.Devuelve un máximo de 5,000 resultados por consulta, incluso si hay más coincidencias.
Puede agotar el tiempo de espera en consultas que acceden a millones de registros.
Ejemplos
Diversificar resultados por empresa y conservar todos los documentos:
Busque documentos que contengan "Zhejiang University" con create_time > 1402301230, dispérselos por company_id mediante 10 operaciones de 2 documentos cada una. Los documentos no extraídos se conservan y se clasifican al final.
query=default:'Zhejiang University'&&filter=create_time>1402301230&&distinct=dist_key:company_id,dist_count:2,dist_times:10
Deduplicar por empresa con un recuento de resultados preciso:
Busque documentos que contengan "Zhejiang University", conserve solo un documento por company_id y utilice el complemento distinct uniq para obtener valores precisos de total y viewtotal.
query=default:'Zhejiang University'&&distinct=dist_key:company_id,dist_count:1,dist_times:1,reserved:false&&kvpairs=duniqfield:company_id