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');

  • 相关阅读:
    大数据面试题题库
    IDEA下通过Git实现代码管理
    使用QJM实现HDFS的HA配置
    1、HDFS分布式文件系统
    分析system_call中断处理过程
    由一段代码解析系统调用的原理
    从linux内核代码分析操作系统启动过程
    一个简单的时间片轮转多道程序内核
    从一段代码的汇编看计算机的工作原理
    九度OJ1468
  • 原文地址:https://www.cnblogs.com/stevenlaz/p/4056523.html
Copyright © 2011-2022 走看看