2010-05-23 54 views
1

我想執行一個sql搜索,並希望獲得最佳結果。我嘗試了一些東西,但他們工作不正常。我有兩列名爲主題和內容SQL搜索兩列以獲得最佳結果

例如,我們將在主題和內容區域搜索「搜索此關鍵字」文本。首先,我正在搜索「搜索關鍵字」,然後搜索「搜索」和「本」和「關鍵字」

我想檢索主題的結果頂部,我想檢索最佳結果喜歡「搜索關鍵字」 。我的查詢有時候不會有效。

我應該怎麼寫這個查詢

謝謝..

+1

什麼RDBMS?它可能有全文搜索功能。 – 2010-05-23 16:52:49

+0

您正在尋找全文搜索(FTS)功能。現在大多數數據庫都包含這個功能,但是您可以從Sphinx這樣的產品獲得第三方功能:http://sphinxsearch.com/docs/current.html – 2010-05-23 17:19:25

回答

1

我覺得你說,你要對你的數據庫執行多個SQL查詢,然後合併結果,並樹立了「權重」來內容匹配的主題匹配。

select messageid, textstring, max(weight) from (
-- exact subject match 
select messageid, substr(subject,1,100) textstring, 100 weight 
from mytable 
    where subject='search this keywords' 
union 
-- partial subject match 
select messageid, substr(subject,1,100), 90 weight 
from mytable 
    where subject like '%search this keywords%' 
union 
select messageid, substr(subject,1,100), 80 weight 
from mytable 
    where subject like '%search%' 
union 
select messageid, substr(subject,1,100), 80 weight 
from mytable 
    where subject like '%this%' 
union 
select messageid, substr(subject,1,100), 80 weight 
from mytable 
    where subject like '%keywords%'  
union 
-- partial content match 
select messageid, substr(content,1,100), 70 weight 
from mytable 
    where content like '%search this keywords%' 
union 
select messageid, substr(content,1,100), 60 weight 
from mytable 
    where content like '%search%' 
union 
select messageid, substr(content,1,100), 60 weight 
from mytable 
    where content like '%this%' 
union 
select messageid, substr(content,1,100), 60 weight 
from mytable 
    where content like '%keywords%'  
) 
group by 
    messageid, textstring, 
+0

這似乎解決了我的問題,但沒有使用substr()。但是這種方法公佈同一行。我可以如何刪除dublicates。我有這樣的主鍵列{ID INT PRIMARY KEY IDENTITY} – user348357 2010-05-24 23:13:33

+0

奇怪 - UNION運算符應該返回一個唯一集合(UNION ALL允許重複)。 想要在整個批次中使用DISTINCT - 即SELECT DISTINCT * FROM([all of the above])按重量排序DECC – blissapp 2010-05-25 08:33:44

+0

可能因爲重量欄而變成dublicates。 我試過不同的,但我收到此錯誤消息 「除非指定TOP或FOR XML,否則ORDER BY子句在視圖,內聯函數,派生表,子查詢和公用表表達式中無效。 – user348357 2010-05-25 10:58:50

0

試試這個

select * from (
Select sch, rank, 
case when sch like '%search this keywords%' then 0 
when sch like '%search%' then 1 
when sch like '%this%' then 2 
when sch like '%keywords%' then 3 end ord 
from 
(
select subject as sch, 1 as rank from mytable 
union all 
select content, 2 as rank from mytable 
) as x 
) as y 
where ord is not null 
order by rank, ord 
0

實現一個簡單的 '全文搜索' 像表將是一個辦法。用空格,逗號,等進言
分割主題和內容列:

CREATE TABLE YourTable (id int, subject varchar(256), content varchar(8000)) 

CREATE TABLE Keywords (key_id int, keyw varchar(50), relevanceModifier float) 
CREATE TABLE SubjectsKeywords (key_fk int, yourTable_fk int, quantity int) 
CREATE TABLE ContentKeywords (key_fk int, yourTable_fk int, quantity int) 

當您在YourTable插入,火觸發。
可選地,避免「停止詞」,如「他們」,「他們」,「到」等,這稱爲詞幹,如果我沒有弄錯。
每個單詞都應該插入表中的SubjectsKeywords,ContentKeywords和Keywords。
(可選)設置relevanceModifier。一個非常簡單的標準是使用字符串長度。
(可選)對每個出現進行計數並跟蹤其數量字段。

然後將查詢會是這樣的:

select max(t.relevance), yourtable.id, MAX([subject]), MAX(content) 
from 
(
    /* exact match and 'contains' match */ 
    select 100 as relevance, id 
    from YourTable 
    where [subject] like '%search this keywords%' 
    UNION 
    /* keyword match */ 
    select 70 as relevance, yt.id 
    from YourTable as yt 
    join SubjectsKeywords on id = yourTable_fk 
    join Keywords as k on k.id = key_fk 
    where keyw in ('search', 'this', 'keywords') 
    UNION 
    select 40 as relevance, id 
    from YourTable 
    where [subject] like '%search this keywords%' 
    UNION 
    select 10 as relevance, yt.id 
    from YourTable as yt 
    join ContentKeywords on yt.id = yourTable_fk 
    join Keywords as k on k.id = key_fk 
    where keyw in ('search', 'this', 'keywords') 
) as T 
join yourtable on t.id = yourtable.id 
group by t.id 
order by max(relevance) desc 
, yourtable.id ASC /*So that the result will always be in the same order*/ 

注:
觸發器是一個辦法做到這一點,如果你有你的應用程序的小控件或如果它是一個維護的噩夢。
之後,您可以通過添加soundex來改進它,這樣,您甚至可以搜索拼錯的關鍵字。
RelevanceModifier,Quantity字段可用於計算更多相關結果。
因爲它可能足夠快,所以它可能對你的應用程序來說是有用的自動完成功能,在這種情況下,你想限制結果最多可以說256個。

我希望這給你和想法,所以你決定什麼最適合你。