我将 Lucene 用于使用 .net 的求职门户。在以下用例中,我面临一些与性能相关的问题。用例是:在进行求职时,用户可以选择工作地点(例如:亚特兰大,乔治亚州)并选择径向距离(例如 50 英里)。从 Lucene 返回求职结果所需的时间相当长。
仅供参考,我们正在维护一个 sql server 2005 数据库,我们在其中存储美国和加拿大的城市、州、经度和纬度。(总共包含大约 100 万条记录)。
无论如何我可以提高这个基于位置的求职的表现吗?
我将 Lucene 用于使用 .net 的求职门户。在以下用例中,我面临一些与性能相关的问题。用例是:在进行求职时,用户可以选择工作地点(例如:亚特兰大,乔治亚州)并选择径向距离(例如 50 英里)。从 Lucene 返回求职结果所需的时间相当长。
仅供参考,我们正在维护一个 sql server 2005 数据库,我们在其中存储美国和加拿大的城市、州、经度和纬度。(总共包含大约 100 万条记录)。
无论如何我可以提高这个基于位置的求职的表现吗?
基本上,您有两种类型的搜索参数:文本和空间。您可能可以使用一种类型来过滤从另一种类型获得的结果。例如,对于在佐治亚州亚特兰大附近寻找 .NET 开发人员工作的人,您可以先检索所有 .NET 开发人员工作并筛选位置,或者检索亚特兰大周围的所有工作并筛选出 .NET 开发人员。我相信第一个应该更快。您还可以将工作地点直接存储在 Lucene 中,并将它们合并到搜索中。一个粗略的草案是: 索引: 1. 当您收到一个新的“通缉”广告时,使用数据库找到它的地理位置。2. 将位置作为 Lucene 字段存储在广告文档中。检索: 1. 根据文本匹配检索所有作业。2. 使用几何计算来查找用户之间的距离 地点和工作地点。3. 根据距离过滤职位。
Lucene in Action有一个类似空间搜索的例子。第二版正在制作中。此外,请查看Sujit Pal 对使用 Lucene和Patrick O'Leary 的框架进行空间搜索的建议。也有Locallucene和LocalSolr,但不知道成熟度如何。
我的索引大小约为 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);
}
您可能最终希望 lucene 通过索引切片来处理空间搜索。但是,如果您确定 lucene 查询很慢,而不是查找城市,那么首先将州和城市编入索引。很像在关系数据库中索引多个列:一个 'state:city' 字段,其值类似于 'GA:Atlanta'。然后在查询时没有完成交集。