摘要:本文主要針對(duì)目前網(wǎng)站上常用的查詢系統(tǒng)所存在的某些常見問題而提出了一種新的查詢?cè)O(shè)計(jì)思路,這種新的設(shè)計(jì)思路主要是在客戶端利用JavaScript腳本語言對(duì)用戶設(shè)置的查詢條件進(jìn)行預(yù)處理,讓用戶設(shè)置的條件以兩種形式出現(xiàn)在系統(tǒng)中,一種形式方便方便用戶閱讀和理解,另一種形式用于真正的數(shù)據(jù)查詢;此外,通過腳本語言將用戶設(shè)置的查詢條件保存于頁(yè)面上列表中,用戶可以隨意組合現(xiàn)有的條件形成更為復(fù)雜的查詢條件;同時(shí)用戶也可以在列表中隨意選擇某個(gè)條件執(zhí)行數(shù)據(jù)查詢。
關(guān)鍵詞:復(fù)合查詢;人性化;查詢條件;組合
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)14-20787-02
1 引言
當(dāng)前網(wǎng)頁(yè)上的數(shù)據(jù)檢索已經(jīng)成為一個(gè)網(wǎng)站必備的功能了,我想每個(gè)上過網(wǎng)的人都有過搜索數(shù)據(jù)的經(jīng)歷,都希望能通過一個(gè)很好的搜索工具盡快盡可能準(zhǔn)確地搜索到自己想要的數(shù)據(jù)。目前網(wǎng)頁(yè)上的搜索工具主要是通過提供幾個(gè)文本框或者幾個(gè)下拉列表,讓用戶在文本框填寫或者在列表中選擇需要尋找的關(guān)鍵字,然后系統(tǒng)就按照輸入的幾個(gè)條件進(jìn)行模糊或精確的查找,我們知道這些查找條件之間大部分都是與的關(guān)系,而且當(dāng)查詢條件設(shè)置很多的時(shí)候,用戶都不知道最終按照哪種條件來查詢的,就連世界知名的搜索引擎GOOGLE都有類似的問題。
但是在實(shí)際工作和生活中,我們所需要的查詢條件可能是各種各樣的,可能會(huì)有很多條件進(jìn)行多種不同組合,條件之間可能是與的關(guān)系,也可能是或地關(guān)系,也可能是非的關(guān)系,甚至可能是先或后與、先與后或、先非后與等等。而且很多用戶來說要在某個(gè)網(wǎng)站進(jìn)行多次查詢,每次查詢的條件相似但又不是完全相同,每次查詢用戶都需要重新設(shè)置條件,填寫關(guān)鍵字,非常不方便。但更重要的是,當(dāng)查詢次數(shù)多了以后,用戶自己都不知道本次查詢結(jié)果是按照哪種查詢條件檢索出來的。這些就是目前網(wǎng)站中數(shù)據(jù)檢索功能存在的一些顯著問題,本文將就這些問題展開討論,從客戶端入手,尋找一種新方法、新思路來實(shí)現(xiàn)更加方便、更加人性化的數(shù)據(jù)檢索。
2 復(fù)合查詢所完成的功能及實(shí)現(xiàn)思路
本文所提出的復(fù)合查詢主要是從客戶端入手,通過改善查詢界面、查詢條件的形成來提高網(wǎng)站查詢的實(shí)用性和高效性。這種復(fù)合查詢主要通過在客戶端利用JavaScript腳本語言結(jié)合表單形成各種復(fù)雜的查詢條件,而且將用戶每次形成的條件以通俗易懂的形式保存在一個(gè)列表中,用戶可以隨意添加、刪除以及組合這些條件,然后可以從列表中隨意選取某個(gè)條件送往服務(wù)器執(zhí)行數(shù)據(jù)查詢,返回自己想要的結(jié)果。本查詢系統(tǒng)主要的特色功能在于:
(1)可以對(duì)數(shù)據(jù)記錄中的任一字段進(jìn)行檢索;
(2)可以以任意方式組合各種條件,如條件的非、條件之間的與或關(guān)系等;
(3)可以將用戶形成的條件保存起來,當(dāng)需要用到相似的條件時(shí),勿須重復(fù)去設(shè)置;
(4)條件列表中保存的查詢條件完全是人性化的、通俗易懂的。這些條件與真正用于查詢的條件采用不同的形成方式,有著不同的表現(xiàn)形式,這些條件讓用戶一看就明白這些查詢條件的涵義。如:在某條新聞內(nèi)容中模糊查找“考試”這個(gè)詞時(shí),則在條件列表中保存的條件就是:新聞內(nèi)容 相似于 “考試”。
3 形成復(fù)合查詢條件的具體實(shí)現(xiàn)
3.1 界面組成
復(fù)合查詢的主界面如圖1。
圖1中上半部分是用于形成條件的,下面的列表框是用于保存各種條件的。“查詢字段”、“查詢關(guān)系”和“查詢值”用于形成一個(gè)簡(jiǎn)單的查詢條件;其中“查詢字段”是一下拉列表,其中列出可能用于查詢的各個(gè)字段,這些字段是利用腳本從數(shù)據(jù)庫(kù)中讀取出來的,當(dāng)數(shù)據(jù)庫(kù)中數(shù)據(jù)字段發(fā)生改變時(shí),這里也將保持同步,用戶可以根據(jù)自己的需要從中選取不同的字段進(jìn)行查詢;“查詢關(guān)系”根據(jù)用戶選取不同的字段,有不同的表現(xiàn)形式,如用戶選擇日期型數(shù)據(jù),則用戶還可以進(jìn)一步選擇是按年還是按月來查詢;“查詢值”是一文本框,可以讓用戶輸入查詢關(guān)鍵字?!敖M合關(guān)系”也是一下拉列表,其中列出三種基本的邏輯關(guān)系與或非,通過這個(gè)列表可以任意組合保存在條件列表中的各條件,以形成復(fù)雜的查詢條件,而且可以進(jìn)行多次不同邏輯關(guān)系的組合。如先對(duì)兩條件進(jìn)行與關(guān)系組合形成一條件,然后可再將此條件與另一條件進(jìn)行或關(guān)系組合等等。
3.2 單查詢條件的形成
查詢條件的形成其實(shí)也很簡(jiǎn)單,根據(jù)用戶的選擇和設(shè)置,采用兩套不同的方案形成兩套條件,一套條件是用比較人性化的自然語言別寫出來的,它們都顯示在條件列表中,比較適合于普通用戶閱讀和理解;另外一套則是按照數(shù)據(jù)庫(kù)查詢語句的語法編寫的條件,用于傳送到服務(wù)器端,實(shí)現(xiàn)真正的數(shù)據(jù)查詢。本文主要是通過客戶端腳本來實(shí)現(xiàn)兩套條件的形成的,程序根據(jù)用戶選取字段類型的不同,分別進(jìn)行不同處理。
因完整代碼太長(zhǎng),此處列舉部分代碼以說明其實(shí)現(xiàn)思路,下面是當(dāng)選擇了字符串型字段時(shí)的處理程序:
case \"string\":
{if(blur_flag.checked(!blur_flag.disabled))//判斷是否選中了模糊查詢復(fù)選框
{t=txt+\"相似于'\"+vle+\"'\"; //用于形成人性化條件
v=fld+\" like '%\"+vle+\"%'\"; //用于形成真正的查詢條件}
else
{t=txt+opt+\"'\"+vle+\"'\";
v=fld+opt+\"'\"+vle+\"'\";
}break;}
如當(dāng)我們需要查找新聞內(nèi)容中包含“畢業(yè)生”時(shí),本程序可以形成兩個(gè)條件:一是新聞內(nèi)容相似于“畢業(yè)生”,此條件用于顯示在條件列表中;另一個(gè)是news_content like '%畢業(yè)生%',此條件用于真正的數(shù)據(jù)查詢。
當(dāng)選擇其它類型的字段,其處理思路是類似的,只不過對(duì)于某些具體類型的字段,可根據(jù)實(shí)際情況不同做相應(yīng)的改變和調(diào)整即可。當(dāng)查詢條件形成后,人性化條件條件到條件列表中,而真正的查詢條件以參數(shù)的形式傳送到服務(wù)器端實(shí)現(xiàn)數(shù)據(jù)查詢。如圖2是添加了若干個(gè)單查詢條件后條件列表的情況。
3.3 組合查詢條件的形成
可以任意組合查詢條件是本查詢系統(tǒng)的另外一大特色。要實(shí)現(xiàn)查詢條件的任意組合也可以通過客戶端腳本代碼來實(shí)現(xiàn),其基本思路是:首先在條件列表中選擇需要組合的兩個(gè)查詢條件,然后從組合關(guān)系下拉列表中再選取組合關(guān)系,這要就可以按照指定的組合關(guān)系去形成更為復(fù)雜的條件了,同時(shí)將形成的新條件也添加到條件列表中,從而可隨時(shí)給用戶提供查詢條件。以下是實(shí)現(xiàn)組合查詢條件的combine_condition函數(shù)代碼:
function combine_condition()
{
var rv=document.form1.combine_relation.value;//獲取當(dāng)前選定的組合關(guān)系
var rt=document.form1.combine_relation.options[document.form1.combine_relation.selectedIndex].text; //獲取當(dāng)前選定的組合關(guān)系所對(duì)應(yīng)的文本
var i,j=0,new_v,new_t,s_count=0;
var v=new Array(20);
var t=new Array(20);
for(i=0;i if(document.form1.conditions.options[i].selected) {if(document.form1.conditions.options[i].value==\"all\") { alert(\"所有記錄不能進(jìn)行任何的組合\"); return; } s_count++; t[j]=document.form1.conditions.options[i].text; v[j]=document.form1.conditions.options[i].value; j++; if(j>2) {alert(\"您所選項(xiàng)目過多!不能實(shí)現(xiàn)組合\"); return;}} if((rv==\"and\"||rv==\"or\")s_count==2) //進(jìn)行兩個(gè)查詢條件的求與和求或處理 {new_v=\"(\"+v[0]+\") \"+rv+\" (\"+v[1]+\")\"; new_t=\"(\"+t[0]+\") \"+rt+\" (\"+t[1]+\")\";} else {if(rv==\"not\") //進(jìn)行查詢條件的求非處理 {if(s_count==1) {new_v=rv+\" (\"+v[0]+\")\"; new_t=rt+\" (\"+t[0]+\")\";} else {alert(\"只能選擇一個(gè)條件進(jìn)行求非!\"); return;}} else {alert(\"請(qǐng)選擇兩個(gè)條件進(jìn)行組合!\"); return;}} document.form1.conditions.add(Option(new_t,new_v)); //將組合的新條件添加到條件列表中} 圖3是添加了幾個(gè)組合條件后的條件列表情況。 條件形成后,我們就可以隨意的選取條件列表中的任一條件執(zhí)行查詢,我們可以看到我們的查詢現(xiàn)在已變得如此方便和清晰,先前設(shè)置的查詢條件可以反復(fù)利用,不需要重復(fù)設(shè)置相同或相似的條件,大大提高了我們的工作效率。而且我們對(duì)我們的查詢條件一清二楚,只有清楚的查詢條件才能讓我們更快更準(zhǔn)確地獲取到我們想要的數(shù)據(jù)。 4 總結(jié) 至此為止,本文提出了一種網(wǎng)頁(yè)查詢系統(tǒng)設(shè)計(jì)的新思路,它提供一個(gè)讓用戶自己隨意設(shè)置查詢條件的界面,而且可以將用戶設(shè)置的條件以人性化的方式列出來,使用戶可以隨心所欲地查詢到任何自己想要的數(shù)據(jù),大大提高了查詢的智能性和準(zhǔn)確性。雖然這種查詢的功能還不是還完善,還存在一些問題和不足,但它至少提出了一種思路,彌補(bǔ)了當(dāng)前通用網(wǎng)頁(yè)查詢系統(tǒng)所存在的問題。我想通過結(jié)合常用的網(wǎng)頁(yè)查詢系統(tǒng)和本文所提出的設(shè)計(jì)思路,我們可以設(shè)計(jì)出一種更高效、更人性化的查詢系統(tǒng)了,給所有用戶提供一種更加友好方便的查詢操作界面。 參考文獻(xiàn): [1] 郭海. JavaScript語言參考手冊(cè)[M]. 清華大學(xué)出版社,2004. [2] 張景峰. ASP程序設(shè)計(jì)教程[M]. 水利水電出版社,2003. 注:本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文