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