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学习——创建和查询索引(代码篇)的更多相关文章

  1. lucene&solr学习——创建和查询索引(理论)

    1.Lucene基础 (1) 简介 Lucene是apache下的一个开放源代码的全文检索引擎工具包.提供完整的查询引擎和索引引擎:部分文本分析引擎. Lucene的目的是为软件开发人员提供一个简单易 ...

  2. lucene&solr学习——solr学习(二) Solr管理索引库

    1.什么是solrJ solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图: 依赖jar包: 2 ...

  3. lucene&solr学习——solr学习(一)

    1.什么是solr solr是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文检索服务器.Solr提供了比lucene风味丰富的查询语言,同时实现了可配置,可扩展,并对索 ...

  4. lucene&solr学习——索引维护

    1.索引库的维护 索引库删除 (1) 全删除 第一步:先对文档进行分析 public IndexWriter getIndexWriter() throws Exception { // 第一步:创建 ...

  5. lucene&solr学习——分词器

    下图是语汇单元的生成过程: 从一个Reader字符流开始,创建基于Reader的Tokenizer分词器,经过三个TokenFilter生成语汇单元Tokens. 要看分词器的分析效果,只需要看Tok ...

  6. 学习笔记:vue(代码篇)

    http://cn.vuejs.org/ VUE官网 http://cn.vuejs.org/v2/guide/  教程 VUE模板文件: <html lang="zh-cn" ...

  7. solr 学习片段

    全文检索技术——Solr 1 主要内容 1.站内搜索技术选型 2.什么是solr Solr和lucene的区别 3.solr服务器的安装及配置 Solr整合tomcat Solr的演示 4.维护索引 ...

  8. MongoDB索引(一) --- 入门篇:学习使用MongoDB数据库索引

    这个系列文章会分为两篇来写: 第一篇:入门篇,学习使用MongoDB数据库索引 第二篇:进阶篇,研究数据库索引原理--B/B+树的基本原理 1. 准备工作 在学习使用MongoDB数据库索引之前,有一 ...

  9. 《Lucene in Action》(第二版) 第一章节的学习总结 ---- 用最少的代码创建索引和搜索

    第一章节是介绍性质,但是通过这一章节的学习,我理解到如下概念: 1.Lucene由两部分组成:索引和搜索.索引是通过对原始数据的解析,形成索引的过程:而搜索则是针对用户输入的查找要求,从索引中找到匹配 ...

随机推荐

  1. 用jquery来实现正反选选择框checkbox的小示例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. gcc链接非标准(non-standard)命名库

    标准命名库: -lnamespace 标准链接库以lib开头, 并以so/a结尾. example gcc test.c -o test -L. -lhello 非标准命名库: -l:libname ...

  3. 如何优雅地进行错误处理(clean code阅读笔记之六)

    错误处理是十分必要的,但是如果对错误处理使用不当则会让代码变得十分臃肿,让阅读者看不清代码的逻辑,更严重的是,这也会让程序变得十分脆弱.本文中将列出一些使用错误处理的技巧,帮助你写出既简洁又健壮的代码 ...

  4. PHP常用数组操作方法汇总

    array_change_key_case -- 返回字符串键名全为小写或大写的数组array_chunk -- 将一个数组分割成多个array_combine -- 创建一个数组,用一个数组的值作为 ...

  5. PLC通信网络

    PLC通信网络的分层 PLC通信网络大致可分为3层,管理层,单元层以及现场执行(AS-I)层.如下图所示. 在PLC通信网络的三层架构中,管理层,通信方式包括MPI,工业以太网(Profinet)以及 ...

  6. Quartz使用及注意事项

    Quartz使用及注意事项 前提:目前由于公司业务决定,大量使用Quartz,每天固定的时间点执行相应的业务逻辑,,几十个时间点应该是有的,某一个时间点如果没有执行带来的问题是巨大的.Quartz的稳 ...

  7. PHP常用的一些数组操作总结

    1.array_values() :返回包含数组中所有键值的数组,不保留键名. 2.array_diff() 函数返回两个数组的差集数组.该数组包括了所有在被比较的数组中,但是不在任何其他参数数组中的 ...

  8. 3.storm-starter打包在storm集群上运行

    1.使用maven或者其他打包工具将storm-starter打成jar包 2.请将jar包用解压工具打开在根目录下找到defaults.yaml文件并将其删除不然到时会报有multiply defa ...

  9. GIS中的坐标系定义与转换

    GIS中的坐标系定义与转换 青岛海洋地质研究所 戴勤奋 2002-3-27 14:22:47 ----------------------------------------------------- ...

  10. wxpython,wx.EVT_ENTER_WINDOW

    这个例子是鼠标移入,button的label显示“Over Me”,但是我运行没有显示求怎么回事