我正在使用Lucene作为使用.net的求职门户。 我在以下用例中面临一些与性能相关的问题。 用例是: 在进行求职时,用户可以选择工作地点(对于exameple:Atlanta,GA)并选择径向距离(比如说50英里)。从Lucene返回求职结果所需的时间非常长。
仅供参考,我们正在维护一个sql server 2005数据库,我们存储美国和加拿大的城市,州,经度和纬度。(总共包含约100万条记录)。
无论如何我可以改善这个基于位置的求职的表现吗?
答案 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 Lucene和Patrick O'Leary's framework。还有Locallucene和LocalSolr,但我不知道它们有多成熟。
答案 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'。然后交叉点不在查询时完成。