Ricerca con facet

La ricerca filtrata ti consente di associare informazioni categoriche ai tuoi documenti. Un facet è una coppia di attributo/valore. Ad esempio, il facet denominato "taglia" potrebbe avere i valori "small", "medium" e "large".

Utilizzando le sfaccettature con la ricerca, puoi recuperare informazioni di riepilogo per aiutarti a perfezionare una query ed eseguire "drill-down" nei risultati in una serie di passaggi.

Questa opzione è utile per applicazioni come i siti di shopping, in cui intendi offrire ai clienti un insieme di filtri per restringere i prodotti che vogliono visualizzare.

I dati aggregati per una frazione mostrano come sono distribuiti i valori di una frazione. Ad esempio, il livello "dimensione" potrebbe essere visualizzato in molti dei documenti nel set di risultati. I dati aggregati per questa frazione potrebbero mostrare che il valore "piccolo" è apparso 100 volte, "medio" 300 volte e "grande" 250 volte. Ogni coppia espressione/valore rappresenta un sottoinsieme di documenti nel risultato della query. A ogni coppia è associata una chiave, chiamata affinamento. Puoi includere perfezionamenti in una query per recuperare i documenti che corrispondono alla stringa di query con valori facet corrispondenti a uno o più perfezionamenti.

Quando esegui una ricerca, puoi scegliere quali facet raccogliere e mostrare con i risultati o attivare il rilevamento dei facet seleziona i facet che compaiono più spesso nei tuoi documenti.

Aggiunta di facet a un documento

Aggiungi le sfaccettature a un documento prima di aggiungerlo a un indice. Esegui questa operazione nel momento in cui specifichi i campi 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.
}

Un facet è simile a un campo documento; ha un nome e assume un valore.

I nomi dei facet seguono le stesse regole dei campi dei documenti: i nomi sono maiuscole e minuscole e può contenere solo caratteri ASCII. Devono iniziare con una lettera e possono contenere lettere, cifre o trattini bassi. Un nome non può contenere più di 500 caratteri.

Il valore di un aspetto può essere una stringa atomica (non più lunga di 500 caratteri) o un numero (un valore in virgola mobile a doppia precisione compreso tra -2.147.483.647 e 2.147.483.647).

Puoi assegnare più valori a una frazione in un documento aggiungendo una frazione con lo stesso nome e tipo più volte, utilizzando ogni volta un valore diverso.

Non esiste un limite al numero di valori che può avere un aspetto. Inoltre, non c'è limite al numero di facet che puoi aggiungere a un documento o al numero di facet con nomi univoci in un indice.

Tieni presente che ogni volta che utilizzi un facet, può essere necessario un campo atomico o numerico valore. Un facet con il nome "size" può essere allegato a un documento con valore della stringa "small" e un altro documento con il valore numerico 8. Infatti, lo stesso facet può apparire più volte nello stesso documento con entrambi i tipi di valori. Sebbene sia consentito, non è consigliabile utilizzare sia valori atom che numerici per la stessa espressione.

Mentre un facet ha un tipo specifico quando lo aggiungi a un documento, la ricerca i risultati raccolgono tutti i valori corrispondenti. Ad esempio, i risultati per la dimensione "dimensione" potrebbero mostrare che sono state registrate 100 istanze del valore "piccolo", 150 istanze di "medio" e 135 istanze di valori numerici nell'intervallo [4, 8). I valori numerici esatti e la loro distribuzione della frequenza non vengono mostrati.

Quando recuperi un documento utilizzando una query, non puoi accedere direttamente alla relativa facet e valori. Devi richiedere che le informazioni sui vari aspetti vengano restituite con la query, come spiegato nella sezione successiva.

Utilizzo di una ricerca facet per recuperare informazioni sui facet

Puoi chiedere al backend di ricerca di scoprire i facet utilizzati più di frequente per te, chiamati il rilevamento automatico dei facet. Puoi anche recuperare le informazioni sulle sfaccettature in modo esplicito selezionando una sfacetta per nome o per nome e valore. Puoi combinare tutti e tre i tipi di recupero dei facet in una singola query.

La richiesta di informazioni sui vari aspetti non influisce sui documenti restituiti dalla query. Può influire sulle prestazioni. Eseguire una ricerca filtrata con la profondità predefinita di 1000 ha lo stesso effetto dell'impostazione del limite del punteggio delle opzioni di ordinamento su 1000.

Rilevamento automatico dei facet

La funzionalità di rilevamento automatico delle sfaccettature cerca le sfaccettature che compaiono più spesso in aggregato nei tuoi documenti. Ad esempio, supponiamo che i documenti corrispondenti la query include un "colore" facet che appare 5 volte con il valore "red", 5 volte con il valore "white" e cinque volte con il colore "blu". Questo facet conta in totale 15. Ai fini del rilevamento, viene classificato superiore a un'altra "sfumatura" di facet che appare negli stessi documenti corrispondenti 6 volte con il valore "dark" e sette volte con il valore "light".

Devi attivare la scoperta delle sfaccettature impostandola nella query:

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)
        }
    }
}

Quando recuperi i facet tramite discovery, per impostazione predefinita vengono restituiti solo i 10 valori più frequenti per un facet. Puoi aumentare questo limite fino a 100 utilizzando il primo parametro a AutoFacetDiscovery.

Tieni presente che la scoperta automatica delle sfaccettature non è pensata per restituire tutte le sfaccettature possibili e i relativi valori. I facet restituiti dalla scoperta possono variare da una corsa all'altra. Se è preferibile un insieme fisso di facet. Utilizza un parametro return_facets nella query.

I valori di stringa verranno restituiti singolarmente. I valori numerici di un i facet rilevati vengono restituiti in un singolo intervallo [min max). Puoi esaminare questo intervallo e creare un sottointervallo più piccolo per una query successiva.

Selezionare i facet per nome

Per recuperare le informazioni su un facet solo in base al nome, aggiungi FacetDiscovery con il nome del facet alle opzioni di ricerca per la tua query:

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

Quando recuperi i facet per nome, vengono restituiti solo i 10 valori più frequenti per un facet.

Selezionare i facet per nome e valore

Per recuperare le informazioni solo su determinati valori di un facet, aggiungi un FacetDiscovery con il nome del facet e i valori di interesse:

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),
        ),
    },
})

I valori in un singolo FacetDiscovery devono essere tutti dello stesso tipo, ovvero un elenco di valori search.Atom o, per i numeri, un elenco di search.Range, che sono intervalli chiusi a sinistra (inizio) e aperti a destra (fine). Se il tuo facet contiene una combinazione di valori di stringa e numerici, aggiungi opzioni FacetDisovery separate per ciascuna.

Opzioni

Puoi controllare il numero minimo di documenti da valutare per raccogliere informazioni sui facet aggiungendo l'opzione FacetDocumentDepth in SearchOptions per la tua query. Se non specificata, la profondità predefinita è 1000.

Tieni presente che la profondità delle sfaccettature è in genere molto maggiore del limite di query. I risultati dei facet vengono calcolati almeno fino alla profondità di documenti. Se hai impostato un limite di punteggio per le opzioni di ordinamento superiore alla profondità, verrà utilizzato il limite di punteggio.

Recupero dei risultati dei facet

Quando utilizzi parametri di ricerca facet in una query, le informazioni aggregate sui facet vengono fornite con il risultato della query stesso.

La ricerca Iterator ha un metodo Facets, che restituisce il facet aggregato informazioni come [][]FacetResult. I risultati sono organizzati in modo che ci sia una porzione di risultati facet per ogni facet visualizzato in un documento corrispondente alla tua query. Per ogni risultato, vedrai:

  • Il nome della frazione
  • Un valore per il facet nell'elenco dei valori più frequenti
  • Un conteggio approssimativo di quante volte è comparso quel valore

Tieni presente che l'elenco dei valori includerà la stringa di un facet e i valori numerici. Se il primo livello è stato rilevato automaticamente, i relativi valori numerici vengono restituiti come singolo intervallo [min max). Se hai richiesto esplicitamente un facet numerico con uno o più intervalli in la tua query, l'elenco conterrà un intervallo chiuso [start-end) per ogni intervallo.

L'elenco dei valori delle sfaccettature potrebbe non includere tutti i valori trovati nei documenti, poiché le opzioni di query determinano quanti documenti esaminare e quanti valori restituire.

Le informazioni aggregate per ogni aspetto possono essere lette dall'iteratore:

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

Ad esempio, una query potrebbe aver trovato documenti che includevano un facet "dimensioni" con valori di stringa e valori numerici. I risultati per questa espressione saranno costruiti nel seguente modo:

[][]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},
    },
}

Utilizzare i facet per perfezionare/filtrare una query

Ogni FacetResult può essere utilizzato per puoi restringere i risultati in modo da includere solo i documenti che contengono quei valori dei facet. A perfezionare le query con una o più di queste chiavi, passarle come opzioni di ricerca:

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

Puoi combinare i perfezionamenti per una o più sfaccettature diverse nella stessa richiesta. Tutti i perfezionamenti appartenenti allo stesso facet sono uniti con un OR. I perfezionamenti per diversi facet vengono combinati con AND.

È anche possibile creare manualmente un Facet personalizzato da utilizzare come perfezionamento. Per ulteriori informazioni, consulta il riferimento.