In Solr, Come la query con un campo per diverso insieme di valori in un campo multivalore

Io, fondamentalmente, desidera che Solr per la ricerca di ogni record del campo multivalore per i miei parametri di ricerca.. continua a leggere per il mio esempio:

Sto usando Solr per indicizzare i miei dati. Ho i dati dell’applicazione in parallelo matrici (in forma di campi multivalore) che corrispondono a un dato prodotto. Vedere l’esempio seguente, dove la marca, il modello e l’anno sono i campi multivalore:


<-solr record start->
sku: 1234
make: acura, acura, acura
model: integra, rsx, rsx
year: 1997, 2004, 2000
engine: 3.4, 4.5, 4.5
<-solr record end->

Sto usando le query di filtro (&fq=) per restringere mie selezioni. Il problema è che se qualcuno cerca un 2000 Acura Integra, che sarà eguagliare il record sopra, ma dal momento che la marca, il modello e anno dati è codificato in parallelo, vi è in realtà alcuna 2000 Acura Integra per questo prodotto. Solr è di corrispondenza, il fare in campo, il modello nel campo del modello, e di anno in anno in campo (come dovrebbe essere) e la restituzione di questo risultato, e non rispettare la mia parallelismo.
La mia richiesta sarebbe simile a questa finora:


fq=make:"acura"&fq=model:"integra"&fq=year:2000 (I would normally escape URL characters when I POST to Solr, this is just an example)

Quindi la mia soluzione è stata quella di creare un altro campo multivalore, chiamato campo di riepilogo,in cui vorrei mettere tutte le marca, modello, anno e di altri dati (come motore) insieme separati da uno spazio. È necessario avere le quotazioni attorno alle parole, quindi termini più parole non corrispondono i parametri di ricerca inavvertitamente. L’esempio di cui sopra dovrebbe essere simile a questo:


<-solr record start->
sku: 1234
make: acura, acura, acura
model: integra, rsx, rsx
year: 1997, 2004, 2000
engine: 3.4, 4.5, 4.5
summary: "acura" "integra" "1997" "3.4", "acura" "rsx" "2004" "4.5", "acura" "rsx" "2000", "4.5"
<-solr record end->

Quindi aggiungere alla query seguente:


summary:(""acura" AND "integra" AND "2000")

Mi aspetterei, se ho aggiunto che, a mia domanda, che questo record non sarebbe più venuto, dato che non c’è la acura integra 2000 nel campo di riepilogo. Tuttavia, questo trucchi non funzionano. Il record è ancora in piedi. Io sono perplesso. Qualcuno ha una soluzione a questo problema. E ‘ stato ucciso me per giorni.

Io, fondamentalmente, desidera che Solr per la ricerca di ogni record del campo multivalore per i miei parametri di ricerca.. è possibile? C’è un modo migliore per fare quello che sto cercando di fare?

Grazie

InformationsquelleAutor Dan | 2010-02-11

 

3 Replies
  1. 3

    Sembra che il tuo schema non è abbastanza di destra. Completo utilizzo della denormalizzazione i dati e creare un documento per il veicolo. Che cos’è un “veicolo”, dipende da che tipo di ricerche da eseguire. Per esempio, un possibile schema sarebbe:

    sku: 1234
    make: acura
    model: integra
    years: 1997
    engines: 3.4, 4.5
    
    sku: 1235
    make: acura
    model: rsx
    years: 2000, 2004
    engines: 4.5
    

    Il campo di riepilogo sarebbe un copyField di fare+modello+anni+motori

    • Hey. Questa è stata la mia soluzione originale esattamente, e funziona perfettamente! L’unico problema è che quando vai al prodotto schermo del mio sito, la visualizzazione del numero di applicazioni, invece del numero di prodotti. Se la stessa marca, modello e anno appartiene a una sku, e solo il motore o il sottomodello è diverso, ho semplicemente affermare che, in una “per la sezione” il prodotto. Per Esempio, potrei lanciare 4 applicazioni in 1 prodotto “box” sul mio sito. I risultati della ricerca dovrebbero dire di visualizzazione 1 a 1. Invece si dice di visualizzazione 4 di 4 (anche se c’è un dialogo sullo schermo). Quindi, il mio nuovo schema…
    • date un’occhiata al campo di crollare: wiki.apache.org/solr/FieldCollapsing
    • Perché il problema è un SKU (12345) può contenere più veicoli. ogni SKU + veicolo di uno come il suo record è bello, ma la visualizzazione di loro come un cliente è orribile. Tirando su ciascun veicolo (e applicazioni) ed allegando alla stessa SKU che si adatta, si rende più visibile. Tuttavia, si potrebbe essere la visualizzazione di 10 applicazioni per pagina, ma hai solo 3 “scatole” in cui un utente può comprare qualcosa. COSÌ dice la Visualizzazione di Elementi da 1 a 10, ma solo 3 “scatole” con le immagini e un “click to buy” è elencato.
    • Scusa Dan, ma queste domande sono molto specifiche del vostro progetto, in particolare, non posso rispondere.
    • E ‘ OK. Grazie per l’aiuto comunque. Date un’occhiata al Campo di Crollare
  2. 3

    Io non sono ancora sicuro su come mantenere il parallelismo senza un campo di riepilogo, ma ho capito come farlo con un campo di riepilogo. Invece di utilizzare E consolidato, che credo di ricerca ogni record nel campo multivalore per una partita (ogni E cantando termine potrebbe corrispondere una diversa riga il campo Multivalore, non necessariamente sulla stessa riga), è invece mettere esattamente i termini che stai cercando, nello stesso ordine in cui hai costruito il tuo originale di sintesi, e di utilizzare i ~ operatore.

    Dare un’occhiata al seguente esempio:

    I seguenti sono i contenuti del campo di riepilogo in una delle righe del campo multivalore, che desidero match:

    "Honda" "Accord" "2004" "3.5L"

    Questa è la query verrà eseguito:

    summary_field:("\"Honda\" \"2004\"")

    La query di cui sopra, da solo non funziona. Anche se posso avere una funzione che mette l’input dell’utente dall’applicazione nello stesso ordine che l’originale campo di riepilogo è stato costruito, perché gli utenti dell’applicazione possono inserire un pezzo di dati (una marca, modello, anno) in qualsiasi ordine, ci possono essere altre parole tra i dati che sto cercando di partita. Sopra eample, voglio partita Honda 2004 al record. Tuttavia, l’Accordo è tra.

    Per aggirare questo problema, utilizzare semplicemente il ~n operatore, dove n è il numero massimo di altre condizioni tra i termini di ricerca. Quindi, se io invece uso:


    summary_field:("\"Honda\" \"2004\""~1)

    Sto dicendo che tra Honda e il 2004, c’è una possibilità che ci sia 1 altra parola. Quindi, questo query di cui sopra, andrà incontro. Anche se si aggiungono più termini di campo di riepilogo, come lungo come lei query con i valori dello stesso ordine, e la vostra ricerca fuzzy logic utilizza un numero che dovrà essere la distanza massima tra 2 valori, la query sarà sempre abbinare il corretto campo di riepilogo. Quindi, se si dispone di 20 campi che è possibile aggiungere al vostro campo riepilogo per mantenere il parallelismo, è sufficiente utilizzare ~18, che è la massima distanza possibile in uno scenario di caso peggiore, tra le parole che potrebbero essere scelto dall’utente.

  3. 0

    Si può non solo fare una query come segue?

    make:acura AND model:integra AND year:2000
    

    I. e. Senza le Virgolette intorno la marca e il modello.

Lascia un commento