原文表:
create table TXT
( ID varchar(16) not null,
Txt text,
primary key (ID)
)
insert TXT (ID, Txt) values ('ID1', '中国开发网')
insert TXT (ID, Txt) values ('ID2', '中央国发局')
索引表:
create table IDX
( Word varchar(16) not null,
ID varchar(16) not null,
primary key (Word, ID),
constraint FK_IDX_ID foreign key (ID) references TXT(ID)
)
create index IDX_ID on IDX (ID)
------------------------------------------------------------------------------
方案一:先按字索引,然后再模糊匹配原文
insert IDX (Word, ID) values ('中', 'ID1')
insert IDX (Word, ID) values ('国', 'ID1')
insert IDX (Word, ID) values ('开', 'ID1')
insert IDX (Word, ID) values ('发', 'ID1')
insert IDX (Word, ID) values ('网', 'ID1')
insert IDX (Word, ID) values ('中', 'ID2')
insert IDX (Word, ID) values ('央', 'ID2')
insert IDX (Word, ID) values ('国', 'ID2')
insert IDX (Word, ID) values ('发', 'ID2')
insert IDX (Word, ID) values ('局', 'ID2')
select TXT.*
from TXT join IDX on TXT.ID=IDX.ID
where Word in ('中', '国', '开', '发', '网')
and Txt like '%中国开发网%'
结果:
ID1 中国开发网
ID1 中国开发网
ID1 中国开发网
ID1 中国开发网
ID1 中国开发网
(所影响的行数为 5 行)
执行计划:
------------------------------------------------------------------------------
方案二:从后往前组合,用like 'XXX%'
insert IDX (Word, ID) values ('中国开发网', 'ID1')
insert IDX (Word, ID) values ('国开发网', 'ID1')
insert IDX (Word, ID) values ('开发网', 'ID1')
insert IDX (Word, ID) values ('发网', 'ID1')
insert IDX (Word, ID) values ('网', 'ID1')
insert IDX (Word, ID) values ('中央国发局', 'ID2')
insert IDX (Word, ID) values ('央国发局', 'ID2')
insert IDX (Word, ID) values ('国发局', 'ID2')
insert IDX (Word, ID) values ('发局', 'ID2')
insert IDX (Word, ID) values ('局', 'ID2')
select TXT.*
from IDX join TXT on IDX.ID=TXT.ID
where Word like '中国开发网%'
结果:
ID1 中国开发网
(所影响的行数为 1 行)
执行计划:
------------------------------------------------------------------------------
方案三:全组合,用 = 'XXX'
insert IDX (Word, ID) values ('中国开发网', 'ID1')
insert IDX (Word, ID) values ('中国开发', 'ID1')
insert IDX (Word, ID) values ('中国开', 'ID1')
insert IDX (Word, ID) values ('中国', 'ID1')
insert IDX (Word, ID) values ('中', 'ID1')
insert IDX (Word, ID) values ('国开发网', 'ID1')
insert IDX (Word, ID) values ('国开发', 'ID1')
insert IDX (Word, ID) values ('国开', 'ID1')
insert IDX (Word, ID) values ('国', 'ID1')
insert IDX (Word, ID) values ('开发网', 'ID1')
insert IDX (Word, ID) values ('开发', 'ID1')
insert IDX (Word, ID) values ('开', 'ID1')
insert IDX (Word, ID) values ('发网', 'ID1')
insert IDX (Word, ID) values ('发', 'ID1')
insert IDX (Word, ID) values ('网', 'ID1')
insert IDX (Word, ID) values ('中央国发局', 'ID2')
insert IDX (Word, ID) values ('中央国发', 'ID2')
insert IDX (Word, ID) values ('中央国', 'ID2')
insert IDX (Word, ID) values ('中央', 'ID2')
insert IDX (Word, ID) values ('中', 'ID2')
insert IDX (Word, ID) values ('央国发局', 'ID2')
insert IDX (Word, ID) values ('央国发', 'ID2')
insert IDX (Word, ID) values ('央国', 'ID2')
insert IDX (Word, ID) values ('央', 'ID2')
insert IDX (Word, ID) values ('国发局', 'ID2')
insert IDX (Word, ID) values ('国发', 'ID2')
insert IDX (Word, ID) values ('国', 'ID2')
insert IDX (Word, ID) values ('发局', 'ID2')
insert IDX (Word, ID) values ('发', 'ID2')
insert IDX (Word, ID) values ('局', 'ID2')
select TXT.*
from IDX join TXT on IDX.ID=TXT.ID
where Word = '中国开发网'
结果:
ID1 中国开发网
(所影响的行数为 1 行)
执行计划:
李战(leadzen)