zoukankan      html  css  js  c++  java
  • 10分钟理解全文检索

    学习全文检索后的一些记录。

    1:全文检索要解决的问题

    我们遇到的数据总体分为两种:结构化数据非结构化数据

    • 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。
    • 非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等。

    对结构化的数据,我们可以用数据库等方式进行检索(效率差)。对于非结构化数据进行检索,利用windows系统的搜索也可以搜索文件内容,Linux下的grep命令等命令来实现。然而,使用这种顺序扫描的方式是相当费时的,于是便有了全文检索系统。

    2:全文检索原理

        将非结构化数据转为结构化数据(索引的过程),然后从索引中查找。

    3:索引里究竟存什么,为什么检索这么快?

        假如有3亿条产品标题存在数据库中,需要通过全文检索系统根据关键词来查找出相关的信息。

        例如前5条产品标题分别是:

        1:破碎机,挖掘机价格,破碎机图片,破碎机行业介绍

        2:破碎机销售,价格、磨石机价格、磨刀机价格

        3:电视机价格

        4:冰箱价格

        5:风扇价格  

    索引过程:遍历每条产品标题,分词,创建倒排链表。

        第一条数据分词: 破碎 机 挖掘 机 价格 破碎 机 图片 破碎 机 行业 介绍

        统计出现次数: 

                    破碎 3

                    机  4

                    挖掘 1

                    价格 1

                    图片 1

                    行业 1

                    介绍 1

        第二条数据分词:    破碎 机 销售 价格 磨石 机 价格 磨刀 机 价格

        统计每个词出现次数:

                        破碎 1

                        机  3

                        销售 1

                        价格 3

                        磨石 1

                        磨刀 1

        遍历所有的数据,生成倒排链表格式如下:

           破碎: 1=》  2 =>  3  => N   (数字代表文档编号)

           机 :  1 =》 2 =>  4

           价格: 1 =》 2

           挖掘: 1 =>  4 =>  5 =》 N

           图片: 1 => N

           行业: 1 => N

           介绍: 1 => 8 => 10 =》 N-1

           销售: 2 => N

           磨石: 2 => N

           磨刀: 2 => N

        此时倒排表已经建立好。文档多的时候,倒排链表会特别大,不过不用担心,倒排表是格式化后存硬盘的。

    检索过程:

        输入关键词”破碎机价格”,全文检索系统首先对传入的字符串分词为"破碎 机 价格",然后取出这3个词对应的倒排表。这时候cpu该上场,cpu会计算出哪些文档同时出现在3个倒排表中。计算之后会得到包含“破碎 机 价格”的所有文档编号(1和2),最后根据这些编号从数据库中查出对应的详细信息并展示给用户。

    4:检索结果排序

        如上例,搜索“破碎机价格”,文档1和文档2都会出现,那么哪条数据排前面是需要经过一个评分过程。

       1:对每个匹配到的文档计算权重(根据搜索的关键词”破碎 机 价格“来计算),使用如下公式:

    • Term Frequency (tf):词频,在此文档中出现了多少次。
    • Document Frequency (df):文档频次,表示总共有多少文档包含此词。

    公式最直白解释:df 越大说明越不重要,tf 越大说明越重要。

    依照此公式依次对上一步得到的所有文档计算权重,最后求和(复杂的算法,这里是简化的说法),得到这个文档的得分。最终按照得分来排序。
    上例中:“破碎” 在2个文档中出现,文档频次(df)就是2
                 “机” 在3个文档中出现,文档频次是3
                “价格” 在5个文档中出现,文档频次是5
    此时,得出“破碎”的文档频次(df)最小,”破碎“这个词最重要。再查“破碎“在文档1中出现3次(tf),在文档2中出现1次。此时文档1已经得到一个较大的评分。依次算出所有文档的得分。
    继续对“机“、”价格“在所有文档上求出评分,最终会得出文档1评分最高。全文检索系统评分之后,会将文档1排在首位,文档2排在第2位。

    5:词组匹配的实现(完全匹配)
    待续
    6: 属性过滤的实现
    待续

  • 相关阅读:
    LC.225. Implement Stack using Queues(using two queues)
    LC.232. Implement Queue using Stacks(use two stacks)
    sort numbers with two stacks(many duplicates)
    LC.154. Find Minimum in Rotated Sorted Array II
    LC.81. Search in Rotated Sorted Array II
    LC.35.Search Insert Position
    前后端分离:(一)
    Redis基本使用(一)
    GIT篇章(二)
    GIT篇章(一)
  • 原文地址:https://www.cnblogs.com/dormscript/p/4787641.html
Copyright © 2011-2022 走看看