黑马程序员技术交流社区
标题: 【上海校区】Lucene的基本介绍 [打印本页]
作者: 偷树的光头强 时间: 2019-1-14 20:04
标题: 【上海校区】Lucene的基本介绍
一:Lucene的介绍
1.Lucene即全文检索。
全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置。
当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程。
2.搜索引擎构成
1)爬行和抓取数据(爬虫多用Python来编写)
2)对数据做预处理(提取文字,中文分词、建立倒排索引)
3)提供搜索功能(用户输入关键词后,去索引库搜索数据)
3.数据库搜索的处理
数据库数据单表存储能力有限,无法存储海量数据
解决大数据,可以进行分库分表。但是分库分表会增加业务复杂度
搜索只能通过模糊匹配,效率极低
模糊搜索可能导致全表扫描,效率非常差
4.倒排索引技术
1)传统查找:采用数据按行存储,查找时逐行扫描,或者根据索引查找,然后匹配搜索条件,效率较差。概括来讲是先找到文档,然后看是否匹配。
2)倒排索引:首先对文档数据按照id进行索引存储,然后对文档中的数据分词,记录对词条进行索引,并记录词条在文档中出现的位置。
这样查找时只要找到了词条,就找到了对应的文档。概括来讲是先找到词条,然后看看哪些文档包含这些词条。
5.搜索引擎的原理
二:Lucene的基本使用
1.创建索引的流程
流程: 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.需要注意的问题- 如果需要根据这个字段搜索,则这个字段需要创建索引。
- 无需创建索引:使用StoreField类型
- 需要创建索引:使用除了StoreField外的其它类型
- 如果一个字段要显示到最终的结果中,那么一定要存储,否则就不存储
- 存储,则使用StoreField或者其它类型字段,但是构造函数第三个参数必须是Store.YES
- 不存储,必须使用StoreField以外的字段,并且构造函数第三个参数必须是Store.NO
- 这个字段首先要需要被搜索,因此剔除了StoreField。然后如果这个字段的值是不可分割的,那么就不需要分词,例如:ID;否则就需要分词
- 需要分词:使用TextField
- 不需要分词:使用除TextField外的其它几个类型
其实,这里最关键的是弄清楚一个字段:是否需要存储、是否需要索引、是否需要分词。弄清楚这个,就能知道怎么选择API了。 三:索引的基本查询
1.基本流程
实现步骤
- 第一步:创建一个Directory对象,也就是索引库存放的位置。
- 第二步:创建一个indexReader对象,需要指定Directory对象。
- 第三步:创建一个indexsearcher对象,需要指定IndexReader对象
- 第四步:创建一个Query的子类对象,指定查询的域和查询的关键词。
- 第五步:执行查询。
- 第六步:返回查询结果。遍历查询结果并输出。
- 第七步:关闭IndexReader对象
2.修改索引
3.删除索引
作者: 一个人一座城0.0 时间: 2019-1-16 09:10
看一看。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |