zoukankan      html  css  js  c++  java
  • sqlserver,mysql,oracle通用的模拟和改进的全文搜索算法

    问:数据库效率最低的地方是什么?

    答:表扫描

    问:表扫描常见的情况是

    答:like '%a%' 这类查询

    如果使用全文检索引擎,又无法满足我们的需求的时候怎么办,比如要从

    一个商品名称 "农夫山泉300ml"  里面查找"泉3" ,全文搜索引擎就失效了。

    我们可以改进为:

    1.建立一个 索引表,这个表里面str允许保存若干字符,作为非聚集索引

    create table t1 (id1 identity(1,1) primary key ,  str varchar(10), goods_id integer);

    在str上建立非聚集索引

    2.当我们保存新的商品信息的时候

    将 "农夫山泉300ml" 拆分成

    goods_id=1

    insert into t1(str,goods_id)values('农',1);

    insert into t1(str,goods_id)values('夫',1);

    insert into t1(str,goods_id)values('农夫',1);

    insert into t1(str,goods_id)values('山泉',1);

    insert into t1(str,goods_id)values('泉3',1);

    ...

    等任意组合的若干连续字符的索引记录。

    当需要模糊查找 like '%泉3%'的时候,变成

    select * from goods where goodsid in (select distinct goods_id from t1 where str='泉3');

    这种方法,在很多的论坛一类的代码中有体现。

    不过,这种方法更加适合需要模糊查询的字段比较短,而查询又有模糊,又有大量关联的情况,比如:

    select * from goods, purchase where goods.goodsid=purchase.goodsid and goodsname like '泉3';

    这种情况.转换后是

    select * from goods, purchase where goods.goodsid=purchase.goodsid and  goodsid in (select distinct goods_id from t1 where str='泉3');

  • 相关阅读:
    杭电1058
    动态规划之背包模版
    按字典序依次打印只由1~n组成的n位数
    杭电1029
    杭电1257
    杭电2191
    杭电1114
    杭电2602
    南阳975
    杭电2138
  • 原文地址:https://www.cnblogs.com/stevenlaz/p/4056523.html
Copyright © 2011-2022 走看看