我正在使用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/

10-13 09:09