搜索引擎的核心思想
索引的原理
对列值创建排序存储,数据结构={列值、行地址}。在有序数据列表中就可以利用二分查找快速找到要查找的行的地址,再根据地址直接取行数据。使用的是Btree数据结构。
索引的排序是怎么排的
数值列:按照数值的大小排序
时间列:时间在数据库存储的是数值,也是按照数值的大小排序
文本列:文本列存储的是字符,每个字符有对应字符集编码值,按照每个字符对应的编码值来排序
为什么需要搜索引擎
数据库适合结构化数据的精确查询,而不适合半结构化、非结构化数据的模糊查询及灵活搜索(特别是数据量大时),无法提供想要的实时性。
结构化数据:用表、字段表示的数据
半结构化数据:xml,html
非结构化数据:文本、文档、图片、音频、视频等
反向索引
查询哪些文章描述包含某关键词,需要怎样的索引
关键词------------> 文章ID
四川 ---------> {6,8,18}
反向索引的记录数会不会很大
英文单词的大致数量是10万个
《现代汉语规范词典》包含一万三千多字,七万两千多词
中文分词器原理
有个词的字典,对语句前后字进行组合,与字典匹配,歧义分析
如:张三说的确实有道理。词的字典结构为{张:{1:张三,2:张开:3:张冠李戴:4:张飞},说:{1:说话,2:说服,3:说的}}。
根据这句话的第一个字:“张”,去词的字典里面找,找到了“张”字,然后取"张"字的后面的一个字组成一个词:“张三”,再去字典里面找,找到了“张三”这个词,然后再取后面的一个字:“说”,组成“张三说”,去字典里查找,没有找到,则确定“张三”是一个词,“张三说”不是一个词,就将张三进行分词。
然后从第二个字“三”开始去查找,发现“三说”、“三说的”都不是一个词。再依次查找其他的。
最后分词:“张三”、“说的”、“的确”、“确实”、“有道”、“有道理”、“道理”。
创建反向索引
根据分词器,创建反向索引:四川:{{1,2,{21,32}},{5,3,{18,29,45}}},其中第一个数字(1和5)表示文章Id,第二个数字(2和3)表示出现次数,第三个数字(21、32、18、29、45)表示出现位置偏移量,即字符出现的位置(字符索引号)
相关性计算模型
复杂的相关性计算模型有:
- tf-idf 词频-逆文档率模型
- 向量空间模型
- 贝叶斯概率模型,如:BM25
tf-idf 相关性计算模型
tf : term frequency 词频: 指一个词在一篇文档中出现的频率
tf = 词t在文档d中的出现次数/文档d的总词数
df : document frequency 词的文档频率 : 指包含某个词的文档数(有多少文档中包含这个词)
idf : inverse document frequency 词的逆文档频率 : 用来表示词在文档集中的重要性.文档总数/df, df越小, 词越重要,这个值会很大, 那就对它取个自然对数,将值映射到一个较小的取值范围
idf = log(文档集的总文档数/(包含词t的文档数 + 1)) 说明:+1是为了避免除0(即词t在文档集中未出现的情况)
tf-idf = tf * idf

浙公网安备 33010602011771号