题
我的工作在基于网络的工作搜索应用程序的使用分类:设.用我的网站上可以搜索工作,这是在半径100英里说"麻萨诸塞州波士顿"或任何其他位置。此外,我要给搜索结果排序"相关性"(ie。这是你返回的分类:设)按降序排列。
我使用一个第3方API取所有的城市内给予的半径的一个城市。这API返回我864城市内的100英里半径"麻萨诸塞州波士顿".
我是建筑城市/国家分类:设的查询使用下列逻辑这是我的一部分"BuildNearestCitiesQuery"的方法。这里nearestCities是hashtable返回的上述API。它包含864城市与城市的屁股密钥和StateCode作的价值。和finalQuery是一个分类:设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对象分类:设的搜索方法,以获得所有的工作内100英里半径。:
searcher.Search(finalQuery, collector);
我发现了这个BuildNearestCitiesQuery方法需要一个高达29秒钟内的平均执行这显然是不能接受任何标准的一个网站。我还发现,该发言涉及"分析"需要大量的时间来执行与其他发言。
工作一定的位置是一个动态属性的意义上说,一个城市可能有2个职位(议会议的一个特别的搜索标准),但零的工作相同的搜索标准后3天。所以,我不能使用任何"高速缓存"过来。
是否有任何办法可以优化这个逻辑?还有我的整个办法/算法,争取找到所有的工作内100英里使用的分类:设?
仅供参考,在这里是我的索引的分类:设在看起来像:
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));
由于一吨的阅读!我真的很感激你的帮助。
Janis
解决方案
不完全确定我是否完全理解您的代码,但是当涉及到地理空间搜索时,过滤器方法可能更合适。也许这个链接可以给你一些想法 - http:// sujitpal .blogspot.com / 2008/02 /空间的搜索与 - lucene.html
也许您可以将过滤器用于查询的其他部分。说实话,你的查询看起来很复杂。
- 哈迪
其他提示
除了 tempFinalQuery
未使用以及不必要的地图查找以获取状态之外,在您发布的代码中似乎没有任何太令人震惊的东西。除了格式化......
如果所有时间都在 Parse
方法中进行,那么在此处发布代码是有意义的。
我可能错过了您的问题,但您是否可以存储邮政编码的纬度和经度?如果这是一个选项,那么您可以计算两个坐标之间的距离,从而提供更直接的评分指标。
我认为最好的方法是将最近的城市决定移动到搜索过滤器中。我还会重新考虑如何进行现场设置;考虑创建一个具有city + state的术语,以便简化查询。
在这里与其他人一致认为这闻起来太多了。对城市名称进行文本搜索并不总是那么可靠。地名之间经常存在一些主观性(特别是城市中可能本身很大的区域)。
进行地理空间查询是可行的方法。不知道你的其他设置,很难建议。您可以在Fluent到NHibernate和SQL Server 2008中内置Spatial支持。然后,您可以快速有效地搜索非常。但是,您面临的挑战是如何在Lucene中实现这一目标。
你可以做一个“第一次通过”。在SQL Server中使用空间支持进行查询,然后通过Lucene运行这些结果?
进行空间查询的另一个主要好处是,您可以轻松地按距离对结果进行排序,这对您的客户来说是一种胜利。