使用Lucene提高基于位置的搜索的性能

时间:2009-06-23 06:19:42

标签: lucene lucene.net

我正在使用Lucene作为使用.net的求职门户。 我在以下用例中面临一些与性能相关的问题。 用例是: 在进行求职时,用户可以选择工作地点(对于exameple:Atlanta,GA)并选择径向距离(比如说50英里)。从Lucene返回求职结果所需的时间非常长。

仅供参考,我们正在维护一个sql server 2005数据库,我们存储美国和加拿大的城市,州,经度和纬度。(总共包含约100万条记录)。

无论如何我可以改善这个基于位置的求职的表现吗?

3 个答案:

答案 0 :(得分:3)

基本上,您有两种类型的搜索参数:文本和空间。 您可以使用一种类型来过滤从另一种类型中获得的结果。 例如,对于在乔治亚州亚特兰大附近寻找.NET开发人员工作的人 您可以先检索所有.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,但我不知道它们有多成熟。

答案 1 :(得分:0)

我的索引大小约为4 MB。使用以下代码构建最近城市的查询:

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

答案 2 :(得分:0)

您最终可能希望通过索引tiles让lucene处理空间搜索。但是如果你确定lucene查询很慢,而不是城市的发现,那么首先将州和城市一起索引。就像在关系数据库中索引多个列一样:'state:city'字段,其值为'GA:Atlanta'。然后交叉点不在查询时完成。

相关问题