学习全文检索后的一些记录。
1:全文检索要解决的问题
我们遇到的数据总体分为两种:结构化数据和非结构化数据。
- 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。
- 非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等。
对结构化的数据,我们可以用数据库等方式进行检索(效率差)。对于非结构化数据进行检索,利用windows系统的搜索也可以搜索文件内容,Linux下的grep命令等命令来实现。然而,使用这种顺序扫描的方式是相当费时的,于是便有了全文检索系统。
2:全文检索原理
将非结构化数据转为结构化数据(索引的过程),然后从索引中查找。
3:索引里究竟存什么,为什么检索这么快?
假如有3亿条产品标题存在数据库中,需要通过全文检索系统根据关键词来查找出相关的信息。
例如前5条产品标题分别是:
1:破碎机,挖掘机价格,破碎机图片,破碎机行业介绍
2:破碎机销售,价格、磨石机价格、磨刀机价格
3:电视机价格
4:冰箱价格
5:风扇价格
索引过程:遍历每条产品标题,分词,创建倒排链表。
第一条数据分词: 破碎 机 挖掘 机 价格 破碎 机 图片 破碎 机 行业 介绍
统计出现次数:
破碎 3
机 4
挖掘 1
价格 1
图片 1
行业 1
介绍 1
第二条数据分词: 破碎 机 销售 价格 磨石 机 价格 磨刀 机 价格
统计每个词出现次数:
破碎 1
机 3
销售 1
价格 3
磨石 1
磨刀 1
遍历所有的数据,生成倒排链表格式如下:
破碎: 1=》 2 => 3 => N (数字代表文档编号)
机 : 1 =》 2 => 4
价格: 1 =》 2
挖掘: 1 => 4 => 5 =》 N
图片: 1 => N
行业: 1 => N
介绍: 1 => 8 => 10 =》 N-1
销售: 2 => N
磨石: 2 => N
磨刀: 2 => N
此时倒排表已经建立好。文档多的时候,倒排链表会特别大,不过不用担心,倒排表是格式化后存硬盘的。
检索过程:
输入关键词”破碎机价格”,全文检索系统首先对传入的字符串分词为"破碎 机 价格",然后取出这3个词对应的倒排表。这时候cpu该上场,cpu会计算出哪些文档同时出现在3个倒排表中。计算之后会得到包含“破碎 机 价格”的所有文档编号(1和2),最后根据这些编号从数据库中查出对应的详细信息并展示给用户。
4:检索结果排序
如上例,搜索“破碎机价格”,文档1和文档2都会出现,那么哪条数据排前面是需要经过一个评分过程。
1:对每个匹配到的文档计算权重(根据搜索的关键词”破碎 机 价格“来计算),使用如下公式:
- Term Frequency (tf):词频,在此文档中出现了多少次。
- Document Frequency (df):文档频次,表示总共有多少文档包含此词。
公式最直白解释:df 越大说明越不重要,tf 越大说明越重要。
依照此公式依次对上一步得到的所有文档计算权重,最后求和(复杂的算法,这里是简化的说法),得到这个文档的得分。最终按照得分来排序。
上例中:“破碎” 在2个文档中出现,文档频次(df)就是2
“机” 在3个文档中出现,文档频次是3
“价格” 在5个文档中出现,文档频次是5
此时,得出“破碎”的文档频次(df)最小,”破碎“这个词最重要。再查“破碎“在文档1中出现3次(tf),在文档2中出现1次。此时文档1已经得到一个较大的评分。依次算出所有文档的得分。
继续对“机“、”价格“在所有文档上求出评分,最终会得出文档1评分最高。全文检索系统评分之后,会将文档1排在首位,文档2排在第2位。
5:词组匹配的实现(完全匹配)
待续
6: 属性过滤的实现
待续