Miglioramento delle prestazioni della ricerca basata sulla posizione tramite Lucene

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

  •  06-07-2019
  •  | 
  •  

Domanda

Sto usando Lucene per un portale di ricerca di lavoro usando .net. Sto affrontando alcuni problemi relativi alle prestazioni nel seguente caso d'uso. Il caso d'uso è: Durante la ricerca di lavoro, l'utente può selezionare la posizione del lavoro (per esempio: Atlanta, GA) e selezionare la distanza radiale (diciamo 50 miglia). Il tempo necessario per restituire i risultati della ricerca di lavoro da Lucene è piuttosto elevato.

Cordiali saluti, stiamo mantenendo un database sql server 2005 in cui archiviamo città, stato, longitudine e latitudine negli Stati Uniti e in Canada (contiene un totale di circa 1 milione di record).

Posso comunque migliorare le prestazioni di questa ricerca di lavoro basata sulla posizione?

È stato utile?

Soluzione

Fondamentalmente, hai due tipi di parametri di ricerca: testuale e spaziale. Probabilmente puoi usare un tipo per filtrare i risultati ottenuti dall'altro. Ad esempio, per qualcuno che cerca un lavoro di sviluppatore .NET vicino ad Atlanta, GA è possibile innanzitutto recuperare tutti i lavori di sviluppo .NET e filtrare per posizione, o recuperare tutti i lavori intorno ad Atlanta e filtrare per quelli per sviluppatori .NET. Credo che il primo dovrebbe essere più veloce. È inoltre possibile memorizzare le posizioni di lavoro direttamente in Lucene e incorporarle nella ricerca. Una bozza approssimativa è: indicizzazione:  1. Quando ricevi un nuovo annuncio "ricercato", trova la sua posizione geografica utilizzando il database.  2. Memorizzare la posizione come campo Lucene nel documento dell'annuncio. Recupero:  1. Recupera tutti i lavori in base alle corrispondenze testuali.  2. Utilizzare calcoli geometrici per trovare le distanze tra il luogo dell'utente e il luogo di lavoro.  3. Filtra i lavori in base alla distanza.

Lucene in Action ha un esempio di ricerca spaziale simile nello spirito. Una seconda edizione è in preparazione. Inoltre, controlla i suggerimenti di Sujit Pal per la ricerca spaziale con Lucene e Framework di Patrick O'Leary . Ci sono anche Locallucene e LocalSolr , ma non so quanto siano maturi.

Altri suggerimenti

la mia dimensione dell'indice è di circa 4 MB. Sto usando il seguente codice per creare query per le città più vicine:

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);
                    }

Alla fine potresti voler fare in modo che lucene gestisca la ricerca spaziale indicizzando piastrelle . Ma se sei sicuro che la query lucene sia lenta, non la ricerca delle città, inizia indicizzando insieme lo stato e la città. Proprio come indicizzare più colonne in un database relazionale: un campo 'state: city' con valori come 'GA: Atlanta'. Quindi l'intersezione non viene eseguita al momento della query.

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