1.為什么需要數據庫分詞查詢
假設有一個數據庫表,表中有一個title字段
table1 假如有300萬的數據
id為主鍵,title也設置了索引
id | title |
1 | 這是計算機,和計算機相關,電腦相關 |
2 | 這個標題是數據庫,與專利數據庫有關系 |
3 | 這個標題是與淘寶user數據庫 |
... | ................................................... |
假如我們需要通過title中的某些字段去進行查詢,如果不分詞查詢,那么這樣的缺點如下
- 查詢速度上的問題,如果我們 想查詢title中 有 數據庫 的字段的所有內容
我們只能用 select * from table1 where title like '%數據庫%'
注意: like %xxx% 這樣查詢,將會是沒有索引的查詢,查詢的速度會非常的慢,40萬的數據,這樣查詢需要的時間是用 = 查詢的幾千倍
使用like'%%' 速度非常慢,在需要大量查詢的時候,性能上會出現很大的問題
2. 查詢的准確性問題,假如我們想查詢有 專利數據庫 的字段,但是,我們如果打錯了,打成了查詢 '專利的數據庫',多了一個'的'字,
查詢的sql 語句為 select * from table1 where title like '專利的數據庫'
這樣,我們是查詢不到id=2的這一條數據的
如果使用分詞查詢,上述問題將會得到解決
我們將關鍵字進行分詞,建立關鍵字與id的關系,同時建立索引
比如我們將title進行分詞,得到如下的表(注:下表我只列出id=2的分詞部分)
keywordsearch1表 id為主鍵,keyword設置索引
id
|
keyword
|
......
|
xxxxxxx
|
2
|
標題
|
2
|
數據庫
|
2
|
專利
|
2
|
關系
|
.......
|
xxxxxxxxx
|
select * from table where id in(select id from keywordsearch1 where keyword='數據庫')
或者程序中,先在分詞表中查詢出id,再用一個for循環,循環select * from table where id =xxx
這樣一來,查詢都是有索引的,速度會非常的迅速.速度問題解決了
2. 對於准確度問題,比如搜索 專利的數據庫
程序會先和分詞的方法一樣,將其分成 專利、數據庫 我們查詢的時候
就分別keywordsearch1表去查詢這兩個對應的id,取得他們的交集,然后再根據id去主表中查詢相應的數據,這樣,就保證了我們能夠得到我們想要的數據了