2009-06-23 70 views
2

我使用Lucene for一个使用.net的求职门户。 我在下面的用例中遇到了一些与性能相关的问题。 用例为: 在进行求职时,用户可以选择工作地点(例如:Atlanta,GA)并选择径向距离(例如50英里)。从Lucene返回求职结果所需的时间非常长。我们正在维护一个sql server 2005数据库,我们在这里存储美国和加拿大的城市,州,经度和纬度(包含大约100万条记录)。使用Lucene提高基于位置的搜索的性能

是否有反正我可以提高这个位置的工作搜索的性能?

+0

您能详细说明您如何使用Lucene进行与数据库相关的基于位置的搜索吗?例如,当用户搜索“亚特兰大,GA”时,Lucene如何知道哪些城市距离它不到50英里?它是否必须首先查询数据库? – 2009-06-23 12:55:03

+0

感谢您的评论。我们有一个基于.Net的距离API,它将位置作为输入并返回给定半径内的最近的城市。然后将这个集合提供给Lucene用于搜索作业。 – user74042 2009-06-23 15:37:00

回答

3

基本上,你有两种类型的搜索参数:文本和空间。 您可能可以使用一种类型来过滤从另一种类型获得的结果。 例如,对于在亚特兰大附近寻找.NET开发人员工作的人,GA 您可以先检索所有.NET开发人员作业并筛选位置, 或检索亚特兰大周围的所有作业,并筛选.NET开发人员。 我相信第一个应该会更快。 您也可以将作业位置直接存储在Lucene中,并将它们合并到搜索中。 一个粗略的草案是: 索引: 1.当您收到一个新的'想要的'广告时,使用数据库找到它的地理位置。 2.将该位置作为Lucene字段存储在广告文档中。 检索: 1.根据文字匹配检索所有作业。 2.使用几何计算来查找用户位置和作业位置之间的距离。 3.根据距离过滤作业。

Lucene in Action有一个空间搜索的例子,类似于精神。 A second edition正在制作中。另外,请查看Sujit Pal's suggestions for spatial search with LucenePatrick O'Leary's framework。也有LocalluceneLocalSolr,但我不知道他们有多成熟。

0

我的索引规模约为4 MB.Am使用下面的代码用于建设就近城市查询:

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

你可能最终希望有Lucene的处理由索引tiles空间搜索。但是,如果您确定lucene查询速度缓慢,而不是城市的发现,那么先将州和城市一起编入索引。就像索引关系数据库中的多个列一样:“状态:城市”字段的值为“GA:Atlanta”。然后交叉点不在查询时完成。