Búsqueda por facetas

La búsqueda por facetas otorga la capacidad de adjuntar información categórica a tus documentos. Una faceta es un par atributo/valor. Por ejemplo, la faceta llamada "tamaño" puede tener los valores "pequeño", "mediano" y "grande".

Mediante el uso de las facetas con la búsqueda, puedes recuperar información de resumen para ayudarte a definir mejor una consulta y a "desglosar" tus resultados en una serie de pasos.

Esto es útil para las aplicaciones como un sitio de compras en el que quieres ofrecerles un conjunto de filtros a los clientes para acotar la selección de productos que desean ver.

Los datos agregados de una faceta muestran cómo se distribuyen sus valores. Por ejemplo, la faceta "tamaño" puede aparecer en muchos de los documentos de tu conjunto de resultados. Los datos agregados de esta faceta pueden mostrar que el valor "pequeño" aparece 100 veces, "mediano" 300 veces y "grande" 250 veces. Cada par faceta/valor representa un subconjunto de documentos en el resultado de la consulta. Una clave denominada perfeccionamiento se asocia con cada par. Puedes incluir perfeccionamientos en una consulta para recuperar documentos que coincidan con la string de consulta y que tengan los valores de la faceta correspondientes a uno o más perfeccionamientos.

Cuando llevas a cabo una búsqueda, puedes elegir qué facetas recopilar y mostrar con los resultados o puedes habilitar la detección de facetas para que se seleccionen automáticamente las facetas que aparecen con mayor frecuencia en tus documentos.

Agrega facetas a un documento

Agrega facetas a un documento antes de agregar el documento a un índice. Hazlo al mismo tiempo que especificas los campos del documento:

package app

import (
    "appengine"
    "appengine/search"
    "net/http"
)

type ComputerDoc struct {
    Name      search.Atom
    Type      search.Atom `search:",facet"`
    RAMSizeGB float64     `search:",facet"`
}

func handlePut(w http.ResponseWriter, r *http.Request) {
    c := appengine.NewContext(r)
    index, err := search.Open("products")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    _, err = index.Put(c, "doc1", &ComputerDoc{
        Name:      "x86",
        Type:      "computer",
        RAMSizeGB: 8.0,
    })
    // Handle err and write HTTP response.
}

Una faceta es similar a un campo del documento en que tiene un nombre y recibe un valor.

Los nombres de las facetas siguen las mismas reglas que los campos de los documentos: los nombres distinguen entre mayúscula y minúscula y solo pueden contener caracteres ASCII. Deben empezar con una letra y pueden contener letras, dígitos o guiones bajos. Un nombre no puede tener más de 500 caracteres.

El valor de una faceta puede ser una string atómica (no más de 500 caracteres) o un número (valor de punto flotante de doble precisión entre -2,147,483,647 y 2,147,483,647).

Para asignar múltiples valores a una faceta en un documento, puedes agregar una faceta con el mismo nombre y tipo muchas veces, pero con un valor diferente en cada una.

Una faceta puede tener una cantidad ilimitada de valores. Tampoco hay restricciones en cuanto a la cantidad de facetas que puedes agregar a un documento o la cantidad de facetas con nombre único que puede tener un índice.

Ten en cuenta que cada vez que uses una faceta, puede recibir un valor atómico o numérico. Una faceta con el nombre “tamaño” puede adjuntarse a un documento con el valor de string “pequeño” y a otro documento con el valor numérico 8. De hecho, la misma faceta puede aparecer varias veces en el mismo documento con ambos grupos de similares de valores. No recomendamos que uses valores atómicos y numéricos para la misma faceta, a pesar de que esté permitido.

Si bien una faceta tiene un tipo específico cuando la agregas a un documento, los resultados de la búsqueda reúnen todos sus valores. Por ejemplo, los resultados para la faceta “tamaño” pueden mostrar que existen 100 instancias del valor “pequeño”, 150 instancias de “mediano” y 135 instancias de valores numéricos en el rango [4, 8). No se muestran los valores numéricos exactos ni su distribución de frecuencia.

Cuando recuperas un documento usando una consulta, no puedes acceder directamente a sus facetas y valores. Debes solicitar que se muestre la información de esa faceta con la consulta, como se explica en la siguiente sección.

Usa una búsqueda por facetas para recuperar información de las facetas

Puedes pedirle al backend de la búsqueda que detecte las facetas más frecuentemente utilizadas para ti; esto se denomina "detección automática de facetas". También puedes recuperar información de la faceta de manera explícita seleccionando una faceta por su nombre o por su nombre y valor. Puedes combinar las tres clases de la recuperación de facetas en una única consulta.

Consultar por la información de las facetas no afectará los documentos que muestre la consulta. Sí puede afectar el rendimiento. Realizar una búsqueda por facetas con la profundidad predeterminada de 1,000 tiene el mismo efecto que configurar el límite del marcador de opciones de ordenamiento a 1,000.

Detección automática de facetas

La detección automática de facetas busca las facetas que aparecen con mayor frecuencia en la totalidad de tus documentos. Por ejemplo, imagina que los documentos que coinciden con tu consulta incluyen una faceta de “color” que aparece 5 veces con el valor “rojo”, 5 veces con el valor “blanco” y 5 veces con el color “azul”. Esta faceta tiene un recuento total de 15. Para los fines de detección, se clasificaría en una posición superior que otra faceta de “tono” que aparece en los mismos documentos correspondientes 6 veces con el valor “oscuro” y 7 veces con el valor “claro”.

Para habilitar la detección de facetas, debes configurarla en tu consulta:

func handleSearch(w http.ResponseWriter, r *http.Request) {
    index, err := search.Open("products")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    it := index.Search(c, "name:x86", &search.SearchOptions{
        Facets: {
            search.AutoFacetDiscovery(0, 0),
        },
    })
    facets, err := it.Facets()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    for _, results := range facets {
        for i, facet := range result {
            // The facet results are grouped by facet name.
            // Print the name of each group before its values.
            if i == 0 {
                fmt.Fprintf(w, "Facet %s:\n", facet.Name)
            }
            fmt.Fprintf(w, "    %v: count=%d", facet.Value, facet.Count)
        }
    }
}

Cuando recuperas facetas con la detección, en la configuración predeterminada, solo se muestran los 10 valores que aparecen con mayor frecuencia para una faceta. Para aumentar este límite hasta un valor máximo de 100, puedes usar el primer parámetro de AutoFacetDiscovery.

Ten en cuenta que la detección automática de facetas no tiene por objeto mostrar todas las facetas posibles y sus valores. Las facetas que se muestran a partir de la detección pueden variar entre distintas ejecuciones. Si se deseas un conjunto de facetas fijo, usa un parámetro return_facets en tu consulta.

Los valores de string se mostrarán de manera individual. Los valores numéricos de una faceta detectada se muestran en un único rango [mín. máx.). Puedes analizar este rango y crear un subrango más pequeño para una consulta posterior.

Selecciona facetas por nombre

Para recuperar información acerca de una faceta solo por su nombre, agrega FacetDiscovery con el nombre de la faceta a las opciones de búsqueda de tu consulta:

it := index.Search(c, "name:x86", &search.SearchOptions{
    Facets: {
        FacetDiscovery("Type"),
        FacetDiscovery("RAMSizeGB"),
    },
})

Cuando recuperas facetas por nombre, solo se mostrarán los 10 valores que aparecen más frecuentemente para una faceta.

Selecciona facetas por nombre y valor

Para solo recuperar información acerca de los valores de una faceta en particular, agrega FacetDiscovery con el nombre de la faceta y los valores de interés:

it := index.Search(c, "name:x86", &search.SearchOptions{
    Facets: {
        // Fetch the "Type" facet with Values "computer" and "printer"
        FacetDiscovery("Type",
            search.Atom("computer"),
            search.Atom("printer"),
        ),
        // Fetch the "RAMSizeGB" facet with values in the ranges [0, 4), [4, 8), and [8, max]
        FacetDiscovery("RAMSizeGB",
            search.Range{Start: 0, End: 4},
            search.Range{Start: 4, End: 8},
            search.AtLeast(8),
        ),
    },
})

Todos los valores de una operación FacetDiscovery deben ser todos del mismo tipo, ya sea una lista de valores search.Atom o, en el caso de los números, una lista de search.Range, que son intervalos que están cerrados a la izquierda (inicio) y abiertos a la derecha (fin). Si tu faceta tiene una combinación de strings y valores numéricos, agrega opciones de FacetDisovery separadas para cada uno.

Opciones

Para controlar la cantidad mínima de documentos que se evaluarán para recopilar la información de las facetas, agrega la opción FacetDocumentDepth en las SearchOptions de tu consulta. Si no especificas una cantidad, la profundidad se configura de forma predeterminada en 1,000.

Ten en cuenta que la profundidad de las facetas suele mucho mayor que el límite de la consulta. Los resultados de las facetas se calculan para, al menos, el valor de profundidad de los documentos. Si configuraste el límite del marcador de las opciones de ordenamiento en un valor superior a la profundidad, se usará el límite del marcador.

Recupera resultados de facetas

Cuando usas parámetros de búsqueda por facetas en una consulta, la agregación de la información de las facetas se mostrará junto con el resultado de la consulta.

El Iterator de la búsqueda tiene un método Facets que muestra la agregación de información de las facetas como [][]FacetResult. Los resultados se organizan de modo tal que haya una porción de resultados de cada faceta que aparezca en un documento que coincidió con tu consulta. Para cada resultado, obtendrás lo siguiente:

  • El nombre de la faceta
  • Un valor de la faceta tomado de la lista de valores más frecuentes
  • La cantidad de veces que aparecía ese valor

Ten en cuenta que la lista de valores incluirá los valores numéricos y las strings de la faceta. Si la faceta se detectó automáticamente, sus valores numéricos se mostrarán como un único intervalo [mín., máx.). Si solicitaste de forma explícita una faceta numérica con uno o más rangos en tu consulta, la lista mostrará un intervalo cerrado-abierto [inicio, fin) para cada rango.

La lista de los valores de la faceta puede no incluir todos los valores encontrados en tus documentos, ya que las opciones de la consulta determinan cuántos documentos se examinan y cuántos valores se muestran.

La agregación de la información de cada faceta puede leerse del iterador:

it := index.Search(...)
facets, err := it.Facets()  // And check err != nil.
for _, results := range facets {
    for _, facet := range results {
        ...
    }
}

Por ejemplo, una consulta podría encontrar documentos que incluyen una faceta de “tamaño” con valores de string y valores numéricos. Los resultados de esta faceta tendrían el siguiente formato:

[][]search.FacetResult{
    {
        {Name: "size", Value: search.Range{Start: 8, End: 10}, Count: 22},
        {Name: "size", Value: search.Atom("small"), Count: 100},
        {Name: "size", Value: search.Atom("medium"), Count: 300},
        {Name: "size", Value: search.Atom("large"), Count: 250},
    },
}

Usa facetas para definir mejor o filtrar una consulta

Cada FacetResult puede usarse para acotar aún más tus resultados y solo incluir los documentos que tengan aquellos valores de la faceta. A fin de definir mejor las consultas con una o más de estas claves, úsalas como opciones de búsqueda:

it := index.Search(c, "...", &search.SearchOptions{
    Refinements: []search.Facet{
        facetResult1.Facet,
        facetResult2.Facet,
    },
})

Puedes combinar los perfeccionamientos para una o más facetas diferentes en la misma solicitud. Todos los perfeccionamientos que pertenezcan a la misma faceta se unirán con OR. Los perfeccionamientos de facetas diferentes se combinarán con AND.

También es posible crear una Facet personalizada de forma manual para usarla como un perfeccionamiento. Consulta la referencia para obtener más información.

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Entorno estándar de App Engine para Go