}

传智播客旗下技术交流社区北京校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 偷树的光头强 中级黑马   /  2019-1-14 20:04  /  40 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


一:Lucene的介绍
1.Lucene即全文检索。
全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置。
当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程。
2.搜索引擎构成
    1)爬行和抓取数据(爬虫多用Python来编写)
    2)对数据做预处理(提取文字,中文分词、建立倒排索引)
    3)提供搜索功能(用户输入关键词后,去索引库搜索数据)
3.数据库搜索的处理
    数据库数据单表存储能力有限,无法存储海量数据
    解决大数据,可以进行分库分表。但是分库分表会增加业务复杂度
    搜索只能通过模糊匹配,效率极低
    模糊搜索可能导致全表扫描,效率非常差
4.倒排索引技术
     1)传统查找:采用数据按行存储,查找时逐行扫描,或者根据索引查找,然后匹配搜索条件,效率较差。概括来讲是先找到文档,然后看是否匹配。
     2)倒排索引:首先对文档数据按照id进行索引存储,然后对文档中的数据分词,记录对词条进行索引,并记录词条在文档中出现的位置。
                              这样查找时只要找到了词条,就找到了对应的文档。概括来讲是先找到词条,然后看看哪些文档包含这些词条。
5.搜索引擎的原理
1540353467796.png


二:Lucene的基本使用
1.创建索引的流程
1540362622155.png
流程:     1)准备要添加的文档数据:Document     2)初始化索引写出工具:IndexWriter     3)设定索引存储目录Directory     4)设定其他配置:IndexWriterConfig     5)设定分词器:Analyzer     6)设定Lucene版本     7)写出索引2.创建索引的细节     1.覆盖或追加的三种模式          1.1  CREATE:每次写入都覆盖以前的数据          1.2  APPEND:不覆盖数据,而是使用以前的索引数据后追加          1.3  CREATE_OR_APPEND:如果不存在则创建新的,如果存在则追加数据
     2.Filed字段类型         2.1  DoubleField、FloatField、IntField、LongField、StringField、TextField这些子类创建的字段一定会被创建索引。                 但是不一定会被存储到文档列表。要通过构造函数中的参数Store来指定:         2.2   Store.YES代表存储,在搜索结果中也会展示出来         2.3   Store.NO代表不存储,在搜索结果中无法展示         2.4   TextField即创建索引,又会被分词。其它Field会创建索引,但是不会被分词。3.需要注意的问题
  • 问题1:这个字段是否需要创建索引?
  • 如果需要根据这个字段搜索,则这个字段需要创建索引。
  • 无需创建索引:使用StoreField类型
  • 需要创建索引:使用除了StoreField外的其它类型
  • 问题2:这个字段是否需要存储?
  • 如果一个字段要显示到最终的结果中,那么一定要存储,否则就不存储
  • 存储,则使用StoreField或者其它类型字段,但是构造函数第三个参数必须是Store.YES
  • 不存储,必须使用StoreField以外的字段,并且构造函数第三个参数必须是Store.NO
  • 问题3:这个字段是否需要分词?
  • 这个字段首先要需要被搜索,因此剔除了StoreField。然后如果这个字段的值是不可分割的,那么就不需要分词,例如:ID;否则就需要分词
  • 需要分词:使用TextField
  • 不需要分词:使用除TextField外的其它几个类型
其实,这里最关键的是弄清楚一个字段:是否需要存储、是否需要索引、是否需要分词。弄清楚这个,就能知道怎么选择API了。
三:索引的基本查询

1.基本流程
  • 创建索引搜索工具

  • 指定索引目录
  • 创建读取流工具
  • 创建搜索工具

  • 创建查询条件

  • 创建查询解析器
  • 解析用户搜索语句,得到查询条件对象

  • 搜索并解析结果
实现步骤
  • 第一步:创建一个Directory对象,也就是索引库存放的位置。
  • 第二步:创建一个indexReader对象,需要指定Directory对象。
  • 第三步:创建一个indexsearcher对象,需要指定IndexReader对象
  • 第四步:创建一个Query的子类对象,指定查询的域和查询的关键词。
  • 第五步:执行查询。
  • 第六步:返回查询结果。遍历查询结果并输出。
  • 第七步:关闭IndexReader对象

2.修改索引
  • 创建索引写出对象

  • 指定目录
  • 配置

  • 创建文档
  • 更新数据

3.删除索引
  • 创建索引写出工具
  • 创建删除条件
  • 删除


分享至 : QQ空间
收藏

1 个回复

倒序浏览
看一看。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马
关闭

站长推荐 上一条 /5 下一条