lucene--7.索引维护之查询

1      概述

1.1    查询对象

         对要搜索的信息创建Query查询对象,Lucene会根据Query查询对象生成最终的查询语法,类似关系数据库Sql语法一样Lucene也有自己的查询语法,比如:“name:lucene”表示查询Field的name为“lucene”的文档信息。

         可通过两种方法创建查询对象:

         1)使用Lucene提供Query子类

         Query是一个抽象类,lucene提供了很多查询对象,比如TermQuery项精确查询,NumericRangeQuery数字范围查询等。

         如下代码:

    Query query = new TermQuery(new Term("name", "lucene"));

 

         2)使用QueryParse解析查询表达式

         QueryParse会将用户输入的查询表达式解析成Query对象实例。

         如下代码:

         QueryParser queryParser = new QueryParser("name", new IKAnalyzer());

       Query query =queryParser.parse("name:lucene");

 

1.2    公共类抽取

//IndexReader  IndexSearcher
public IndexSearcher getIndexSearcher() throws Exception{
   // 第一步:创建一个Directory对象,也就是索引库存放的位置。
   Directory directory = FSDirectory.open(new File("F:\\lucene\\index"));// 磁盘
   // 第二步:创建一个indexReader对象,需要指定Directory对象。
   IndexReader indexReader = DirectoryReader.open(directory);
   // 第三步:创建一个indexsearcher对象,需要指定IndexReader对象
   return new IndexSearcher(indexReader);
}
//执行查询的结果
public void printResult(IndexSearcher indexSearcher,Queryquery)throws Exception{
   // 第五步:执行查询。
   TopDocs topDocs = indexSearcher.search(query, 10);
   // 第六步:返回查询结果。遍历查询结果并输出。
   ScoreDoc[] scoreDocs = topDocs.scoreDocs;
   for (ScoreDocscoreDoc : 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("------------");
   }
}

2      Api使用(二选一)

2.1    使用query的子类查询

2.1.1  MatchAllDocsQuery(查询所有)

使用MatchAllDocsQuery查询索引目录中的所有文档

//查询所有
@Test
public void testMatchAllDocsQuery() throws Exception{
   IndexSearcher indexSearcher =getIndexSearcher();
   Query query = new MatchAllDocsQuery();
   System.out.println(query);
   printResult(indexSearcher, query);
   //关闭资源
   indexSearcher.getIndexReader().close();
}

2.1.2  TermQuery(条件查询/项查询)

TermQuery,通过项查询,TermQuery不使用分析器所以建议匹配不分词的Field域查询,比如订单号、分类ID号等。

指定要查询的域和要查询的关键词。

//使用Termquery查询
	@Test
	public void testTermQuery() throws Exception {
		IndexSearcher indexSearcher = getIndexSearcher();
		//创建查询对象
		Query query = new TermQuery(new Term("content", "lucene"));
		//执行查询
		TopDocs topDocs = indexSearcher.search(query, 10);
		//共查询到的document个数
		System.out.println("查询结果总数量:" + topDocs.totalHits);
		//遍历查询结果
		for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
			Document document = indexSearcher.doc(scoreDoc.doc);
			System.out.println(document.get("filename"));
			//System.out.println(document.get("content"));
			System.out.println(document.get("path"));
			System.out.println(document.get("size"));
		}
		//关闭indexreader
		indexSearcher.getIndexReader().close();
	} 

2.1.3         NumericRangeQuery(根据数值范围查询)

可以根据数值范围查询。//参数:1.域名 2.最小值 3.最大值 4.是否包含最小值 5.是否包含最大值

 

//根据数值范围查询
@Test
public void testNumericRangeQuery() throws Exception{
   IndexSearcher indexSearcher =getIndexSearcher();
   
   Query query = NumericRangeQuery.newLongRange("fileSize", 47L, 200L, false, true);
   System.out.println(query);
   printResult(indexSearcher, query);
   //关闭资源
   indexSearcher.getIndexReader().close();
} 

2.1.4  BooleanQuery(组合查询)

可以组合查询条件。

//可以组合查询条件
@Test
public void testBooleanQuery() throws Exception{
   IndexSearcher indexSearcher =getIndexSearcher();
   //创建一个布尔查询对象
   BooleanQuery booleanQuery = new BooleanQuery();
   //创建第一个查询条件
   Query query1 = new TermQuery(new Term("fileName","apache"));
   Query query2 = new TermQuery(newTerm("fileName","lucene"));
   //  select * fromuser where id =1 or name = 'safdsa'
   //组合查询条件
   booleanQuery.add(query1, Occur.MUST);
   booleanQuery.add(query2, Occur.SHOULD);
   System.out.println(booleanQuery);
   printResult(indexSearcher,booleanQuery);//执行查询
   //关闭资源
   indexSearcher.getIndexReader().close();
}

Occur.MUST:必须满足此条件,相当于and

Occur.SHOULD:应该满足,但是不满足也可以,相当于or

Occur.MUST_NOT:必须不满足。相当于not 

2.2    使用queryparser查询

2.2.1  概念

通过QueryParser也可以创建Query,QueryParser提供一个Parse方法,此方法可以直接根据查询语法来查询。Query对象执行的查询语法可通过System.out.println(query);查询。

需要使用到分析器。建议创建索引时使用的分析器和查询索引时使用的分析器要一致。

需要加入queryParser依赖的jar包。


2.2.2  程序实现

//条件解释的对象查询
@Test
public void testQueryParser() throws Exception{
   IndexSearcher indexSearcher =getIndexSearcher();
   //创建queryparser对象
   //参数1: 默认查询的域  
   //参数2:采用的分析器
   QueryParser queryParser = new QueryParser("fileName",newIKAnalyzer());
   // *:*   域:值
   Query query = queryParser.parse("fileName:lucene is apache ORfileContent:lucene is apache");
   
   printResult(indexSearcher, query);
   //关闭资源
   indexSearcher.getIndexReader().close();
} 

2.2.3  查询语法

1、基础的查询语法,关键词查询:

域名+“:”+搜索的关键字

例如:content:java

2、范围查询

域名+“:”+[最小值 TO 最大值]

例如:size:[1 TO 1000]

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

3、组合条件查询

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

例如:+filename:apache+content:apache

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

例如:+filename:apache content:apache

3)条件1 条件2:两个条件满足其一即可。

例如:filename:apachecontent:apache

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

例如:-filename:apachecontent:apache

 

第二种写法:

条件1 AND 条件2

条件1 OR 条件2

条件1 NOT 条件2

 

2.2.4  MultiFieldQueryParser

可以指定多个默认搜索域

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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: lucene-core-4.9.0.jar是Lucene索引擎的核心文件,它是一个用Java语言编写的开源软件,主要用于实现全文搜索和索引功能。 Lucene是一个高性能的全文搜索引,它提供了一系列用于创建、更新和查询索引的API。对于需要在大量文本数据中进行快速和准确搜索的应用程序来说,Lucene是一个非常好的选择。 核心文件lucene-core-4.9.0.jar包含了Lucene索引擎的所有核心功能,包括索引的创建和管理、搜索查询的执行、搜索结果的排序和过滤等。通过引入该文件,开发人员可以在自己的应用程序中使用Lucene提供的功能来实现文本数据的全文索引和搜索。 在使用Lucene时,开发人员可以根据自己的需要,使用lucene-core-4.9.0.jar的API来创建索引,将文档进行分词、过滤和标准化处理,然后将处理后的文档添加到索引中。当需要进行搜索时,可以使用Lucene提供的查询语法和查询API,对索引中的文档进行高效的全文搜索。 除了lucene-core-4.9.0.jar之外,Lucene还提供了其他一些相关的jar文件,例如lucene-analyzers-common.jar和lucene-queryparser.jar等,它们可以用于分析和处理文本数据,以及解析查询语法。通过组合使用这些文件,开发人员可以更灵活地构建自己的全文搜索应用程序。 总之,lucene-core-4.9.0.jar是Lucene索引擎的核心文件,它提供了一系列用于创建、更新和查询文本数据索引的API,为开发人员提供了实现全文搜索功能的便利。 ### 回答2: lucene-core-4.9.0.jar是Lucene项目的核心,它是用Java编写的全文搜索引Lucene是一个开源项目,旨在提供一个强大且高效的搜索引擎,用于构建各种应用程序,如网站搜索,文本分析和信息检索等。 lucene-core-4.9.0.jar提供了许多关键的功能和类,包括索引创建和管理,查询解析和执行,文本分析和词法处理等。通过使用这个,开发人员可以轻松地构建自己的搜索应用程序,并实现快速和准确的搜索功能。 在Lucene的使用过程中,开发人员可以通过创建索引来处理需要搜索的文档集合。索引是一个用于快速查找和检索文档的数据结构,它包含了文档中的关键词、位置和其他重要信息。lucene-core-4.9.0.jar提供了一些类来帮助创建和维护索引,在搜索时可以快速定位相关文档。 另外,lucene-core-4.9.0.jar还提供了丰富的查询语法和API,以便开发人员可以根据特定的需求构建和执行复杂的查询。这些查询可以包括布尔逻辑、过滤器、范围查询和模糊匹配等多种形式。通过使用Lucene查询功能,用户可以快速找到符合其需求的相关文档。 总之,lucene-core-4.9.0.jar是Lucene项目的核心,提供了全文搜索引擎的关键功能和类。它可以帮助开发人员构建强大的搜索应用程序,实现快速和准确的搜索功能。 ### 回答3: lucene-core-4.9.0.jar 是一个用于构建搜索引擎的JavaLucene是一个开源的全文搜索引擎工具包,它提供了用于索引和搜索文本的功能。 lucene-core-4.9.0.jar 是Lucene的核心组件,用于实现基本的搜索和索引功能。它包含了索引文档和搜索相关内容所需的所有必要类和方法。这个.jar文件是由Lucene 4.9.0版本的源代码编译而成的。 使用 lucene-core-4.9.0.jar,我们可以很方便地在自己的应用程序中实现搜索功能。首先,我们需要构建一个索引,将要搜索的文本内容进行索引化。然后,我们可以使用 Lucene 提供的 API 进行搜索操作,通过关键字或特定的查询语句来搜索索引中的内容。Lucene 提供了丰富的查询语法和搜索算法,可以根据需求进行高级的搜索操作,如模糊搜索、排序、过滤等。 通过使用 lucene-core-4.9.0.jar,我们可以为我们的应用程序添加强大的搜索能力,无论是搜索文件、数据、网站内容或是其他结构化的数据。Lucene 已经在众多应用中得到了广泛的应用,包括网站搜索引擎、文档管理系统、电子邮件客户端等。 总之,lucene-core-4.9.0.jar 是一个功能强大且灵活的Java,可以帮助开发人员快速构建搜索引擎和实现全文搜索功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值