2009-06-23 10 views
2

Ich verwende Lucene für ein Job-Suchportal mit .net. Ich habe im folgenden Anwendungsfall einige Leistungsprobleme. Anwendungsfall ist: Bei der Jobsuche kann der Benutzer den Arbeitsort auswählen (z. B. Atlanta, GA) und die Radialentfernung wählen (etwa 50 Meilen). Die für die Rückgabe der Ergebnisse der Jobsuche benötigte Zeit ist sehr hoch.Verbesserte Leistung der standortbasierten Suche mit Lucene

FYI, wir unterhalten eine SQL Server 2005 Datenbank, in der wir US-amerikanische und kanadische Städte, Bundesstaaten, Längen- und Breitengrade speichern (enthält insgesamt ca. 1 Million Datensätze).

Kann ich die Leistung dieser standortbasierten Jobsuche verbessern?

+0

Wären Sie in der Lage zu erläutern, wie genau Sie Lucene verwenden, um ortsbezogene Suchen in Bezug auf Ihre Datenbank durchzuführen? Wenn ein Benutzer zum Beispiel nach "Atlanta, GA" sucht, woher weiß Lucene, welche Städte innerhalb von 50 Meilen davon liegen? Muss es zuerst die Datenbank abfragen? –

+0

Vielen Dank für Ihre Kommentare. Wir haben eine .Net-basierte Distanz-API, die den Ort als Eingabe akzeptiert und die nächstgelegenen Städte innerhalb eines bestimmten Radius zurückgibt. Diese Sammlung wird dann an Lucene für Suchaufträge übergeben. – user74042

+0

Sie suchen also den Lucene-Index für die Zeichenfolge "Atlanta, GA"? Was indexierst du? Indexieren Sie "Atlanta, GA" als einen Begriff oder ist er in Token aufgeteilt? – Gandalf

Antwort

3

Grundsätzlich gibt es zwei Arten von Suchparametern: textuell und räumlich. Sie können wahrscheinlich einen Typ verwenden, um die Ergebnisse zu filtern, die Sie von den anderen erhalten haben. Für jemanden, der nach einem .NET-Entwicklerjob in der Nähe von Atlanta, GA sucht, könnten Sie zuerst alle .NET-Entwicklerjobs abrufen und nach dem Standort filtern oder alle Jobs in Atlanta abrufen und nach .NET-Entwicklern filtern. Ich glaube, der erste sollte schneller sein. Sie können die Jobspeicherorte auch direkt in Lucene speichern und in die Suche einbeziehen. Ein grober Entwurf ist: Indexierung: 1. Wenn Sie eine neue "gewollte" Anzeige erhalten, finden Sie deren geografische Position anhand der Datenbank. 2. Speichern Sie den Standort als Lucene-Feld im Dokument der Anzeige. Abruf: 1. Abrufen aller Jobs nach textuellen Übereinstimmungen. 2. Verwenden Sie geometrische Berechnungen, um Entfernungen zwischen dem Ort des Benutzers und dem Ort des Jobs zu finden. 3. Filtern Sie Jobs nach Entfernung.

Lucene in Action hat ein Beispiel für räumliche Suche ähnlich im Geiste. A second edition ist in der Mache. Überprüfen Sie auch Sujit Pal's suggestions for spatial search with Lucene und Patrick O'Leary's framework. Es gibt auch Locallucene und LocalSolr, aber ich weiß nicht, wie ausgereift sie sind.

0

meine Indexgröße ist ca. 4 MB.Am für den folgenden Code verwenden Abfrage Aufbau für nächstgelegenen Städten:

foreach (string city in htNearestCities.Keys) 
       { 
        cityStateQuery = new BooleanQuery(); 
        queryCity = queryParserCity.Parse("\"" + city + "\""); 
        queryState = queryParserState.Parse("\"" + ((string[])htNearestCities[city])[1] + "\""); 
        cityStateQuery.Add(queryCity, BooleanClause.Occur.MUST); 
        cityStateQuery.Add(queryState, BooleanClause.Occur.MUST); 

        findLocationQuery.Add(cityStateQuery, BooleanClause.Occur.SHOULD); 
        } 
+0

4MB? Lucene ist ein bisschen übertrieben für solch einen kleinen Datensatz. – Gandalf

+0

wir erwarten Millionen von Aufzeichnungen in Lucene auf der ganzen Linie indiziert werden ... – user74042

0

Sie schließlich lucene behandeln die räumliche Suche haben tiles durch Indizierung möchten. Aber wenn Sie sicher sind, dass die Lucene-Abfrage langsam ist, nicht das Finden der Städte, dann fangen Sie an, indem Sie den Staat und die Stadt zusammen indizieren. Ähnlich wie das Indizieren mehrerer Spalten in einer relationalen Datenbank: ein Feld 'state: city' mit Werten wie 'GA: Atlanta'. Dann wird die Kreuzung nicht zur Abfragezeit durchgeführt.