我正在使用Lucene开发基于Web的求职应用程序。我网站上的用户可以搜索距“波士顿,马萨诸塞州”或任何其他位置100英里范围内的职位。
另外,我需要显示按“相关性”(即lucene返回的分数)降序排列的搜索结果。
我正在使用第三方API来获取城市给定半径内的所有城市。该API返回“马萨诸塞州波士顿”以内100英里半径内的864个城市。
我正在使用以下逻辑构建城市/州Lucene查询,这是我的“ BuildNearestCitiesQuery”方法的一部分。
在这里,最近的城市是上述API返回的哈希表,它包含864个城市,其城市名称为驴键,州代码为值。
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天后对于相同的搜索条件则为0个工作。因此,我不能使用任何“缓存”在这里
我有什么方法可以优化此逻辑?或者就此而言,我使用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));
非常感谢您的阅读!非常感谢您的帮助。
贾尼斯
最佳答案
不确定我是否完全了解您的代码,但是在地理空间搜索中,使用过滤器方法可能更合适。也许此链接可以给您一些想法-http://sujitpal.blogspot.com/2008/02/spatial-search-with-lucene.html
也许您也可以将过滤器用于查询的其他部分。老实说,您的查询看起来很复杂。
-哈迪
关于lucene - 需要Lucene查询优化建议,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/406161/