工具与中间件: Lucene

1.全文检索基本介绍

一.什么是全文检索

  1. 数据的分类
    1. 结构化数据:
      - 格式固定,长度固定,数据类型固定  例如数据库中的数据
    2. 非结构化数据:
      - word文档,pdf文档,邮件,html
      - 格式不固定,长度不固定,数据类型不固定
  2. 数据的查询
    1. 结构化数据的查询:
      - SQL语句,查询结构化数据的方法,简单,速度块
    2. 非结构化数据的查询
      1. 目测
      2. 使用程序把文档读取到内存中,然后匹配字符串,顺序扫描
      3. 把非结构化数据变成结构化数据
           先根据空格进行字符串拆分,得到一个单词列表,基于单词列表创建一个索引。
           然后查询索引,根据单词和文档的对应关系找到文档列表,这个过程叫做全文检索。
        索引: 一个为了提高查询速度,创建某种数据结构的集合。
  3. 全文检索
            先创建索引然后查询索引的过程叫做全文检索。
            索引一次创建可以多次使用,表现为每次查询速度很快。

二.全文检索应用场景

  1. 搜索引擎
            百度,360,谷歌......
  2. 站内搜索
            论坛搜索,微博,文章搜索
  3. 电商搜索
            淘宝搜索, 京东搜索
  4. 只要是有搜索的地方就可以使用全文检索技术。

三.什么是Lucene

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

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

  1. 创建索引
    1. 获得文档
             原始文档: 要基于哪些数据来进行搜索,那么这些数据就是原始文档。
             搜索引擎: 使用爬虫获得原始文档。
             站内搜索: 数据库中的数据
             案例: 直接使用io流读取磁盘上的文件
    2. 构建文档对象
             对应每个原始文档创建一个Document对象
             每个document对象中包含多个域(field)
             域中保存就是原始文档数据。
                    域的名称
                    域的值
             每个文档都有一个唯一的编号,就是文档id
    3. 分析文档
             就是分词的过程
             1.根据空格进行字符串拆分,得到一个单词列表
             2.把单词统一转换成小写
             3.去掉标点符号
             4.去除停用词(无意义的词)
             每个关键词都封装成一个Term对象中
                    Term中包含两部分内容:
                           关键词所在的域   
                           关键词本身。
                    不同的域中拆分出来的相同的关键词是不同的Term。
    4. 创建索引
             基于关键词列表来创建一个索引,保存到索引库中。
             索引库中:
                    索引
                    document对象
                    关键词和文档的对应关系
             通过词语找文档,这种索引的结构叫做倒排索引结构。
  2. 查询索引
    1. 用户查询接口
             用户输入查询条件的地方
             例如:百度的搜索框
    2. 把关键词封装成一个查询对象
             要查询的域
             要搜索的关键词
    3. 执行查询
             根据要查询的关键词到对应的域上进行搜索
             找到关键词,根据关键词找到对应的文档
    4. 渲染结果
             根据文档的id找到文档对象
             对关键词进行高亮显示
             分页处理
             最终展示给用户看

2.lucene入门案例

一.入门案例

  1. 创建索引
           环境:
                  需要下载Lucene
                  http://lucene.apache.org/
                  最低要求jdk1.8
           工程搭建:
                  创建一个java工程
                  添加jar:
                                lucene-analyzers-common-7.4.0.jar
                                lucene-core-7.4.0.jar
                                commons.io.jar
           步骤:
                  1.创建一个Directory对象,指定索引库保存的位置
                  2.基于Directory对象创建一个IndexWriter对象
                  3.读取磁盘上的文件,对应每个文件创建一个文档对象
                  4.向文档对象中添加域              
                  5.把文档对象写入索引库
                  6.关闭indexWriter对象
  2. 使用luke查看索引库中的内容(需要jdk1.9)
  3. 查询索引库
           步骤:
                  1.创建一个Directory对象,指定索引库的位置。
                  2.创建一个IndexReader对象。
                  3.创建一个IndexSearcher对象,构造方法中的参数indexReader对象。
                  4.创建一个Query对象,TermQuery
                  5.执行查询,得到一个TopDocs对象
                  6.取查询结构的总记录数
                  7.取文档列表  topDocs.scoreDocs()
                  8.打印文档中的内容
                  9.关闭IndexReader对象

3.中文分析器

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

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

二.IKAnalyzer的使用方法

  1. 使用IKAnalyzer的jar包添加到工程中
  2. 把配置文件和扩展词典添加到工程的classpath下
    注意:扩展词典严禁使用Windows记事本编辑保证扩展词典的编码格式是utf-8
    扩展词典:添加一些新词
    停用词词典:无意义的词或者是敏感词汇

4.索引库维护

一.添加文档

二.删除文档

  1. 删除全部
  2. 根据查询,关键词删除文档

三.修改文档

  1. 修改的原理是先删除后添加

5.索引库查询

一.使用Query的子类

  1. TermQuery
    1. 根据关键词进行查询
    2. 需要制定要查询的域及要查询的关键词
  2. RangeQuery
    范围查询

二.使用QueryPaser进行查询

  1. 可以对要查询的内容先分词,然后基于分词的结果进行查询。
  2. 添加一个jar包
    lucene-queryparser-7.4.0.jar
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值