1.索引库的维护

索引库删除

(1) 全删除

第一步:先对文档进行分析

    public IndexWriter getIndexWriter() throws Exception {
// 第一步:创建java工程,并导入jar包
// 第二步:创建一个indexwriter对象(创建索引)
//   1.指定索引库的存放位置Directory对象
Directory directory = FSDirectory.open(Paths.get("E:\\temp\\index")); //文件系统目录 file system directory
// Directory directory2 = new RAMDirectory();
//   2.指定一个分析器,对文档内容进行分析
Analyzer analyzer = new StandardAnalyzer();//官方推荐分词器
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
return indexWriter;
}

第二步:直接调用IndexWriter的deleteAll方法

@Test
public void testAllDelete() throws Exception {
IndexWriter indexWriter = getIndexWriter();
indexWriter.deleteAll();
indexWriter.close();
}

(2) 根据条件删除

第一步:与上面代码一样

第二步:使用IndexWriter的deleteDocuments方法,传入query条件

@Test
public void testDelete() throws Exception {
IndexWriter indexWriter = getIndexWriter();
Query query = new TermQuery(new Term("fileName", "apache"));
indexWriter.deleteDocuments(query);
indexWriter.close();
}

索引库修改

对索引库的修改,其实就是先删除,在添加。

第一步:同上

第二步:调用IndexWriter的updateDocument方法

//修改
@Test
public void testUpdate() throws Exception {
IndexWriter indexWriter = getIndexWriter();
Document doc = new Document();
doc.add(new TextField("fileN", "测试文件名", Store.YES));
doc.add(new TextField("fileC", "测试文件内容", Store.YES)); indexWriter.updateDocument(new Term("fileName", "spring"), doc);
indexWriter.close();
}

索引库查询所有

(1) 使用query的子类查询 (用对象查)

  (1.1) MatchAllDocsQuery

//IndexReader    IndexSearcher
public IndexSearcher getIndexSearcher() 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);
return indexSearcher;
} //执行查询结果
public void printResult(IndexSearcher indexSearcher, Query query) throws Exception {
// 第五步:执行查询。
TopDocs topDocs = indexSearcher.search(query, 10);
// 第六步:返回查询结果,遍历查询结果并输出
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("---------");
}
}
//查询所有
@Test
public void testMatchAllDocsQuery() throws Exception {
IndexSearcher indexSearcher = getIndexSearcher();
Query query = new MatchAllDocsQuery();
printResult(indexSearcher, query); //关闭资源
indexSearcher.getIndexReader().close(); }

  (1.2) TermQuery 精准查询,之前已经说过。

  (1.3) 根据数值范围查询 (注意:数值范围是否包括边界,使用的方法不一样).

  

//根据数值范围查询
/*
版本更新说明:
在lucene4.10中,关于数字范围的查询是使用的NumericRangerQuery
使用方式:
Query query = NumericRangerQuery.newFloatRange(域名,较小值,较大值,是否包含较小值,是否包含较大值)
在lucene6.6中(不知最早在什么版本,没有细查),NumericRangerQuery被legacyNumericRangerQuery替代
在lucene7中(应该是从7开始的),lucene开始使用PointValue来替代之前的Filed.而数字范围查询方法也进行了修改,
Float/Long/IntPoint.newRangeQuery取代了之前的NumericRangeQuery的newFloat/Long/IntRange
使用方法:
Query query = Float.newRangeQuery(域名,较小值,较大值);
而这种查询方法默认包含范围的端点值,即查询的是 较小值<=域名<=较大值
如果不想包含端点值:
1.不包含左端点值(即较小值):Query query = Float.newRangeQuery(域名,FloatPoint.nextUp(较小值),较大值);
2.不包含右端点值(即较大值):Query query = Float.newRangeQuery(域名,较小值,Float.nextDown(较大值));
3.均不包含:结合1和2即可
*/
@Test
public void testNumericRangeQuery() throws Exception {
IndexSearcher indexSearcher = getIndexSearcher();
Query query = LongPoint.newRangeQuery("fileSize", 47L, 200L);
printResult(indexSearcher, query); //关闭资源
indexSearcher.getIndexReader().close(); }

  (1.3) 组合查询条件

  

//可以组合查询条件
/*
1、MUST和MUST表示“与”的关系,即“交集”。
2、MUST和MUST_NOT前者包含后者不包含。
3、MUST_NOT和MUST_NOT没意义
4、SHOULD与MUST表示MUST,SHOULD失去意义;
5、SHOUlD与MUST_NOT相当于MUST与MUST_NOT。
6、SHOULD与SHOULD表示“或”的概念。 版本更新说明:
在lucene 4.10.3中,组合查询还有无参构造方法,可以通过下面这种方式实现组合查询: Query query = new BooleanQuery()
//添加查询条件,并指定该条件的判断级别
query.add(query1,Occur.MUST);
query.add(query2,Occur.MUST); 在lucene7.1中,组合查询只有一个有参构造方法,并没有无参构造方法.而是多了一个静态内部类Builder public static class Builder { private int minimumNumberShouldMatch;
private final List<BooleanClause> clauses = new ArrayList<>(); //大概是4.10.3中的BooleanQuery的无参构造
public Builder() {}
//设置最小需要匹配的数
public Builder setMinimumNumberShouldMatch(int min) {
this.minimumNumberShouldMatch = min;
return this;
} public Builder add(BooleanClause clause) {
if (clauses.size() >= maxClauseCount) {
throw new TooManyClauses();
}
clauses.add(clause);
return this;
}
//4.10.3中的BooleanQuery的add方法,支持链式编程(一般使用这个add方法)
public Builder add(Query query, Occur occur) {
return add(new BooleanClause(query, occur));
}
//返回一个BooleanQuery,用于构造Query
public BooleanQuery build() {
return new BooleanQuery(minimumNumberShouldMatch, clauses.toArray(new BooleanClause[0]));
}
} 7.1中,Occur.MUST等全都放到了BooleanClause中,所以,Occur.MUST等变成了BooleanClause.Occur.MUST等
所以在lucene中,组合查询的使用方法:
Query booleanQuery = new BooleanQuery.Builder().add(query1,BooleanClause.Occur.MUST).add(query2,Boolean.Occur.MUST).build();
*/
public void testBooleanQuery() throws Exception {
IndexSearcher indexSearcher = getIndexSearcher();
Query query1 = new TermQuery(new Term("fileName","lucene"));
Query query2 = new TermQuery(new Term("fileName","springmvc"));
//Occur有MUST, SHOULD, MUST_NOT, FILTER
BooleanQuery booleanQuery = new BooleanQuery.Builder().add(query1, Occur.MUST).add(query2, Occur.SHOULD).build();
printResult(indexSearcher, booleanQuery); //关闭资源
indexSearcher.getIndexReader().close(); }

(2) 使用queryparser查询 (用语法查)

  (2.1) 基础的语法查询,关键词查询:

  域名 + ":" + 搜索的关键字

//条件解析的对象查询
@Test
public void testQueryParser() throws Exception {
IndexSearcher indexSearcher = getIndexSearcher();
//参数1,默认查询的域
QueryParser queryParser = new QueryParser("fileName", new IKAnalyzer());
// "*:*" : 表示查询所有 "域:值"
Query query = queryParser.parse("springcloud is springmvc");
printResult(indexSearcher, query); }

  (2.2) 范围查询

  域名 + " :" + [最小值 TO 最大值]

  例如:size:[1 TO 100]

  范围查询在lucene中支持数值类型,不支持字符串类型。在solr中支持字符串类型。

  (2.3) 组合条件查询

    (2.3.1) +条件1+条件2:两个条件之间是并且的关系 and

    例如:+fileName:apache + content:apache

    (2.3.2) +条件1 条件2 :必须满足第一个条件,应该满足第二个条件

    例如:+filename:apache content:apache

    (2.3.3)条件1 条件2:两个条件满足其一即可

    例如:filename:apache content:apache

    (2.3.4) -条件1 条件2:必须不满足条件1,要满足条件2

    例如:-filename:apache content:apache

(3) 多个默认检索 MultiFieldQueryParser

//条件解析对象查询  多个默认域
@Test
public void testMultiFieldQueryParser() throws Exception {
IndexSearcher indexSearcher = getIndexSearcher();
//参数1,多个默认查询的域
String[] fields = {"fileName", "fileContent"};
//参数2,采用分词器
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields, new IKAnalyzer());
// "*:*" : 表示查询所有 "域:值"
Query query = queryParser.parse("apache is lucene");
printResult(indexSearcher, query); }

lucene&solr学习——索引维护的更多相关文章

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

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

  2. lucene&solr学习——创建和查询索引(代码篇)

    1. Lucene的下载 Lucene是开发全文检索功能的工具包,从官网下载Lucene4.10.3并解压. 官网:http://lucene.apache.org/ 版本:lucene7.7.0 ( ...

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

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

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

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

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

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

  6. Lucene 的 Field 域和索引维护

    一.Field 域 1.Field 属性 Field 是文档中的域,包括 Field 名和 Field 值两部分,一个文档可以包括多个 Field,Document 只是 Field 的一个承载体,F ...

  7. Solr学习笔记之3、Solr dataimport - 从SQLServer导入数据建立索引

    Solr学习笔记之3.Solr导入SQLServer数据建立索引 一.下载MSSQLServer的JDBC驱动 下载:Microsoft JDBC Driver 4.0 for SQL Server ...

  8. lucene实践 - 索引维护、多域查询、高亮显示

    之前的博客搜索栏用的是 sql 模糊查询进行查找,最近学完lucene,要学以致用啊,就把sql搜索给替换下来吧 中间遇到一些问题,也是学过程中没有提到的,所以说,还是实践出真知啊. lucene分开 ...

  9. Lucene&Solr框架之第二篇

    2.1.开发环境准备 2.1.1.数据库jar包 我们这里可以尝试着从数据库中采集数据,因此需要连接数据库,我们一直用MySQL,所以这里需要MySQL的jar包 2.1.2.MyBatis的jar包 ...

随机推荐

  1. nginx location 配置阐述优先级别使用说明

    使用nginx 有大半年了,它的高性能,稳定性表现很好. 这里也得到很多人的认可. 其中它的配置,有点像写程序一样,每行命令结尾一个";"号,语句块用"{}"括 ...

  2. 分支结构if……else

    语法: if(条件) 语句或语句块1 end else begin 语句或者语句块2 end 特点: . else并不一定是必须的. . 如否条件为真,将执行语句和语句块1,条件为假时执行语句或语句块 ...

  3. python中操作列表

    1.遍历列表 可以用for循环遍历打印非常实用 摸板: for 临时变量 in 列表 : print(临时变量) 注意缩进 , 注意冒号 2.创建数值列表 (1)使用range()函数 , 函数的范围 ...

  4. ireport 导出excel 分页 和 文本转数字格式的解决方法

    景:ireport 画excel 报表,导出时要求 数据分页,每页包含 标题和页脚 1.画excel 2.处理分页 首先建立一个变量totalNum 用于记录总共有多少条记录,注意设置属性为Integ ...

  5. C# 读写xml、excel、word、ppt、access

    C# 读写xml.excel.word.access 这里只是起个头,不做深入展开,方便以后用到参考 读写xml,主要使用.net  的xml下的document using System;using ...

  6. lua load

    load (chunk [, chunkname [, mode [, env]]]) 加载一个代码块. 如果 chunk 是一个字符串,代码块指这个字符串. 如果 chunk 是一个函数, load ...

  7. Linux 套接字编程 - TCP连接基础

    第五章的内容,实现一个echo服务器和对应的客户端,主要收获: 0. TCP socket编程主要基本步骤 1. SIGCHLD信号含义(子进程退出时向父进程发送,提醒父进程对其状态信息进行一个获取) ...

  8. 新手的grid布局

    html部分 <!DOCTYPE html><html><head><meta charset="utf-8"><link r ...

  9. sql注入一点小心得

    好久没写技术博客,最近研究产品关于用户体验方面较多,加上项目突然比较多,设计原型.跟进开发.设计师等工作着实没时间写博客. 接下来技术上主要php深入学习和mysql优化.这两天看了关于sql注入方面 ...

  10. css:改变滚动条样式

    以下亲测谷歌内核的浏览器有用,微软和火狐无效 body::-webkit-scrollbar {/*滚动条整体样式*/ width: 5px; /*高宽分别对应横竖滚动条的尺寸*/ height: 1 ...