lucene&solr学习——创建和查询索引(代码篇)
1. Lucene的下载
Lucene是开发全文检索功能的工具包,从官网下载Lucene4.10.3并解压。
官网:http://lucene.apache.org/
版本:lucene7.7.0 (学习上没必要最新的,因为企业中也不会升级太快)
Jdk要求:1.7以上
2.使用的jar包
核心包

其他:

3. 创建索引库
(1) 实现步骤 (程序的编写步骤与之前分析的理论步骤是颠倒过来的)
第一步:创建java工程,并导入jar包
第二步:创建一个indexwriter对象(创建索引)
1.指定索引库的存放位置Directory对象
2.指定一个分析器,对文档内容进行分析
第三步:创建document对象 (构建文档对象)
第四步:创建field对象,将field添加到document
第五步:使用indexwriter对象将document对象写到索引库,此过程进行索引创建。并将索引和document对象写入索引库。
第六步:关闭IndexWriter对象
(2) Field域的属性
是否分析:是否对域的内容进行分词处理。前提是我们要对域的内容进行查询。
是否索引:将Field分析后的词或整个Field值进行索引,只有索引方可搜索到。
比如:商品名称,商品简介分析后进行索引,订单号,身份证号不用分析但也要索引,这些将来都要作为查询条件
是否存储:将Field值存储在文档中,存储在文档中的Field才可以从Document中获取。
比如:商品名称,订单号,凡是将来要从Document中获取的Field都要存储
是否存储的标准:是否将内容展示给用户

测试代码:
将下面的文件,创建成索引

代码:
public class FirstLucene {
@Test
public void textIndex() throws Exception {
// 第一步:创建java工程,并导入jar包
// 第二步:创建一个indexwriter对象(创建索引)
// 1.指定索引库的存放位置Directory对象
Directory directory = FSDirectory.open(Paths.get("E:\\temp\\index")); //文件系统目录 file system directory
// 2.指定一个分析器,对文档内容进行分析
Analyzer analyzer = new StandardAnalyzer();//官方推荐分词器
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
File f = new File("E:\\searchSource");
File[] listFiles = f.listFiles();
for (File file : listFiles) {
// 第三步:创建document对象 (构建文档对象)
Document document = new Document();
// 第四步:创建field对象,将field添加到document
//文件名称
String file_name = file.getName();
Field fieldNameField = new TextField("fileName", file_name, Store.YES);
//文件大小
long file_size = FileUtils.sizeOf(file);
Field fileSizeField = new LongPoint("fileSize", file_size);
Field fileSizeFieldStore = new StoredField("fileSize", file_size);
//文件路径
String file_path = file.getPath();
Field filePathField = new StoredField("filePath", file_path);
//文件内容
String file_content = FileUtils.readFileToString(file);
Field fileContentField = new TextField("fileContent", file_content, Store.NO);
document.add(fieldNameField);
document.add(fileSizeField);
document.add(fileSizeFieldStore);
document.add(filePathField);
document.add(fileContentField);
// 第五步:使用indexwriter对象将document对象写到索引库,此过程进行索引创建。并将索引和document对象写入索引库。
indexWriter.addDocument(document);
}
// 第六步:关闭IndexWriter对象
indexWriter.close();
}
}
结果:

4.查询索引
(1) 实现步骤:
第一步:创建一个Directory对象,也就是索引库存放的位置
第二步:创建一个indexReader对象,需要制定Directory对象
第三步:创建一个indexsearcher对象,需要指定IndexReader对象
第四步:创建一个TermQuery对象,制定查询的域和查询的关键词
第五步:执行查询。
第六步:返回查询结果,便利查询结果并输出
第七步:关闭IndexReader对象。
(2) IndexSearcher搜索方法

代码:
@Test
public void testSearch() throws Exception {
// 第一步:创建一个Directory对象,也就是索引库存放的位置
Directory directory = FSDirectory.open(Paths.get("E:\\temp\\index"));
// 第二步:创建一个indexReader对象,需要指定Directory对象
IndexReader indexReader =DirectoryReader.open(directory);
// 第三步:创建一个indexsearcher对象,需要指定IndexReader对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
// 第四步:创建一个TermQuery对象,制定查询的域和查询的关键词
Query query = new TermQuery(new Term("fileName", "spring"));
// 第五步:执行查询。
TopDocs topDocs = indexSearcher.search(query, 2);
// 第六步:返回查询结果,遍历查询结果并输出
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
int doc = scoreDoc.doc;
Document document = indexSearcher.doc(doc);
//文件名称
String fileName = document.get("fileName");
System.out.println(fileName);
//文件内容
String fileContent = document.get("fileContent");
System.out.println(fileContent);
//文件路径
String fileSize = document.get("fileSize");
System.out.println(fileSize);
//文件大小
String filePath = document.get("filePath");
System.out.println(filePath);
System.out.println("---------");
}
// 第七步:关闭IndexReader对象。
indexReader.close();
}
结果:

lucene&solr学习——创建和查询索引(代码篇)的更多相关文章
- lucene&solr学习——创建和查询索引(理论)
1.Lucene基础 (1) 简介 Lucene是apache下的一个开放源代码的全文检索引擎工具包.提供完整的查询引擎和索引引擎:部分文本分析引擎. Lucene的目的是为软件开发人员提供一个简单易 ...
- lucene&solr学习——solr学习(二) Solr管理索引库
1.什么是solrJ solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图: 依赖jar包: 2 ...
- lucene&solr学习——solr学习(一)
1.什么是solr solr是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文检索服务器.Solr提供了比lucene风味丰富的查询语言,同时实现了可配置,可扩展,并对索 ...
- lucene&solr学习——索引维护
1.索引库的维护 索引库删除 (1) 全删除 第一步:先对文档进行分析 public IndexWriter getIndexWriter() throws Exception { // 第一步:创建 ...
- lucene&solr学习——分词器
下图是语汇单元的生成过程: 从一个Reader字符流开始,创建基于Reader的Tokenizer分词器,经过三个TokenFilter生成语汇单元Tokens. 要看分词器的分析效果,只需要看Tok ...
- 学习笔记:vue(代码篇)
http://cn.vuejs.org/ VUE官网 http://cn.vuejs.org/v2/guide/ 教程 VUE模板文件: <html lang="zh-cn" ...
- solr 学习片段
全文检索技术——Solr 1 主要内容 1.站内搜索技术选型 2.什么是solr Solr和lucene的区别 3.solr服务器的安装及配置 Solr整合tomcat Solr的演示 4.维护索引 ...
- MongoDB索引(一) --- 入门篇:学习使用MongoDB数据库索引
这个系列文章会分为两篇来写: 第一篇:入门篇,学习使用MongoDB数据库索引 第二篇:进阶篇,研究数据库索引原理--B/B+树的基本原理 1. 准备工作 在学习使用MongoDB数据库索引之前,有一 ...
- 《Lucene in Action》(第二版) 第一章节的学习总结 ---- 用最少的代码创建索引和搜索
第一章节是介绍性质,但是通过这一章节的学习,我理解到如下概念: 1.Lucene由两部分组成:索引和搜索.索引是通过对原始数据的解析,形成索引的过程:而搜索则是针对用户输入的查找要求,从索引中找到匹配 ...
随机推荐
- springboot整合activeMq 跳坑
安装 activeMq 安装请看我的另一篇https://www.cnblogs.com/milicool/p/8420926.html 版本 springboot 2.0.5.RELEASE 项目结 ...
- oracle 报错:ORA-02019 未找到数据库的连接说明
一.问题描述 我之前连的是别的数据库,现在更换了数据库的连接,然后就报了如下的错误: 我使用的是NHibernate,我找到映射文件后发现我用了dblink,代码中table="COM_OR ...
- mysql 查两个表相同的值
比如一个数据库 表A和表B 都有一个username字段, 现查出与表A中username值相同的表B的username和password数据 select B.username,B.password ...
- Linux 启动SVN服务
#使用默认端口3690启动svn服务svnserve -d -r /home/svndata # 如果出现#svnserve: Can't bind server socket: Address al ...
- java实例初始化块
实例初始化程序块用于初始化实例数据成员. 它在每次创建类的对象时运行.实例变量的初始化可以是直接的,但是可以在初始化实例初始化块中的实例变量时执行额外的操作. 什么是实例初始化块的使用,我们可以直接分 ...
- c++ sizeof对象大小整理
1. sizeof 是运算符,而不是函数. 2. 当sizeof 的对象是表达式时,求的大小是表达式返回值的类型大小,但并不计算表达式的值,比如: ; ; cout << sizeof(c ...
- 2018.10.23NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 50 + (10 \sim 50)\) 实际得分:\(100 + 10 + 50\) 这可能是我打的最懵逼的一场考试没有之一.. T1两个小时才做出来也是醉了. T ...
- 阿里云 linux 系统的架构
简单说,/lib是内核级的,/usr/lib是系统级的,/usr/local/lib是用户级的. /lib/ — 包含许多被 /bin/ 和 /sbin/ 中的程序使用的库文件.目录 /usr/lib ...
- HTML字符实体名称/实体编号
字符实体对英文的大小写敏感! 字符实体一: 显示结果 描述 实体名称 实体编号 空格 < 小于号 < < > 大于号 > > & 和号 & ...
- Java设计模式—访问者模式
原文地址:http://www.cnblogs.com/java-my-life/archive/2012/06/14/2545381.html 总结的太棒啦,导致自己看了都不想总结了...... 在 ...