我的工作在基于网络的工作搜索应用程序的使用分类:设.用我的网站上可以搜索工作,这是在半径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的术语,以便简化查询。

我建议:

  • 储存的纬度和经度的地点,因为他们进来
  • 当用户进入市和距离,变成一个纬度/经度的价值和程度
  • 做一个单一的、简单的查询依据的数值距离纬度/经度的比较

你可以看到一例这是怎么运作的 地理:距离 Perl模块。看看 closest 方法在 来源, 实现这一查找通过简单的SQL。

在这里与其他人一致认为这闻起来太多了。对城市名称进行文本搜索并不总是那么可靠。地名之间经常存在一些主观性(特别是城市中可能本身很大的区域)。

进行地理空间查询是可行的方法。不知道你的其他设置,很难建议。您可以在Fluent到NHibernate和SQL Server 2008中内置Spatial支持。然后,您可以快速有效地搜索非常。但是,您面临的挑战是如何在Lucene中实现这一目标。

你可以做一个“第一次通过”。在SQL Server中使用空间支持进行查询,然后通过Lucene运行这些结果?

进行空间查询的另一个主要好处是,您可以轻松地按距离对结果进行排序,这对您的客户来说是一种胜利。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top