开发Web应用时,你经常要加上搜索功能。甚至还不知道要搜什么,就在草图上画了一个放大镜。
说到目前计算机的文字搜索在应用上的实现,象形文字天生就比拼音字母劣势的多,分词、词性判断、拼音文字转换啥的,容易让人香菇。
首先我们来了解下什么是Inverted index,翻译过来的名字有很多,比如反转索引、倒排索引什么的,让人不明所以,可以理解为:一个未经处理的数据库中,一般是以文档ID作为索引,以文档内容作为记录。而Inverted index 指的是将单词或记录作为索引,将文档ID作为记录,这样便可以方便地通过单词或记录查找到其所在的文档。并不是什么高深概念。
oracle里常用的位图索引(Bitmap index)也可认为是Inverted index。位图索引对于相异基数低的数据最为合适,即记录多,但取值较少。比如一个100W行的表有一个字段会频繁地被当做查询条件,我们会想到在这一列上面建立一个索引,但是这一列只可能取3个值。那么如果建立一个B*树索引(普通索引)是不合适的,因为无论查找哪一个值,都可能会查出很多数据,这时就可以考虑使用位图索引。位图索引相对于传统的B*树索引,在叶子节点上采用了完全不同的结构组织方式。传统B*树索引将每一行记录保存为一个叶子节点,上面记录对应的索引列取值和行rowid信息。而位图索引将每个可能的索引取值组织为一个叶子节点。每个位图索引的叶子节点上,记录着该索引键值的起始截止rowid和一个位图向量串。如果不考虑起止rowid,那么就是取值有几个,就有几个索引,比如上例,虽说有100W条记录,但是针对只有3个可取值的字段来说,索引节点只有3个,类似于下图:
需要注意的是,由于所有索引字段同值行共享一个索引节点,位图索引不适用于频繁增删改的字段,否则可能会导致针对该字段(其它行)的增删改阻塞(对其它非索引字段的操作无影响),是一种索引段级锁。具体请参看 深入解析B-Tree索引与Bitmap位图索引的锁代价。
下面说说笔者知道的一些全文搜索的工具。
文中绿色文字表示笔者并不确定描述是否正确,红色表示笔者疑问,若有知道的同学请不吝赐教,多谢!
- ssh框架 2016-09-30
- 阿里移动安全 [无线安全]玩转无线电——不安全的蓝牙锁 2017-07-26
- 消息队列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 论文笔记【图片目标分割】 2017-07-26
- 词向量-LRWE模型-更好地识别反义词同义词 2017-07-26
- 从栈不平衡问题 理解 calling convention 2017-07-26
- php imagemagick 处理 图片剪切、压缩、合并、插入文本、背景色透明 2017-07-26
- Swift实现JSON转Model - HandyJSON使用讲解 2017-07-26
- 阿里移动安全 Android端恶意锁屏勒索应用分析 2017-07-26
- 集合结合数据结构来看看(二) 2017-07-26