2009-06-23 66 views
2

我使用Lucene for一個使用.net的求職門戶。 我在下面的用例中遇到了一些與性能相關的問題。 用例爲: 在進行求職時,用戶可以選擇工作地點(例如:Atlanta,GA)並選擇徑向距離(例如50英里)。從Lucene返回求職結果所需的時間非常長。我們正在維護一個sql server 2005數據庫,我們在這裏存儲美國和加拿大的城市,州,經度和緯度(包含大約100萬條記錄)。使用Lucene提高基於位置的搜索的性能

是否有反正我可以提高這個位置的工作搜索的性能?

+0

您能詳細說明您如何使用Lucene進行與數據庫相關的基於位置的搜索嗎?例如,當用戶搜索「亞特蘭大,GA」時,Lucene如何知道哪些城市距離它不到50英里?它是否必須首先查詢數據庫? – 2009-06-23 12:55:03

+0

感謝您的評論。我們有一個基於.Net的距離API,它將位置作爲輸入並返回給定半徑內的最近的城市。然後將這個集合提供給Lucene用於搜索作業。 – user74042 2009-06-23 15:37:00

回答

3

基本上,你有兩種類型的搜索參數:文本和空間。 您可能可以使用一種類型來過濾從另一種類型獲得的結果。 例如,對於在亞特蘭大附近尋找.NET開發人員工作的人,GA 您可以先檢索所有.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,但我不知道他們有多成熟。

0

我的索引規模約爲4 MB.Am使用下面的代碼用於建設就近城市查詢:

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); 
        } 
0

你可能最終希望有Lucene的處理由索引tiles空間搜索。但是,如果您確定lucene查詢速度緩慢,而不是城市的發現,那麼先將州和城市一起編入索引。就像索引關係數據庫中的多個列一樣:「狀態:城市」字段的值爲「GA:Atlanta」。然後交叉點不在查詢時完成。