我想執行一個sql搜索,並希望獲得最佳結果。我嘗試了一些東西,但他們工作不正常。我有兩列名爲主題和內容SQL搜索兩列以獲得最佳結果
例如,我們將在主題和內容區域搜索「搜索此關鍵字」文本。首先,我正在搜索「搜索關鍵字」,然後搜索「搜索」和「本」和「關鍵字」
我想檢索主題的結果頂部,我想檢索最佳結果喜歡「搜索關鍵字」 。我的查詢有時候不會有效。
我應該怎麼寫這個查詢
謝謝..
我想執行一個sql搜索,並希望獲得最佳結果。我嘗試了一些東西,但他們工作不正常。我有兩列名爲主題和內容SQL搜索兩列以獲得最佳結果
例如,我們將在主題和內容區域搜索「搜索此關鍵字」文本。首先,我正在搜索「搜索關鍵字」,然後搜索「搜索」和「本」和「關鍵字」
我想檢索主題的結果頂部,我想檢索最佳結果喜歡「搜索關鍵字」 。我的查詢有時候不會有效。
我應該怎麼寫這個查詢
謝謝..
我覺得你說,你要對你的數據庫執行多個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,
這似乎解決了我的問題,但沒有使用substr()。但是這種方法公佈同一行。我可以如何刪除dublicates。我有這樣的主鍵列{ID INT PRIMARY KEY IDENTITY} – user348357 2010-05-24 23:13:33
奇怪 - UNION運算符應該返回一個唯一集合(UNION ALL允許重複)。 想要在整個批次中使用DISTINCT - 即SELECT DISTINCT * FROM([all of the above])按重量排序DECC – blissapp 2010-05-25 08:33:44
可能因爲重量欄而變成dublicates。 我試過不同的,但我收到此錯誤消息 「除非指定TOP或FOR XML,否則ORDER BY子句在視圖,內聯函數,派生表,子查詢和公用表表達式中無效。 – user348357 2010-05-25 10:58:50
試試這個
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
實現一個簡單的 '全文搜索' 像表將是一個辦法。用空格,逗號,等進言
分割主題和內容列:
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個。
我希望這給你和想法,所以你決定什麼最適合你。
什麼RDBMS?它可能有全文搜索功能。 – 2010-05-23 16:52:49
您正在尋找全文搜索(FTS)功能。現在大多數數據庫都包含這個功能,但是您可以從Sphinx這樣的產品獲得第三方功能:http://sphinxsearch.com/docs/current.html – 2010-05-23 17:19:25