我正在使用 Lucene 开发基于 Web 的求职应用程序。我网站上的用户可以搜索距离“波士顿,马萨诸塞州”或任何其他位置 100 英里范围内的工作。另外,我需要以降序显示按“相关性”(即lucene返回的分数)排序的搜索结果。
我正在使用第 3 方 API 来获取城市给定半径内的所有城市。这个 API 返回我在“波士顿,MA”半径 100 英里内的大约 864 个城市。
我正在使用以下逻辑构建城市/州 Lucene 查询,这是我的“BuildNearestCitiesQuery”方法的一部分。这里nearestCities 是上述API 返回的哈希表。它包含864 个城市,CityName 作为key,StateCode 作为value。finalQuery 是一个 Lucene BooleanQuery 对象,其中包含用户输入的其他搜索条件,例如:技能、关键字等。
foreach (string city in nearestCities.Keys)
{
BooleanQuery tempFinalQuery = finalQuery;
cityStateQuery = new BooleanQuery();
queryCity = queryParserCity.Parse(city);
queryState = queryParserState.Parse(((string[])nearestCities[city])[1]);
cityStateQuery.Add(queryCity, BooleanClause.Occur.MUST); //must is like an AND
cityStateQuery.Add(queryState, BooleanClause.Occur.MUST);
}
nearestCityQuery.Add(cityStateQuery, BooleanClause.Occur.SHOULD); //should is like an OR
finalQuery.Add(nearestCityQuery, BooleanClause.Occur.MUST);
然后我将 finalQuery 对象输入到 Lucene 的 Search 方法中,以获取 100 英里半径内的所有工作。:
searcher.Search(finalQuery, collector);
我发现这个 BuildNearestCitiesQuery 方法平均需要高达 29 秒的时间来执行,这显然是任何网站标准都不能接受的。我还发现涉及“Parse”的语句与其他语句相比需要相当长的时间来执行陈述。
给定位置的工作是一个动态属性,因为一个城市今天可能有 2 个工作(满足特定搜索条件),但 3 天后相同搜索条件的工作为零。所以,我不能使用任何“缓存”这边。
有什么方法可以优化这个逻辑吗?或者我的整个方法/算法可以使用 Lucene 在 100 英里内找到所有工作?
仅供参考,这是我在 Lucene 中的索引的样子:
doc.Add(new Field("jobId", job.JobID.ToString().Trim(), Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.Add(new Field("title", job.JobTitle.Trim(), Field.Store.YES, Field.Index.TOKENIZED));
doc.Add(new Field("description", job.JobDescription.Trim(), Field.Store.NO, Field.Index.TOKENIZED));
doc.Add(new Field("city", job.City.Trim(), Field.Store.YES, Field.Index.TOKENIZED , Field.TermVector.YES));
doc.Add(new Field("state", job.StateCode.Trim(), Field.Store.YES, Field.Index.TOKENIZED, Field.TermVector.YES));
doc.Add(new Field("citystate", job.City.Trim() + ", " + job.StateCode.Trim(), Field.Store.YES, Field.Index.UN_TOKENIZED , Field.TermVector.YES));
doc.Add(new Field("datePosted", jobPostedDateTime, Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.Add(new Field("company", job.HiringCoName.Trim(), Field.Store.YES, Field.Index.TOKENIZED));
doc.Add(new Field("jobType", job.JobTypeID.ToString(), Field.Store.NO, Field.Index.UN_TOKENIZED,Field.TermVector.YES));
doc.Add(new Field("sector", job.SectorID.ToString(), Field.Store.NO, Field.Index.UN_TOKENIZED, Field.TermVector.YES));
doc.Add(new Field("showAllJobs", "yy", Field.Store.NO, Field.Index.UN_TOKENIZED));
非常感谢您的阅读!非常感谢您对此的帮助。
贾尼斯