Domanda

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

Io sto usando il filtro di query (&fq=) per restringere mie selezioni.Il problema è che se qualcuno cerca un 2000 Acura Integra, sarà trovare il precedente record, 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 (Io normalmente fuga URL caratteri quando ho posto a Solr, questo è solo un esempio)

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

Ho 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 e giorni.

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

Grazie

È stato utile?

Soluzione 2

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.

Date un'occhiata al seguente esempio:

Il seguente è il contenuto 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.

Altri suggerimenti

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

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top