Lucene实现全文检索

一、什么是全文检索

1、数据的分类

1)结构化数据
	格式固定、长度固定、数据类型固定。
	例如数据库中的数据
2)非结构化数据
	word文档、pdf文档、邮件、html、txt
	格式不固定、长度不固定、数据类型不固定。

2、数据的查询

1)结构化数据的查询
	SQL语句,查询结构化数据的方法。简单、速度快。
2)非结构化数据的查询
	从文本文件中找出包含spring单词的文件。
	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找到文档对象
	对关键词进行高亮显示
	分页处理
	最终展示给用户看。

五、入门程序

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、创建一个Director对象,指定索引库保存的位置。
	2、基于Directory对象创建一个IndexWriter对象
	3、读取磁盘上的文件,对应每个文件创建一个文档对象。
	4、向文档对象中添加域
	5、把文档对象写入索引库
	6、关闭indexwriter对象
public void createIndex() throws Exception {
   
        //1、创建一个Director对象,指定索引库保存的位置。
        //把索引库保存在内存中
        //Directory directory = new RAMDirectory();
        //把索引库保存在磁盘
        Directory directory = FSDirectory.open(new File("E:\\temp\\index").toPath());
        //2、基于Directory对象创建一个IndexWriter对象
        IndexWriterConfig config = new IndexWriterConfig(new IKAnalyzer());
        IndexWriter indexWriter = new IndexWriter(directory, config);
        //3、读取磁盘上的文件,对应每个文件创建一个文档对象。
        File dir = new File("E:\\BaiduNetdiskDownload\\12-lucene\\02.参考资料\\searchsource");
        File[] files = dir.listFiles();
        for (File f :
                files) {
   
            //取文件名
            String fileName = f.getName();
            //文件的路径
            String filePath = f.getPath();
            //文件的内容
            String fileContent = FileUtils.readFileToString(f, "utf-8");
            //文件的大小
            long fileSize = FileUtils.sizeOf(f);
            //创建Field
            //参数1:域的名称,参数2:域的内容,参数3:是否存储
            Field fieldName = new TextField("name", fileName, Field.Store.YES);
            //Field fieldPath = new TextField("path", filePath, Field.Store.YES);
            Field fieldPath = new StoredField("path", filePath);
            Field fieldContent = new TextField("content", fileContent, Field.Store.YES)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值