2013-04-09 42 views
1

我目前正在嘗試使用asp構建一個內部搜索引擎數據庫。我不是專家,只是簡單介紹了這種編碼風格。我遇到的麻煩是這樣的:建築搜索引擎中的多個關鍵字

(例如)我有兩個相對相同的文檔,並且有相同的關鍵字來描述它們。但是,表中的關鍵字不是以相同的順序寫入的。寫在表中的所有關鍵字都用空格分隔。

項目 1關鍵字:備件發動機
項目 2個關鍵字:備用發動機部件

現在,我有可以讓我顯示項目1和2,如果我的代碼僅輸入一(1)的那些關鍵詞

sql = "Select title, descript, url, uid FROM searchMachine WHERE keywords LIKE '%" & Replace(keywords, "'", "''") & "%' ORDER BY uid;"

但是,如果我要輸入「備用發動機」的搜索框,那麼只會顯示第2項,而不會顯示第1項。另外,如果要輸入「零件引擎」或「發動機零件」,它們都不會顯示。它似乎只參加了列出的前2個(或2個關鍵字)關鍵字。我希望完成的目標是允許用戶輸入的分組關鍵字(即,備用引擎部分),並允許其仍顯示具有任何關鍵字列出的所有相關信息,而不必擔心編寫關鍵字組或關鍵字組一遍又一遍。

我知道有一個功能在那裏進行全文搜索,但我研究過有安全漏洞的情況,所以我想避免冒這個風險。我有一種感覺,這可能與AND或OR語句更相關,但如果需要它,我不確定該放置。有沒有人有任何關於這種情況的專業知識,並願意提供幫助?

+0

爲什麼不使用現有的搜索引擎(如lucene/solr/elasticsearch)而不是自己構建並重新創建所有內容?數據庫中的全文搜索通常非常有限 – Karussell 2013-04-09 18:41:50

回答

0

因此,看看HackyStack在最近的帖子中提出的一個計數器系統是需要記錄用戶放入的單詞空格中的間隔。對於用戶製作的每個空間,重複「OR關鍵字LIKE」語句。它應該看起來像這樣:

Dim strSQL, tmpSQL 
strSQL = "SELECT title, descript, url, uid FROM searchMachine WHERE " 
tmpSQL = "(keywords LIKE "  

Dim Pos 
Pos = 1 
While Pos > 0 
    Pos = InStr(1, strSearch, " ") 
    If Pos = 0 Then 
     'We have it the end 
     tmpSQL = tmpSQL & "'%" & strSearch & "%')" 
    Else 
     tmpSQL = tmpSQL & "'%" & Mid(strSearch, 1, Pos) & "%' " & DefaultBoolean & " keywords LIKE " 
     strSearch = Mid(strSearch, Pos + 1, Len(strSearch)) 
    End If 

End While 

因此,要打破我在這裏,我們首先設置我們的SQL行的開始集。從那裏我們需要指定計數器和分隔多個關鍵字所需的條件。首先,爲Pos設置一個標記值,並給它一個int值。接下來我們創建一個InStr(設置正在搜索的項目的起始值,正在搜索的項目(在這種情況下strSearch等於txtBox的名稱/值)以及我們在該部分中檢查的內容(在此如果InStr在搜索中沒有找到空格,那麼它將作爲一個被搜索的單詞;否則,它將解析這兩個單詞並使它們分開,如下所示:

在搜索欄 「備用引擎」

例如,用戶類型
結果回來:

關鍵字LIKE '%備用%' 或關鍵字LIKE '%引擎%'

我我想感謝我的同事HackyStack和4guysfromrolla.com提供幫助。我希望我解釋我自己。

0

要做你剛纔說的很簡單,你將不得不基於在搜索詞中輸入的詞的數量動態地構建WHERE子句,所以你會有一個小小的循環來增加你的查詢字符串, 「OR」語句後的第一個輸入的每一個字,因此,如果輸入了3個字「X,Y和Z」,你會:

WHERE keywords LIKE 'X' 
OR keywords LIKE 'Y' 
OR keywords LIKE 'Z' 

你會打破你的搜索項分隔的單詞這樣做由空白,如果你有多個,附加在每個「OR」語句到您的查詢字符串...

我不得不承認t hough,那krussell是正確的,如果你要重新發明輪子,你應該有一些非常好的理由這樣做......

+0

HackyStack - 感謝您的支持信息。在做了一些更多的研究並坐下來了解一些新術語之後,我找到了你從上面建議的例子。 – user1134815 2013-04-11 14:50:59