【问题标题】:Improving performance of Location based search using Lucene使用 Lucene 提高基于位置的搜索的性能
【发布时间】:2009-06-23 06:19:41
【问题描述】:

我正在使用 Lucene 作为一个使用 .net 的求职门户。 在以下用例中,我面临一些与性能相关的问题。 用例是: 在进行求职时,用户可以选择工作地点(例如:亚特兰大,GA)并选择径向距离(例如 50 英里)。从 Lucene 返回求职结果所需的时间相当长。

仅供参考,我们正在维护一个 sql server 2005 数据库,我们在其中存储美国和加拿大的城市、州、经度和纬度。(总共包含大约 100 万条记录)。

有没有我可以提高这个基于位置的求职的性能?

【问题讨论】:

  • 您能否详细说明您是如何使用 Lucene 对您的数据库进行基于位置的搜索?例如,当用户搜索“亚特兰大,乔治亚州”时,Lucene 如何知道其 50 英里范围内有哪些城市?是不是一定要先查询数据库?
  • 感谢您的 cmets。我们有一个基于 .Net 的距离 API,它将位置作为输入并返回给定半径内最近的城市。然后将此集合提供给 Lucene 用于搜索工作。
  • 那么您是否在 Lucene 索引中搜索字符串“Atlanta, GA”?你在索引什么?您是否将“亚特兰大,乔治亚州”作为一个术语进行索引,还是将其拆分为多个标记?
  • 我在 Lucene 索引中的一个名为“city”的字段中索引 Atlanta,在“state”中索引 GA。
  • 你的 Lucene 索引有多大?只是索引美国和加拿大的每个城市和州。将是一个非常小的索引,应该快如闪电。您使用什么类型的查询来查找正确的城市?

标签: lucene lucene.net


【解决方案1】:

基本上,您有两种类型的搜索参数:文本和空间。 您可能可以使用一种类型来过滤从另一种类型获得的结果。 例如,对于在佐治亚州亚特兰大附近寻找 .NET 开发人员工作的人来说 您可以先检索所有 .NET 开发人员工作并筛选位置, 或检索亚特兰大周围的所有工作并筛选出 .NET 开发人员的工作。 我相信第一个应该更快。 您还可以将工作地点直接存储在 Lucene 中,并将它们合并到搜索中。 一个粗略的草案是: 索引: 1. 当您收到新的“通缉”广告时,使用数据库查找其地理位置。 2. 将位置作为 Lucene 字段存储在广告文档中。 恢复: 1. 根据文本匹配检索所有作业。 2. 使用几何计算来查找用户位置和工作位置之间的距离。 3. 根据距离过滤职位。

Lucene in Action 有一个类似的空间搜索示例。 A second edition 正在制作中。另外,请查看Sujit Pal's suggestions for spatial search with LucenePatrick O'Leary's framework。还有LocalluceneLocalSolr,不知道成熟到什么程度。

【讨论】:

    【解决方案2】:

    我的索引大小约为 4 MB。我使用以下代码构建最近城市的查询:

    foreach (string city in htNearestCities.Keys)
                    {
                        cityStateQuery = new BooleanQuery();
                        queryCity = queryParserCity.Parse("\"" + city + "\"");
                        queryState = queryParserState.Parse("\"" + ((string[])htNearestCities[city])[1] + "\"");
                        cityStateQuery.Add(queryCity, BooleanClause.Occur.MUST); 
                        cityStateQuery.Add(queryState, BooleanClause.Occur.MUST);
    
                        findLocationQuery.Add(cityStateQuery, BooleanClause.Occur.SHOULD);
                        }
    

    【讨论】:

    • 4MB?对于这么小的数据集,Lucene 有点矫枉过正。
    【解决方案3】:

    您可能最终希望 lucene 通过索引tiles 来处理空间搜索。但是,如果您确定 lucene 查询很慢,而不是查找城市,那么首先将州和城市一起索引。很像在关系数据库中为多个列建立索引:一个 'state:city' 字段,其值类似于 'GA:Atlanta'。然后在查询时没有完成交集。

    【讨论】:

      猜你喜欢
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 2011-01-03
      • 2010-12-29
      • 1970-01-01
      • 2018-12-10
      相关资源
      最近更新 更多