搜尋那些事兒(四) 單業務搜尋是如何實現的

2021-09-04 11:40:34 字數 2088 閱讀 4917

《你了解搜尋的種類嗎》一文中,我們著重介紹了不同種類的搜尋,以及他們的展現方式。在本文中,我們將逐層深入,討論幾種不同型別的搜尋的實現方式。此外,本文在討論搜尋的實現時,借用《從物件導向的角度談搜尋》中的詞彙,如果讀者不熟悉,請猛擊此處進行檢視。

一、快速搜尋

大家都知道,當我們進行快速搜尋時,通常是對已定義好的幾個物件的屬性進行搜尋。因為各種條件都已事先定義好,所以構建搜尋的語句就變的相對簡單,我們用一行普通的sql語句就可搞定:

select t from

table t where t.propertya like

'%searchkey%'

or t.propertyb like

'%searchkey%'

or ... 

在這種業務極其簡單,搜尋範圍特別侷限的情況,我們根本不必考慮可擴充套件性,只要搜尋效率夠高、搜尋速度夠快就好。

二、普通搜尋

儘管在介面展示上,普通搜尋比快速搜尋展示的內容多很多,但是在sql的眼裡,普通搜尋和快速搜尋沒有什麼區別,它只不過是搜尋的or條件換成了and

select t from

table t where t.propertya like

'%searchkey1%'

and t.propertyb like

'%searchkey2%'

and ... 

儘管如此,它還是增大了我們實現的複雜度。因為我們要根據表單上是否有值,來判定是否對這些屬性進行搜尋。通常有這麼兩種實現方式,來組建我們進行搜尋的wherecondition

方法一:

public

static list commonsearch1(string key1,string key2,string key3) 

if(!"".equal(key2)) 

if(!"".equal(key3)) 

... } 

方法二:

public

static list commonsearch2(map map) 

if(map.containskey(key2) && !"".equal(map.get(key2))) 

if(map.containskey(key3) && !"".equal(map.get(key3))) 

... 

}    

上述這兩種方式,方法一對於引數較少的情況下易用性更好些,而方法二則針對於引數較多的情況下。讀者可以根據自己的情況,選擇適合自己的方式。

另外,不知道讀者有沒有注意到,快速搜尋其實是普通搜尋的特例。如果寫了乙個普通搜尋,那麼快速搜尋完全可以重用普通搜尋,來構建快速搜尋。

三、高階搜尋

對於那些簡單的高階搜尋,比如說所有動態新增的條件都是並關係或者或關係,那麼我們就可以使用上面描述的方法二來實現高階搜尋。但是客戶的需求往往並不止步於此,他們希望能夠按照自己的喜好定義這些搜尋條件是取交集還是並集。通過對比發現,每次的搜尋的範圍由原來的key與value,又增加了關係操作符operatetype。

通常情況下,高階搜尋是這麼實現的。

public

class advancedsearchtemplate 

public

static list advancedsearch(advancedsearchtemplate advancedsearchtemplates) 

四、特定搜尋

特定搜尋是基於某個特定業務而實現的搜尋,由於介面上沒有任何可選的條件,其實現由後台**一呵而成。從特定搜尋所搜尋的範圍與條件來說,特定搜尋是普通搜尋的一種實現與擴充套件。讀者直接參照普通搜尋的實現方式完成特定搜尋即可。

以上所講的搜尋,都是經常見且經常用的搜尋,所以本文沒有對其做過多的介紹。除了上面所講的四類搜尋之外,還有二次搜尋、全文搜尋和導航搜尋等搜尋方式。由於這些搜尋不常見性,我將會在接下來的文章中對這幾種搜尋做詳細介紹,希望能夠讓讀者能夠全面了解搜尋。

記憶體管理那些事兒 指標引數是如何傳遞記憶體的

01.如果函式的引數是乙個指標,不要指望用該指標去申請動態記憶體void getmemory char p int main 執行上面的 則會出錯。編譯器總是要為函式的每個引數製作臨時副本,指標 引數p 的副本是 p,編譯器使 p p。如果函式體內的程式修改了 p 的內容,就導致引數p 的內容作相應...

搜尋引擎是如何工作的

當我們在搜尋引擎上鍵入片語進行搜尋時可能並沒有想過,它是如何把我們想要的資料在那麼短的時間內找出來。事實上幾乎所有的搜尋引擎都會有下列的功能以保證它能夠又好又快的為我們提供資料。1,爬行整個web crawling web 搜尋引擎自動執行的程式通過web的超級鏈結 hyperlink 結構爬行整個...

做「全民公敵」是發展趨勢 正在嘗試搜尋業務

主持人 你之前提到中國的每個網際網路公司都在想辦法做全業務,但最近發生了乙個備受業界關注的事件 雅虎,作為美國最大的門戶 也是什麼業務都有,現在仍沒逃脫落後或者被併購的命運,這件事給你什麼啟示?馬化騰 在美國,sns是最火的,最典型的代表是facebook,我感覺它的思想很有衝擊力。我們在南韓考察的...