2009-03-31 8 views
3

Ich habe einen Index, der Geburtsdaten speichert, und ich möchte nach jemandem suchen, dessen Geburtsdatum innerhalb von X Tagen eines bestimmten Monats/Tages liegt. Zum Beispiel würde ich gerne wissen, ob innerhalb einer bestimmten Anzahl von Tagen jemand Geburtstag hat, unabhängig davon, in welchem ​​Jahr sie geboren wurden. Wie würde ich diese Abfrage mit Solr durchführen? (im Feld "Geburtsdatum")Wie funktioniert eine Geburtstags- (nicht Geburtsdatum) Suche in Solr?

Wenn diese Abfrage sehr häufig ausgeführt wird, sollte ich als Nachverfolgung etwas anderes indizieren als das Geburtsdatum? Wie nur das Monat-Tag-Paar? Was ist der effizienteste Weg, um eine solche Abfrage durchzuführen (vom Standpunkt der Abfrage und Indexierung)?

Antwort

2

Sie müssen sich daran erinnern, dass Solr Lucene verwendet, und dass ab sofort - alles als String gespeichert und indiziert wird.

Bereich Abfrage wird nicht funktionieren, weil die Daten in der Regel intern als JJJJMMTT indiziert sind

ein separates Feld in dem Index, der gerade MMDD Strings speichert wäre leicht gefunden.Oder wenn Sie kein zusätzliches Feld wünschen und die Daten anders indizieren möchten, richten Sie die Reihenfolge beim Indizieren so ein, dass Geburtsdaten indexiert werden. Dann können Sie Bereichsabfragen erstellen, da alles, was Sie abgleichen müssen, in ist die Vorderseite der Saite und lucene Spiele lexiographically

(A rangequery, die ba war -> bc würde passen BAt, Baseball, aber nicht so.)

Indexing wie dies ist eine einmalige Fixkosten und doesnt zerstören alles andere als interne Anordnung chronologisch. Wenn das ein Problem ist, verwenden Sie zwei Felder, Speicherplatz ist billig!)

+0

Okay, großartig, danke. Es ist eine Schande, dass niemand eine Lösung für diese Suche direkt auf dem Geburtsdatum Feld hat ... Ich habe herum mit dem Hinzufügen meiner eigenen FieldType von "BirthdayField", die Indizes wie es ist ein IntField, aber Abfragen, wie es ist ein DateField. .. Lotsa Arbeit. –

+0

Es gibt wahrscheinlich Möglichkeiten, direkt in diesem Feld zu suchen, aber nicht effizient. Aufgrund der Tatsache, dass Sie eine Menge zusätzlicher Logik benötigen und keine vollständigen Antworten in einer einzigen Abfrage erhalten könnten. – Max

+0

Ja, es war die "direkt auf diesem Feld" Frage, die ich wirklich beantwortet haben wollte, stattdessen gab jeder Antworten für die "Follow-up" Frage, die ich gestellt habe. Und ich hatte bereits eine Lösung für das Follow-up (in Anlehnung an das, was Sie vorgeschlagen haben). –

2

Wenn ein Tag/Monat-Paar knifflig ist (ich weiß nicht, ob es ist oder nicht), warum nicht ein Feld von "ihrem Geburtstag 1980" haben (ob sie damals lebten oder nicht). Dann müssen Sie nur die Suche gegen 1980 durchführen. Dies ist effektiv ein Tag/Monat Paar, aber in einem Typ gespeichert, den Sie problemlos verwenden können.

Beachten Sie, dass 1980 ein Schaltjahr ist, weshalb ich es gewählt habe - sonst könnten diejenigen mit einem Geburtstag vom 29. Februar schwer darzustellen sein.

Alternativ kann ein „Tag/Monat“ Paar in Form einer ganzen Zahl:

(100 * month) + day 

würden Sie eine einfache Darstellung geben, die suchen und Index wäre leicht. Ich habe normalerweise festgestellt, dass das Speichern von Daten in einem einzelnen Feld einfacher ist als die Verwendung von zwei Feldern. Dann wieder habe ich nie Solr verwendet ...

EDIT: Ich hatte eine andere Idee. Es ist ein bisschen mild, aber auch so ...

Speichern Sie die Geburt Datum in einem Format, das effektiv Monat, Tag, Jahr ist. Ich weiß nicht, ob Solr es leicht in MM/tt/Format tun könnte und dann eine lexikographische Ordnung suchen, aber die Alternative ist

(100000 * month) + (1000 * dayOfMonth) + (year - 1900) 

(Dies wird vorausgesetzt, Sie brauchen es nicht geboren zu speichern Daten früher als 1900. Ich bin sicher, Sie können es anpassen.)

Sie können immer noch das ursprüngliche Geburtsdatum wiederherstellen, aber die Bestellung wird in Geburtstagsreihenfolge sein, mit der ältesten Person zuerst für ein bestimmtes Datum.

Es bedeutet, es ist schwer zu sortieren Menschen nach ihrer tatsächlichen Alter obwohl. Ich weiß nicht, ob das ein Problem für dich ist.

Wie auch immer, wie ich sagte, es ist ein bisschen off-the-wall, aber es könnte :)

+0

Ein Tag/Monat-Paar ist nicht schwierig, es bedeutet nur "noch ein weiteres Feld im Schema", das für alle Datensätze vorhanden sein muss. Das versuche ich zu vermeiden. Das Festlegen eines Geburtsdatums in einem bestimmten Jahr ist fast identisch mit einem Monat/Tag-Paar, es hat nur ein CONSTANT-Jahr (statt "kein Jahr"). –

0

helfen Sie den Geburtstag als eine Zahl von 1 bis 366. Dann diesen Wert suchen speichern könnten. Der Vorteil ist, dass Sie dann ganz einfach mit Tagesbereichen suchen können. Der Nachteil ist, dass Sie dieses Feld nicht einfach verwenden können, um Personen zu finden, deren Geburtstag diesen Monat ist.