美文网首页
搜索引擎核心理论思想

搜索引擎核心理论思想

作者: 右耳菌 | 来源:发表于2022-11-07 22:00 被阅读0次

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

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

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

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


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


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

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

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

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

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



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

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

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

    • 结构化数据:用表、字段表示的数据
    • 半结构化数据:xml html
    • 非结构化数据:文本、文档、图片、音频、视频等

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

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

    • 倒排索引

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

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

    正确的合并方式


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

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



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

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


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


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

    • 有很多,如何选择?
      1.准确率 2.分词效率 3.中英混合分词支持

    • 常用的中文分词器有:IKAnalyzer mmseg4j

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


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

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

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

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


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

    • 步骤1: 对搜索输入进行分词
      钓鱼岛、中国
    • 步骤2: 在反向索引中找出包含钓鱼岛、中国的文章列表


    • 步骤3: 合并两个列表,排序输出
      {1,12,8,5}

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

    • 问题1:合并后列表该如何排序?我们希望最相关的排在最前面
    • 问题2:相关性如何度量?
      人可以通过读内容判定相关性,机器不懂人话。
      得建立一套能评估相关性的模型。
    • 问题3:如何根据次数建立一个相关性评估模型?

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


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



    4. 其他的剩余议题

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

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

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

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

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

    必须要支持


    5. Lucene

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

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

    • Lucene在ES中的应用

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


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

    相关文章

      网友评论

          本文标题:搜索引擎核心理论思想

          本文链接:https://www.haomeiwen.com/subject/bzaitdtx.html