2009-06-23 8 views
2

J'utilise Lucene pour un portail de recherche d'emploi utilisant .net. Je suis confronté à des problèmes de performance dans le cas d'utilisation suivant. Le cas d'utilisation est: Lorsque vous effectuez une recherche d'emploi, l'utilisateur peut sélectionner l'emplacement du travail (par exemple: Atlanta, GA) et sélectionner la distance radiale (par exemple 50 miles). Pour information, nous conservons une base de données sql server 2005 dans laquelle nous stockons la ville, l'état, la longitude et la latitude des États-Unis et du Canada (contient un total d'environ 1 million d'enregistrements).Amélioration des performances de la recherche basée sur l'emplacement à l'aide de Lucene

Y at-il de toute façon que je peux améliorer la performance de cette recherche d'emploi basée sur l'emplacement?

+0

Seriez-vous en mesure d'expliquer comment exactement vous utilisez Lucene pour effectuer des recherches basées sur l'emplacement en relation avec votre base de données? Lorsqu'un utilisateur recherche "Atlanta, GA", par exemple, comment Lucene sait-elle quelles villes se trouvent à moins de 50 miles de celle-ci? Est-ce qu'il doit d'abord interroger la base de données? –

+0

Merci pour vos commentaires. Nous avons une API de distance basée sur .Net qui prend l'emplacement comme entrée et renvoie les villes les plus proches dans un rayon donné. Cette collection est ensuite donnée à Lucene pour la recherche d'emplois. – user74042

+0

Alors cherchez-vous l'index Lucene pour la chaîne "Atlanta, GA"? Qu'est-ce que vous indexez? Est-ce que vous indexez "Atlanta, GA" comme un terme ou est-ce divisé en jetons? – Gandalf

Répondre

3

Fondamentalement, vous avez deux types de paramètres de recherche: textuel et spatial. Vous pouvez probablement utiliser un type pour filtrer les résultats que vous avez obtenus de l'autre. Par exemple, pour quelqu'un recherchant un travail développeur .NET près d'Atlanta, GA vous pouvez soit récupérer d'abord tous les travaux développeur .NET et filtrer pour l'emplacement, ou récupérer tous les emplois autour d'Atlanta et filtrer pour les développeurs .NET. Je crois que le premier devrait être plus rapide. Vous pouvez également stocker les emplacements de travail directement dans Lucene et les intégrer dans la recherche. Un brouillon est: Indexation: 1. Lorsque vous recevez une nouvelle annonce "recherchée", recherchez sa géolocalisation à l'aide de la base de données. 2. Stockez l'emplacement en tant que champ Lucene dans le document de l'annonce. Récupération: 1. Récupérez tous les travaux en fonction des correspondances textuelles. 2. Utilisez des calculs géométriques pour trouver les distances entre l'emplacement de l'utilisateur et le lieu de travail. 3. Filtrer les travaux en fonction de la distance.

Lucene in Action a un exemple de recherche spatiale similaire dans l'esprit. A second edition est en cours de réalisation. En outre, consultez Sujit Pal's suggestions for spatial search with Lucene et Patrick O'Leary's framework. Il y a également Locallucene et LocalSolr, mais je ne sais pas à quel point ils sont mûrs.

0

ma taille d'index est d'environ 4 MB.Am en utilisant le code suivant pour la construction de requête pour les villes les plus proches:

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 est un peu exagéré pour un si petit ensemble de données. – Gandalf

+0

nous attendons des millions d'enregistrements indexés à Lucene ... – user74042

0

Vous voudrez peut-être en fin de compte avoir Lucene gérer la recherche spatiale par l'indexation tiles. Mais si vous êtes certain que la requête lucene est lente, pas la découverte des villes, alors commencez par indexer l'état et la ville ensemble. Tout comme l'indexation de plusieurs colonnes dans une base de données relationnelle: un champ 'state: city' avec des valeurs comme 'GA: Atlanta'. Ensuite, l'intersection n'est pas effectuée au moment de la requête.

Questions connexes