2012-04-15 3 views
2

Ich möchte Dokumente steigern, die inStock sind: true und mit hoher Preis, in einer Weise, dass:Solr: wie ein boolean Feld in 1 abzubilden und 2 für die Steigerung

  • inStock: true 1
  • inStock: false ist 2

Damit ich die Produktion von Preis und inStock numerische Darstellung als Boost-Funktion verwenden kann:

document boost = (inStock == true ? 2 : 1) * price 

Ist das möglich? Es gibt bereits eine question about boolean field boosting, aber es erfüllt meine Anforderung nicht.

UPDATE1:

SOLR-2136 in Solr implementiert 4 ist für die bedingte Funktion (if), die meinem Fall einfach macht. Da Solr 4 noch nicht freigegeben ist, gibt es eine Problemumgehung?

UPDATE2: Versuchen Sie, in Solr keinen booleschen Feldtyp zu verwenden. Es speichert 'T' für wahr und 'F' für falsch, und Sie müssen map() und ord() verwenden, um true zu 1 und false zu 0 zuzuordnen. Verwenden Sie einfach int für boolesche Werte, und wenn Sie nicht ' t Lassen Sie in Ihren booleschen Feldern null zu, indexieren Sie keine falschen Werte für Ihr Feld.

Antwort

1

Ja gibt es eine Abhilfe:

Verwenden Sie die ord() function es wird eine Ordnungs Rückkehr basierend auf der Menge der indexierten Feldwerte.

Das heißt, wenn Sie nur die "wahren" Werte für Ihr inStock-Feld indizieren (und falsche Werte aus dem Index belassen), können Sie sicherstellen, dass es nur einen einzigen Wert für Ihr inStock-Feld gibt, was bedeutet, dass dieser Wert haben Sie die Indexposition von 1 und ord (inStock) gibt 1 für alle Dokumente zurück, die inStock == true haben. Andererseits gibt ord() 0 zurück, wenn das inStock-Feld in einem Dokument nicht verfügbar ist.

Wenn Sie nun true = 1 und false = 2 zuordnen möchten, können Sie zusätzlich die map Funktion verwenden, um die Zahlen zu ändern.

+0

Ich indiziert sowohl wahr als auch falsch für inStock; Außerdem in der lexikographischen Ordnung von Solr ord (wahr) = 2, ord (falsch) = 1, was ich wollte. – Mohsen

+1

@Mohsen Ok, perfekt. Aber sei sicher, dass du immer mindestens einen Gegenstand mit iStock = false hast, sonst wird dein True zu einer "1" !! – Omnaest

Verwandte Themen