檢索模組的設計

2021-06-20 08:36:55 字數 1723 閱讀 6035

在導航系統中,檢索主要應用於poi的檢索和address的檢索,並且對檢索的需求定義也是變化多段,不同的區域需求也是不盡相同。如何設計乙個好的檢索的模組,使之能夠應用於各種變化的需求也是非常重要。

檢索的需求是變化最多的,即使談好的需求,到最後都會稍微的改變行為,有時改完了又要改回來,最後是2個不同的行為都需要,外面可以通過引數來選擇。所以靈活的檢索設計是非常有必要的。

乙個查詢過程,可以分成,

1,使用者輸入引數,明確乙個查詢需求

2,engine進行查詢

3,把查詢後的結果放入乙個結果集合裡面,供使用者讀取結果。

這3個過程可以對應成3個小模組,分別為: iparam, iengine,iresultset。

從最頂層來看,這3個小模組就能組合成乙個完整的 iquery,即乙個完整的查詢過程。

iparam:描述了使用者的輸入,包括查詢範圍和過濾條件。比如使用者想 「在上海市查詢以『橫』開頭的道路」, 那麼 查詢範圍就是「上海市」 和 過濾條件就是「『橫』開頭」。其中查詢範圍可以理解成乙個行政區域。我們可以按不同的行政級別來繼承出不同的iparam。 比如: countryparam表示查詢範圍乙個國家, stateparam表示查詢範圍為乙個省,cityparam表示查詢範圍為乙個市。過濾條件對不同的行政來說應該是一致,過濾條件也可以分成 字首過濾,關鍵字過濾,首字母過濾。

iengine: 執行具體的查詢工作。乙個engine應該是執行乙個具體的,明確的,單一的查詢工作,即如果從iengine繼承出乙個具體的engine,那麼這個具體的engine所能做的事情將被非常明確固定下來,切不可在需求有點改變的時候,把當前engien的邏輯改變。正確的做法是保留原來的engien邏輯不變,從iengine重新繼承乙個新的具體engine來完成新的查詢功能。比如,查詢city,可以繼承出乙個cityengine,查詢street,可以繼承出乙個streetengine。

設計還沒有結束。對於cityengien,本身就是個不明確的定義。我們有很多種city查詢功能。比如在乙個國家下查詢city,在乙個省下面查city,按字首輸入來查詢city還是按照關鍵字模式來查詢city。任意一種組合查詢都可以再繼承出乙個明確的engien子類。我們根據不同param來建立乙個具體的engien子類,每乙個具體的engien子類將完成單一明確的查詢功能。

iresultset:儲存所有的查詢結果。當乙個engien開始執行的時候,查詢結果將會一條一條得到,這時候我們就可以把得到的結果一條一條插入iresultset。按需求來說,一條結果分成很多種,比如查city的結果為city,查poi的結果就是乙個個poi。我們讓所有的結果都繼承自iresult。從iresult可以繼承出各種具體的result記錄,比如cityresult,表示乙個city,streetresult表示一條street,poiresult表示乙個poi。每乙個具體的engien所產生的結果是乙個具體的result,但是我們需要把具體的result轉換成起父類-無差別的iresult結果,從而把乙個個iresult插入到iresultset中。

iquery:對應著乙個回合查詢。對於查詢而已,engien已經表達了乙個具體的查詢,但是實際上我們希望進行乙個根據模糊的查詢,比如我得到乙個名字,我也不知道是city名還是street名,我希望同時在city和street中查詢。或者我要查的street名,可能是「中」開頭,也可能是「西」開頭。這時候,乙個使用者的發起了乙個query,這個query包含了多個具體的iengien,這些多個iengine之間有可能是and的關係,有可能是 or 的關係。所以,從iquery下繼承出 andquery,orquery等等。

專案設計演算法檢索

1 基於機器學習的特徵提取方法,包括 五種線性方法 主成分分析 principalcomponent analysis,pca 近鄰保持投影 neighborhoodpreserving projection,npp 區域性保持投影 localpreserving projection,lpp 區域...

工作思考 幾個檢索條件的設計

這個問題一度也非常棘手,不過經過數天的討論,我還是通過集合的技巧將其拆解為幾個簡單條件的運算。首先,為定向生成三個檢索條件 t ins 定向安裝 t unins 定向未安裝 t rest 為定向 檢索條件只能獲取使用者的安裝列表l 然後,定向安裝的廣告 t ins a l1 a l2 a ln 定向...

演算法分析與設計 檢索演算法

在乙個排好序的陣列t 1 n 中查詢x,如果x在t中,輸出x在t的下標j 如果x不在t中,輸出j 0.樸素演算法 遍歷陣列t中的每乙個元素,當查詢到x時,停止查詢,輸出下標。二分查詢 因為當前的陣列t是排好序的,所以直接可以進行二分查詢,設定兩個變數,l,r l t 1 r t n 每次取mid l...