Wie würde ich nach leeren Facetten in einem multi geschätzten Facettenfeld und gleichzeitig in Solr suchen?

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

  •  20-09-2019
  •  | 
  •  

Frage

Ich habe eine Anwendung, bei der Benutzer Autoteile auswählen können. Sie wählen ihr Fahrzeug und wählen dann Fahrzeugattribute als Facetten. Nachdem sie ihr Fahrzeug ausgewählt haben, können sie Facetten wie Motorgröße auswählen, um die Liste der Ergebnisse einzugrenzen. Das Problem war, dass nicht alle Dokumente eine Motorgröße haben (es ist ein leerer Wert in Solr), da es für alle Teile nicht spielt. Zum Beispiel ist eine Motorgröße selten für einen Luftfilter von Bedeutung. Selbst wenn ein Benutzer 3,5 l für seine Motorgröße auswählte, wollte ich die Luftfilter auf dem Bildschirm als möglicher Teil anzeigen, den der Benutzer auswählen konnte. Ich habe einige gesucht und die folgende Facettenabfrage funktioniert perfekt:

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

Diese Abfrage würde entweder mit 3,5 übereinstimmen oder die Datensätze übereinstimmen, bei denen kein Wert für das Feld der Motorgröße vorliegt (kein Wert bedeutete, dass es keine Rolle spielte und das Auto passte). Perfekt...

DAS PROBLEM: Ich habe kürzlich die Felder mit den Fahrzeugattributfeldern mit mehrivierenden Feldern gemacht, damit ich Attribute für jeden Teil als Liste speichern konnte. Ich habe mich dann darauf angewendet, und es hat gut funktioniert. Das Problem trat jedoch auf, als ich die zuvor erwähnte Abfrage angewendet habe. Bei der Auswahl der Motorgröße verengte sich die Anzahl der angezeigten Dokumente, die nur Dokumente mit dieser Motorgröße angezeigt wurden, Aufzeichnungen (ich verwende auch den Word -Datensatz, um Dokumente zu bedeuten), die leere Werte (dh "") für Motorsizesize auftraten. Die gleiche Abfrage oben funktioniert nicht für mehrfache Facetten wie bei der Motorisierung ein einziger wertvolles Feld.

Beispiel:

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

Was ich suche, ist eine Abfrage, die die Dokumente 1 und 3 oben zurückzieht, wenn ich eine Facettensuche nach der Motorgröße für 3,5 mache. Das erste Dokument (die Motorhalterung) stimmt überein, da es den Wert in einem der mehrwertigen Felder enthält, nach denen ich suche (enthält 3,5 in einem der Felder). Das dritte Dokument für den Luftfilter wird jedoch aufgrund des leeren nicht zurückgegeben <str> Werte. Ich möchte das zweite Dokument überhaupt nicht zurückgeben, da es nicht mit dem Facettenwert übereinstimmt

Ich möchte im Grunde eine Abfrage, die leere Zeichenfolgewerte für eine bestimmte Facette übereinstimmt und auch mit dem tatsächlichen Wert übereinstimmt, sodass ich beide Dokumente zurückgegeben habe.

Hat jemand eine Abfrage, die das Dokument 1 und das Dokument 3 (die Motorhalterung und den Luftfilter) zurückgeben würde, jedoch nicht das Motorschraubendokument?

Ich habe das Folgende ohne Erfolg ausprobiert (einschließlich des oben in dieser Frage):

// 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:"")

Ich habe die obigen Daten mit einer CSV -Datei importiert. Ich habe das Feld festgelegt keepEmpty=true. Ich versuchte stattdessen manuell ein Leerzeichen in das Feld, als ich die CSV -Datei generiert habe (was Ihnen geben würde <str> </str>, anstelle der vorherigen und dann die Anfragen wiederholt. Wenn ich das tun konnte, habe ich die folgenden Ergebnisse erzielt:

// 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:"")

Hat jemand eine Abfrage, die für jede Situation funktioniert, ob ich einen Platz als leerer Wert oder einfach keinen Wert habe?

War es hilfreich?

Lösung

Wie wäre es, wenn Sie Ihren Index ändern, anstatt wie Sie abfragen?

Anstatt zu versuchen, "Motorgröße" als leerer Datensatz zu indexieren, indizieren Sie es als "beliebt".

Dann wird Ihre Abfrage einfach motorisiert: "3.5" oder (enginesize: Any)

Andere Tipps

Ich habe gerade damit gespielt und einen gefunden Hinweis Das scheint mir den Trick zu tun. Übersetzt in Ihre Anfrage sollte es sein:

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

HTH,

und ich


UPDATE: Nach einigen weiteren Tests denke ich nicht, dass dies zuverlässig funktioniert - für einige Indizes musste es umgekehrt und ohne das Minuszeichen sein, dh dh dh, dh dh, dh dh, dh dh, dh dh, dh es enginesize:[* TO ""]. Dies kann vom Indextyp abhängen, wenn es sich um mehrwerte oder sogar von den tatsächlichen Werten handelt.

Auf jeden Fall scheint es zu viel ein Hack. Ich werde mich wahrscheinlich beschließen, den leeren Wert durch einen speziellen Marker zu ersetzen ...

Ich hatte das gleiche Problem, löste es aber in https://stackoverflow.com/a/35633038/13365:

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

Das -enginesize Lösung hat bei mir nicht funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top