Lucene入门(2) | 查询索引


查询索引也是搜索的过程。搜索就是用户输入关键字,从索引(index)中进行搜索的过程。根据关键字搜索索引,根据索引找到对应的文档,从而找到要搜索的内容(这里指磁盘上的文件)。

用户查询接口

全文检索系统提供用户搜索的界面供用户提交搜索的关键字,搜索完成展示搜索结果。

比如:
在这里插入图片描述
Lucene不提供制作用户搜索界面的功能,需要根据自己的需求开发搜索界面。

创建查询

用户输入查询关键字执行搜索之前需要先构建一个查询对象,查询对象中可以指定查询要搜索的Field文档域、查询关键字等,查询对象会生成具体的查询语法,比如:

语法 “fileName:spring.txt”表示要搜索Field域的内容为“spring.txt”的文档

语法 “lucene AND java” 表示要搜索即包括关键字“lucene”也包括“java”的文档。

执行查询

搜索索引过程:

1.根据查询语法在倒排索引词典表中分别找出对应搜索词的索引,从而找到索引所链接的文档链表。

比如搜索语法为“lucene AND java”表示搜索出的文档中即要包括lucene也要包括java。
在这里插入图片描述
2、由于是AND,所以要对包含lucene或java词语的链表进行交集,得到文档链表应该包括每一个搜索词语

3、获取文档中的Field域数据。

实现步骤

第一步:创建一个Directory对象,也就是索引库存放的位置。

第二步:创建一个indexReader对象,需要指定Directory对象。

第三步:创建一个indexsearcher对象,需要指定IndexReader对象

第四步:创建一个TermQuery对象,指定查询的域和查询的关键词。

第五步:执行查询。

第六步:返回查询结果。遍历查询结果并输出。

第七步:关闭IndexReader对象

IndexSearcher搜索方法
方法说明
indexSearcher.search(query, n)根据Query搜索,返回评分最高的n条记录
indexSearcher.search(query, filter, n)根据Query搜索,添加过滤策略,返回评分最高的n条记录
indexSearcher.search(query, n, sort)根据Query搜索,添加排序策略,返回评分最高的n条记录
indexSearcher.search(booleanQuery, filter, n, sort)根据Query搜索,添加过滤策略,添加排序策略,返回评分最高的n条记录
TopDocs

Lucene搜索结果可通过TopDocs遍历,TopDocs类提供了少量的属性,如下:

方法或属性说明
totalHits匹配搜索条件的总记录数
scoreDocs顶部匹配记录

注意:

Search方法需要指定匹配记录数量n:indexSearcher.search(query, n)

TopDocs.totalHits:是匹配索引库中所有记录的数量

TopDocs.scoreDocs:匹配相关度高的前边记录数组,scoreDocs的长度小于等于search方法指定的参数n


实操代码

1、新建一个class,名为searchLucene.java

代码实现

package com.hadoop.Lucene;

import java.io.IOException;
import java.nio.file.Paths;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.junit.Test;

public class searchLucene {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
	}
	
	@Test
	public void searchIndex() throws IOException
	{
		//指定索引库路径  D:\\Program\\Java\\index\\docuindex
		String path = "D:\\Program\\Java\\index\\docuindex";
		Directory directory = FSDirectory.open(Paths.get(path));
		
		//创建indexReader对象来读索引库index
		IndexReader indexReader = DirectoryReader.open(directory);
		//创建indexSearcher对象准备进行查询
		IndexSearcher indexSearcher = new IndexSearcher(indexReader);
		
		//创建查询,第一个""是指查询对象(文件名,文件内容等),第二个""是指查询的内容
		Query query = new TermQuery(new Term("filename", "1"));
		//执行查询
		//第一个参数是查询对象,第二个参数是查询结果返回的最大值
		TopDocs topDocs = indexSearcher.search(query, 10);
		//查询结果的总条数
		System.out.println("查询结果的总条数:"+ topDocs.totalHits);
		
		//遍历查询结果
		//topDocs.scoreDocs存储了document对象的id
		for (ScoreDoc scoreDoc : topDocs.scoreDocs) 
		{
			//scoreDoc.doc属性就是document对象的id
			//根据document的id找到document对象
			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对象
		indexReader.close();
	}
}

得到的结果:

Query query = new TermQuery(new Term("filename", "1"));
在这里插入图片描述
Query query = new TermQuery(new Term("content", "field"));
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值