搜索引擎核心理论思想

2022-11-07  本文已影响0人  右耳菌

1. 为什么需要搜索平引擎

首先先思考下面的几个问题:

  1. 我们的应用中一般用什么来存储数据?
    数据库如 MySQL

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


  3. 在数据库中如何做下面的查询? 以上面的新闻表为例


  4. 当数据量变大时,上边3中的四个查询都变慢了,该如何优化?
    常用的数据库优化方法:
    建索引、分区表

  5. 建索引对“查询与钓鱼岛有关的新闻”有效率上边的提升吗?为什么?
    答案是没有的

  6. 索引的原理是怎样的?
    对列值创建排序存储,数据结构={列值、行地址}。在有序数据列表中就可以利用二分查找快速找到要查找的行的地址,再根据地址直接取行数据。

  7. 索引的排序,是怎么排的?
    数值列 : 数值大小
    时间列 : 转换成long之后按照数值大小
    文本列 : 按照字符集编码

  8. 在“新闻标题”列上建索引后,当我们查询 标题 = “钓鱼岛”,数据库会怎么去查?



    而当我们查询 标题 LIKE ‘%钓鱼岛%’,数据库此时无法使用索引进行查询,所以无法提升效率,此时会全表扫描。

由以上八个问题,我们可以得出以下的结论:

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


2. 搜索引擎是如何做到快速查询的

1思考:如何做才能快速查询到与“钓鱼岛是中国的”有关的新闻?
分析:我们查询时,输入的是“钓鱼岛是中国的”,想要得到标题或内容中包含“钓鱼岛是中国的”的新闻列表。
如何做,可以快速找到包含“钓鱼岛”的文章id,包含“中国”的文章id?

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

  1. 下面这两个索引可以合并在一起吗?

正确的合并方式


上边的合并方式节约了存储空间,提升了检索效率。

  1. 反向索引的记录数会不会很大?
    正常来说是不会的,可以查看下面的图:



    所以一般来说最多也不会超过100W个

  2. 如何建立这样一个索引?


  3. 如果要开发一个中文分词器,你觉得该怎么实现对一句话进行分词?
    语句示例:张三说的却是在理:


  4. java开源的中文分词器有哪些?

  1. 分词器在分词时能不能统计出词的出现次数、位置?有什么作用?
    可以,这样可以方便进行一个短语查询和高亮等等。


  2. 你、我、他、的、地、了、标点符号…..这些需要为其创建索引吗?
    这种词一般称为停用词,不会被索引

  3. 当出现了新词了,该怎么办?
    撩妹老司机、软妹子、直男 遇到这种情况就需要允许自行添加内容到字典

所以由以上十个点,可以得出结论,如果要快速查询到指定的内容的新闻

结论:使用分词器对数据进行分词,建立反向索引。


3. 有了反向索引了,如何进行搜索?


由上边的内容,引申出以下问题:



4. 其他的剩余议题

4.1 反向索引更新:数据更新时,索引是不是必须得更新?好更新吗?

正常来说是不存在更新这个操作的,实现更新操作的方式也很简单粗暴,就是先删除文章然后再重新索引该文章。

4.2 反向索引是存储在内存中,还是磁盘中合适?反向索引会有多大?

一般到都是写到磁盘上,然后用buff快速写入。

4.3 搜索引擎需要支持精确搜索吗?需要支持像数据库一样的多条件AND OR组合搜索吗?

必须要支持


5. Lucene

最受欢迎的java开源全文搜索引擎开发工具包。提供了完整的查询引擎和索引引擎,部分文本分词引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索功能,或者是以此为基础建立起完整的全文检索引擎。

是Apache的子项目,网址: http://lucene.apache.org/

ES将index的数据分为多份,每份叫一个shard,为了提高数据可用性,每个shard都会有冗余副本,每个副本实际上是一个Lucene index实例.


如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~

上一篇下一篇

猜你喜欢

热点阅读