搜索引擎的核心思想

索引的原理

对列值创建排序存储,数据结构={列值、行地址}。在有序数据列表中就可以利用二分查找快速找到要查找的行的地址,再根据地址直接取行数据。使用的是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

posted @ 2019-03-22 17:37  见习小学生  阅读(200)  评论(0)    收藏  举报