2010-02-12 9 views
6

Ho un'applicazione in cui gli utenti possono selezionare parti di automobili. Prendono il loro veicolo e poi scelgono gli attributi del veicolo come faccette. Dopo aver selezionato il proprio veicolo, possono selezionare aspetti come la dimensione del motore, ad esempio, per restringere l'elenco dei risultati. Il problema era che non tutti i documenti hanno una dimensione del motore (è un valore vuoto in Solr), poiché non importa per tutte le parti. Ad esempio, le dimensioni del motore raramente sono importanti per un filtro dell'aria. Quindi, anche se un utente ha scelto 3.5L per le dimensioni del motore, avrei comunque voluto mostrare i filtri dell'aria sullo schermo come possibile parte che l'utente potesse scegliere. Ho fatto qualche ricerca e la seguente query sfaccettatura funziona perfettamente:Come trovo le faccette vuote in un campo di sfaccettature multivalore e allo stesso tempo in Solr?

enginesize:"3.5" OR enginesize:(*:* AND -enginesize:[* TO *]) 

Questa query corrispondere da 3,5 o dovrebbe corrispondere i record in cui non vi era alcun valore per il campo dimensioni del motore (nessun valore significava che non aveva importanza, e si adatta alla macchina). Perfetto ...

IL PROBLEMA: di recente ho creato campi multivalore per i campi degli attributi del veicolo, quindi ho potuto memorizzare gli attributi per ogni parte come elenco. Ho quindi applicato la sfaccettatura e ha funzionato bene. Tuttavia, il problema si presentava quando ho applicato la query precedentemente citata. Mentre si selezionava la sfaccettatura motorizzata, si restringeva il numero di documenti visualizzati solo per i documenti che hanno quella dimensione del motore, i record (io uso anche la parola record per indicare il documento) che avevano valori vuoti (cioè "") per motori non comparivano. La stessa query sopra non funziona per gli aspetti multivalore nello stesso modo in cui lo faceva quando engineize era un campo a valore singolo.

Esempio:

<doc> 
    <str name="part">engine mount</str> 
    <arr name="enginesize"> 
    <str/> 
    <str/> 
    <str>3.5</str> 
    <str>3.5</str> 
    <str>3.5</str> 
    <str>3.5</str> 
    <str>3.5</str> 
    </arr> 
<doc> 

<doc> 
    <str name="part">engine bolt</str> 
    <arr name="enginesize"> 
    <str>6</str> 
    <str>6</str> 
    <str>6</str> 
    <str>6</str> 
    <str>6</str> 
    </arr> 
<doc> 

<doc> 
    <str name="part">air filter</str> 
    <arr name="enginesize"> 
    <str/> 
    <str/> 
    <str></str> 
    <str></str> 
    <str></str> 
    <str></str> 
    <str></str> 
    </arr> 
<doc> 

Quello che sto cercando è una query che tirare indietro i documenti 1 e 3 di cui sopra, quando faccio una ricerca sfaccettatura per la dimensione del motore per la 3.5. Il primo documento (il supporto motore) corrisponde, perché contiene il valore in uno dei campi multivalore "engineize" che sto cercando (contiene 3.5 in uno dei campi). Tuttavia, il terzo documento per il filtro dell'aria non viene restituito a causa dei valori vuoti <str>. Non voglio affatto restituire il secondo documento perché non corrisponde al valore della faccetta

Fondamentalmente voglio una query che corrisponda ai valori di stringa vuota per un dato aspetto e che corrisponda anche al valore effettivo, quindi ottengo entrambi documenti restituiti.

Qualcuno ha una query che restituisce il documento 1 e il documento 3 (la staffa del motore e il filtro dell'aria), ma non il documento del bullone del motore?

ho provato la seguente senza successo (tra cui quella in cima di questa domanda):

// returns everything 
enginesize:"3.5" OR (enginesize:[* TO *]) 
// only returns document 1 
enginesize:"3.5" OR (enginesize:["" TO ""] AND -enginesize:"3.5") 
// only returns document 1 
enginesize:"3.5" OR (enginesize:"") 

Ho importato i dati sopra utilizzando un file CSV, ho impostato il campo keepEmpty=true. Ho cercato invece di inserire manualmente uno spazio nel campo quando ho generato il file CSV (che darebbe <str> </str>, al posto del precedente, e quindi ritentato le query Fare questo, ho ottenuto i seguenti risultati:.

// returns document 1 
enginesize:"3.5" OR enginesize:(*:* AND -enginesize:[* TO *]) 
// returns all documents 
enginesize:"3.5" OR (enginesize:["" TO ""] AND -enginesize:"3.5") 
// returns all documents 
enginesize:"3.5" OR (enginesize:"") 

qualcuno ha una query che avrebbe funzionato per entrambi i casi, se ho uno spazio come il valore del bianco o semplicemente alcun valore?

risposta

8

come di cambiare come si indice, invece di come si esegue una query?

invece di cercare di indicizzare "la dimensione del motore non ha importanza" come un record vuoto, indicizzarlo come "ANY".

Poi la query diventa semplicemente enginesize: "3,5" O (enginesize: ANY)

+0

Non è necessario, consultare http://stackoverflow.com/a/35646250/13365 – neu242

1

Sono appena stato a giocare con questo e ha trovato un hint che sembra fare il trucco per me. tradotto alla tua richiesta dovrebbe essere:

enginesize:"3.5" OR (-enginesize:["" TO *]) 

hth,

andi


aggiornamento: dopo un po 'di più test non credo che questo funziona in modo affidabile - per alcuni indici che ha dovuto essere il contrario e senza il segno meno, ovvero enginesize:[* TO ""]. questo potrebbe dipendere dal tipo di indice, se è multivalore o anche sui valori effettivi.

in ogni caso sembra troppo di un hack. io probabilmente decidere di sostituire il valore vuoto con un pennarello speciale ...

Problemi correlati