Come faccio a cercare sfaccettature vuote in un campo aspetto più apprezzato e allo stesso tempo in Solr?

StackOverflow https://stackoverflow.com/questions/2250751

  •  20-09-2019
  •  | 
  •  

Domanda

Ho una domanda in cui gli utenti possono scegliere parti di automobili. Prendono il loro veicolo e poi scegliere veicoli attributi come sfaccettature. Dopo selezionano il loro veicolo, possono scegliere sfaccettature come la dimensione del motore, ad esempio, per restringere la lista dei risultati. Il problema era, non tutti i documenti hanno una dimensione del motore (è un valore vuoto in Solr), in quanto non ha importanza per tutte le parti. Ad esempio, un formato del motore conta raramente per un filtro d'aria. Quindi, anche se un utente scelto 3.5L per le loro dimensioni del motore, ho ancora voglia di mostrare i filtri dell'aria sullo schermo come possibile parte l'utente potrebbe scegliere. Ho fatto qualche ricerca e la seguente query sfaccettatura funziona perfettamente:

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

Questa query sarebbe partita da 3,5 o sarebbe partita record in cui non vi era alcun valore per il campo dimensioni del motore (nessun valore significava che non aveva importanza, e montare la macchina). Perfetto ...

IL PROBLEMA : Recentemente ho fatto attributo veicolo campi I campi multivalore, così ho potuto memorizzare gli attributi per ogni parte in una lista. Ho poi applicato sfaccettatura ad esso, e ha funzionato bene. Tuttavia, il problema è venuto quando ho applicato la query precedentemente accennato sopra. Durante la selezione del sfaccettatura enginesize ristretto il numero di documenti visualizzati ai soli documenti che hanno quel dimensioni del motore, dischi (ho anche utilizzare il record parola per significare documento) che ha avuto valori (vale a dire "") vuote per enginesize non erano comparendo. La stessa query di cui sopra non funziona per gli aspetti più valori allo stesso modo ha fatto quando era enginesize un singolo campo valore.

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 motore di montaggio) corrisponde, perché contiene il valore in uno dei campi multivalore "enginesize" 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 <str> vuoti. Non voglio tornare il secondo documento a tutti perché non corrisponde al valore di sfaccettatura

Io fondamentalmente voglio una query che abbinerà i valori di stringa vuoti per un determinato aspetto e anche corrispondere al valore effettivo, in modo da ottenere entrambi i documenti restituiti.

Se qualcuno ha una query che sarebbe tornato documento 1 e il documento 3 (il supporto motore e il filtro dell'aria), ma non il documento di serraggio del motore?

Ho provato quanto segue 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 keepEmpty=true campo. . 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 farlo, 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?

È stato utile?

Soluzione

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

Invece di cercare di indice di "dimensioni del motore non importa", come un record vuoto, indice di come "ANY".

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

Altri suggerimenti

Sono appena stato a giocare con questo e ha trovato un suggerimento 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 doveva essere il contrario e senza il segno meno, vale a dire 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 risolvo a sostituire il valore vuoto con un pennarello speciale ...

Ho avuto lo stesso problema, ma risolto in https://stackoverflow.com/a/35633038/13365 :

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

La soluzione -enginesize non ha funzionato per me.

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