2012-06-01 16 views
1

我正在做一個搜索引擎在java(eclipse)中的實現 我有一個名爲tbl_index的表,我在那裏保存了所有關鍵字,並保存了一個名爲keyWord的列,列url中的URL。需要關於我自己的搜索引擎的基本sql查詢的幫助實現

現在,如果一個搜索詞包含多個單詞,我將如何編寫一個查詢來查找包含所有單詞的所有網址。

表信息:

列1:keyWord (nvarchar(50))

列2:url (varchar(800))

這兩個是合表的主鍵。 請建議一種方法,我不必改變我的talbe結構。 雖然指出我當前模式中的任何錯誤會很有幫助。

也請建議一些很好的索引技術,以索引我從網站的html(keyWord列)獲得的關鍵字。

+0

也許逆向索引可能有幫助..這是我做了什麼,當我把一個內部的搜索引擎。 http://en.wikipedia.org/wiki/Reverse_index – GDF

+2

爲什麼不只是全文?這只是爲了咯咯笑嗎? –

+0

@JeremyHolovacs全文顯示是什麼意思?我有幾十段對每個網址,我分成單詞,然後插入數據庫 –

回答

0

這將基本上是2個步驟的過程。

A.首先打破你的搜索項單獨的詞是這樣的:

String[] words = searchTerm.split("\\W+"); 

B.然後構建查詢通過遍歷數組的話,創造這樣的查詢:

Select url from tbl_index where keyword in ('word1', 'word2', 'word3'); 

這裏word1,word2,word3基本上是words[0], words[1], words[2]

PS:你可能不想去精確匹配 keyw在這種情況下,我建議在MySQL查詢中使用rlike子句來獲得正則表達式的能力。

+0

我認爲這個查詢將返回具有任何指定關鍵字的url,而不是所有這些關鍵字 – MiMo

+0

@Mimo:True,但是當他寫道:「我將如何編寫一個查詢來查找所有URL其中有所有的單詞。「或者可能是我誤解了:) – anubhava

+1

'....所有單詞',而不是'...任何單詞' - 例如如果'url1'上的網頁只包含'word1'而不包含'word2',那麼您的查詢將返回它,我不認爲這是被問到的內容。 – MiMo

1

試試這個:

select distinct 
    url 
from 
    tbl_index a 
where 
    (select count(*) from tbl_index b where a.url=b.url and b.keyword in ('word 1', 'word 2' . . .)) = n 

其中n是關鍵字您正在尋找「字2」號和「字1」等是關鍵詞。

我建議你創建三個表格:每個唯一的URL一行,一個數字ID和URL名稱,第二個表格每個唯一關鍵字一行,數字ID和關鍵字,然後一個交叉參考表與所有的一對網址id - 關鍵字id:

create table urls (
    url_id int identity, 
    url varchar(800), 
    primary key (url_id) 
) 

create table keywords (
    keyword_id int identity, 
    keyword nvarchar(50), 
    primary key (keyword_id) 
) 

create table urlkeys (
    url_id int, 
    keyword_id int, 
    primary key (url_id, keyword_id) 
) 

這樣你應該減少數據的大小。上面的查詢變得像這樣:

select 
    url 
from 
    urls 
where (select count(*) from urlkeys join keywords on urlkeys.keyword_id=keywords.keyword_id where urlkeys.url_id=urls.url_id and keywords.keyword in ('word 1', 'word 2' . . .)) = n 

這將是一個好主意,對keyword

附:索引這是一個簡單的SQL解決方案的大綱,但正如不同的人已經在評論中指出的那樣,這是一個使用全文搜索解決方案最好解決的問題。只要你嘗試做詞幹,鄰近搜索,部分單詞搜索,通配符等等,任何基於SQL的解決方案都會失敗。

+0

爲簡單起見,我沒有提及其他兩個表格。我有你的地方。區別只在於使用'url'作爲主鍵,因爲它也充當表tbl_index中的外鍵。與「關鍵字」相同。和你一樣,它們都是'tbl_index'的主鍵。 –