一、全文检索

  1. 数据的分类

    • 1 结构化数据
      • 格式固定,长度固定、数据类型固定
      • 比如数据库中的数据
    • 2 非结构化数据
      • 格式不固定、长度不固定、数据类型不固定
      • 比如 word、PDF、邮件、HTML、txt
  2. 数据的查询

    • 1 结构化数据的查询
      • SQL语句,查询结构化数据的方法,简单,速度快
    • 2 非结构化数据的查询
      • 从文本文件中找出包含指定单词的文件
        • 目测
        • 使用程序把文档读取到内存中,然后匹配字符串。属性扫描。
        • 把非结构化数据编程结构化数据
          • 先根据空格进行字符串拆分,得到一个单词列表,基于单词列表创建一个索引
          • 根据单词与索引的对应关系找到文档列表,这个过程叫做全文检索
            • 索引:一个为了提高查询速度,创建某种数据结构的集合
  3. 全文检索

  • 先创建索引后然后查询索引的过程叫做全文检索
  • 索引创建一次,可以多次查询,表现为每次查询的速度都很快

二、全文索引的应用场景

  1. 搜索引擎

    • 百度、谷歌
  2. 站内索引

    • 论坛搜索、微博、文章搜索
  3. 电商搜索

    • 淘宝搜索、京东搜索
  4. 只要是有搜索的地方就可以使用全文检索技术

三、Lucene

Lucene是一个基于java开发的全文检索工具包。

四、Lucene实现全文检索的流程

  1. 创建索引

    • 1 获取文档

      • 原始文档:基于哪些数据进行检索,那么这些数据就是原始文档
      • 搜索引擎:使用爬虫来获取原始文档
      • 站内搜索:数据库中的数据
      • 案例:直接使用IO流来读取磁盘上的文件
    • 2 构建文档对象

      • 对应每个原始文档来创建一个document对象
      • 每个document对象中包含多个域(field)
      • 域中保存的就是原始文档的数据
        • 域的名称
        • 域的值
      • 每个文档中都有一个唯一的编号,就是文档的id
    • 3 分析文档

      • 分词的过程
        • 根据空格进行字符串的拆分,得到一个单词列表
        • 把单词全部转化为小写
        • 去除标点符号
        • 去除停用词:无意义的词
        • 每个关键词都封装成一个term对象中
          • term包含两部分内容:
            • 关键词所在的域
            • 关键词本身
          • 不同的域中拆分出来的相同的关键词是不同的term
    • 4创建索引

      • 基于关键词列表创建一个索引,保存到索引库中。
      • 索引库中包含:
        • 索引
        • document
        • 关键词和文档的对应关系
      • 通过词语查找文档,这种索引的结构叫做倒排索引结构
  2. 查询索引

    • 用户查询接口
      • 用户输入查询条件的地方
      • 例如:百度的索引框
    • 把关键词封装成一个查询对象
      • 要查询的域
      • 要搜索的关键词
    • 执行查询
      • 根据要查询的关键词到对应的域上进行搜索
      • 找到关键词,根据关键词找到对应文档
    • 渲染结果
      • 根据文档的id找到文档对象
      • 对关键词进行高亮显示
      • 分页处理
      • 最终展示给用户看

五、入门程序

  1. 创建索引

    • 环境:
      • 下载Lucene程序
      • 最低要求jdk1.8
    • 工程搭建
      • 创建一个java工程:
      • 添加jar包:core 、analyzers 、commons-io.jar
    • 步骤:
      • 创建一个directory对象,指定索引保存的位置
      • 基于Directory对象创建IndexWriter对象
      • 读取磁盘上的文件,对应每个文件创建一个文档对象
      • 向文档对象中添加域
      • 把文档对象写入索引库
      • 关闭IndexWriter对象
  2. 使用luke查看索引库中的内容

    • jdk9
  3. 查询索引库

    • 步骤
      • 创建一个directory对象,指定索引库的位置
      • 创建一个IndexReader对象
      • 创建一个IndexSearcher对象,构造方法中的参数:IndexReader
      • 创建一个Query对象,TermQuery
      • 执行查询,得到查询结果,TopDoc对象
      • 获取查询结果的总记录数
      • 取文档列表
      • 打印文档中的内容
      • 关闭indexReader对象

六、分析器

默认使用的是标准分析器StandardAnalyzer

  1. 查看分析器的分析效果

    • 使用Analyzer对象的tokenStream方法返回一个tokenStream对象,词对象中包含了最终分词结果
    • 实现步骤
      • 创建Analyzer对象,StandardAnalyzer对象
      • 使用分析器对象的tokenStream方法获得TokenStream对象
      • 向TokenStream对象中设置一个引用。相当于一个指针
      • 调用TokenStream对象的rest方法,如果不调用,会抛出异常
      • 使用while循环遍历TokenStream对象
      • 关闭TokenStream对象
  2. IKanalyzer的使用方法

    • 把IKAnalyze入队jar包添加到工程中
    • 把配置文件和扩展词典都添加的工程的classpath下
    • 扩展词典严禁使用windows记事本编辑,保证扩展词典的编辑格式是utf-8
      • 扩展词典:可以添加一些新词
      • 停用词词典:无意义的词、敏感词汇

七、索引库的维护

  1. 添加文档