我正在使用基于web的工作搜索应用程序,在我的网站上使用Lucene.User可以搜索距离“Boston,MA”或任何其他位置100英里范围内的作业。 此外,我需要显示按照“相关性”(即由lucene返回的分数)按降序排列的搜索结果。需要Lucene查询优化建议
我使用第三方API获取城市给定半径范围内的所有城市。此API将我带回“马萨诸塞州波士顿”100英里范围内的864个城市。
我正在使用以下逻辑构建城市/州Lucene查询,这是我的“BuildNearestCitiesQuery”方法的一部分。 这里nearestcities是由上述API返回的散列表。它包含864个城市,其中CityName驴密钥和StateCode为值。 而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的搜索方法得到100方圆:
searcher.Search(finalQuery, collector);
我发现这个BuildNearestCitiesQuery方法呈现平均高达29秒执行中的所有作业这显然是一个网站的任何标准所不能接受的。我还发现涉及“解析”的陈述与其他陈述相比需要相当多的时间来执行。
对于一个给定地点的作业是一个动态属性,意思是一个城市今天可以有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));
由于一吨阅读我会很感激你对这种帮助。
詹尼斯
请你看看这个和评论??谢谢。 http://stackoverflow.com/questions/1052086/spatialquery-for-location-based-search-using-lucene – user74042 2009-06-27 23:55:05