2008-12-30 104 views
0

我正在使用Lucene.net(版本2.0.0.4)進行商店搜索的Web應用程序。 雖然我的網絡應用程序用戶可以搜索位於距離給定位置50英里內的美國商店。 我使用第三方API來查找半徑內的所有城市。對於一個城市來說,新澤西州的愛迪生,它給了我40英里範圍內450個城市(API返回包含450個城市的.NET哈希表)。 通過迭代這個散列表,我使用BooleanQuery/Query類來構建lucene查詢。優化搜索查詢

在這種情況下,我發現通過lucene構建,執行和返回搜索結果花費了大量的時間。 有沒有什麼辦法可以優化這段代碼?

謝謝!

+0

製作一個計算器帳戶,以便您可以對答案進行投票並將其標記爲已接受。這是一個社區,那些堅持爲他人提供幫助的人往往會獲得更多的幫助。 – erickson 2008-12-30 19:18:54

回答

0

我認爲這次演出的關鍵在於考慮如何存儲數據以及如何存儲數據。

這是什麼意思?

例如,有一個在新澤西州有商店的城市列表,並根據您的主列表過濾掉從您的第三方API返回的城市。你可能會發現你在返回的450箇中只有5個匹配。同樣,我不會在一個查詢中結合450個查詢 - 嘗試並將它們組合成更小的數量。另外,如果您可以根據狀態創建索引,那麼您可能會發現較小的索引(特別是NJ)會比在較大索引中選擇特定狀態的數據更有效地處理查詢。

希望這有助於 夏蘭

1

當你建立你的索引,映射城市緯度和經度座標。在網頁應用中,當您進行半徑搜索時,將搜索到的城市映射到座標並進行範圍查詢(您需要將距離轉換爲座標所在的單位)。

這是不完善的,因爲您將搜索一個正方形而不是圓,但是如果您需要精確,可以編寫一些代碼來過濾原始半徑之外的結果。

0

KenE's answer是一個很好的,你應該谷歌"lucene spatial search"有關該方法的更多信息。

還有另外一種方法,假設半徑總是40英里:只是逆轉過程。

有一個名爲nearyby_city的字段。對於索引中的每個商店,請添加半徑40英里的城市列表。現在,當您在新澤西州愛迪生附近搜索商店時,只需在查詢中添加nearby_city:"Edison, NJ"條款。現在只有該城市40英里以內的商店才符合您的查詢要求。