搜索引擎笔记

549 阅读4分钟

核心理论思想

议题1:为什么需要搜索引擎?

问自己几个问题。

问题1:我们的应用中一般用什么来存储数据?

DB数据库

问题2:我们经常浏览新闻、博客、商品,存储这些数据的表都应该有哪些字段?

问题3:在数据库中如何做下面的查询?以新闻为例

按类别查询:

SELECT * FROM 新闻表 WHERE 类别 IN (...);

按时间查询:

SELECT * FROM 新闻表 WHERE 发布时间 BETWEEN XXX AND XXX;

查询标题为钓鱼岛是中国的新闻:

SELECT * FROM 新闻表 WHERE 标题='钓鱼岛是中国的';

查询与钓鱼岛有关的新闻:

SELECT * FROM 新闻表 WHERE 标题LIKE'%钓鱼岛%' or 内容 LIKE'钓鱼岛'

在DB中数据越大性能越低

问题4:当数据量变大时,这4个查询都变慢了,该如何优化?

创建索引,分库分表,引入缓存等

问题5:索引的原理是怎样的?

对列值创建排序存储,数据结构={列值、行地址}。在有序数据列表就可以利用二分查找快速找到要查找的行的地址,在根据地址直接取行数据。

问题6:索引的排序,是怎么样排的?

数值列和时间列都好排序,文本列对字符集排序

问题7: 在新闻标题列上建索引后,当我们查询标题='钓鱼岛',数据库会怎么取查询?

而当我们查询标题LIKE '%XX%',数据库就用不上索引,效率非常低。就需要用到搜索引擎了。

结论

数据库适合结构化数据的精确查询,而不是半结构化、非结构化数据的模糊查询及灵活搜索(特别是数据量大时),无法提供想要的实时性。

结构化数据:用表、字段表示的数据

半结构化数据:XML HTML

非结构化数据: 文本、文档、图片、音频、视频等

议题2:如何做才能快速查询到与‘钓鱼岛是中国的’有关新闻?

分析:我们查询时,输入的是‘钓鱼岛是中国的’,想要得到标题或者内容中包含的新闻列表。如何做,可以快速找到‘钓鱼岛’的文章id,包含‘中国’的文章id?

将索引做一个并集就可以快速找出相关新闻。

问题2:为什么称为倒排索引? 英文原名Inverted index, 失败地翻译成了倒排索引, 正确翻译为:反向索引。

问题3:这两个索引能合并吗?

错误的合并

正确的合并

问题4:反向索引的记录数会不会很大?

问题5:如何建立这样一个索引?

问题6:如果要开发一个中文分词器,你觉得该怎么实现对一句话进行分词?

问题7:java开源中文分词器有哪些?

blog.csdn.net/yjl33/artic…

问题8:分词器在分词时能不能统计出词的出现次数、位置?作用?

问题9:你、我、他、的、了、标点等,这些需要为其创建索引吗?

一般称为停用词,不会被索引。

问题10:当出现了新词,该怎么办?

撩妹、软妹子、直男

议题3:有了反向索引,如何进行搜索?

步骤1:对搜索输入进行分词

步骤2:在反向索引中找出包含的列表

步骤3:合并列表,排序输入

问题1:合并后的列表如何排序?

我们希望最相关的排在最前面

问题2:相关性如何度量?

建立一套能评估相关性的模型。

问题3:如何根据次数生成模型?

规则1:统计出现次数,根据次数从高到低

规则2:加入权重,标题权重10,内容权重1,计算权重得分,按高低排序

思考1:反向索引更新时,索引是不是必须更新?好更新吗?

思考2:反向索引是存储在内存中还是磁盘中?

思考3:搜索引擎需要支持精确搜索吗?需要支持像数据库一样的多条件and or 组合搜索吗?