一.使用Query的子类进行查询
1.查询方式的种类
(1)TermQuery
根据关键词进行查询。
查询条件:需要指定要查询的域和要查询的关键词。
(2)RangeQuery
根据文档属性的大小范围进行查询。
查询条件:需要指定要查询的域和最小值和最大值。
2.范例
(1)代码块
import org.apache.lucene.document.Document;
import org.apache.lucene.document.LongPoint;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import java.io.File;
public class SearchIndex {
public static void main(String[] args) throws Exception {
SearchIndex searchIndex = new SearchIndex();
searchIndex.rangeQuery();
}
/**
* 范围查询
*/
public void rangeQuery()throws Exception{
//1.创建一个Director对象,基于Director对象创建一个IndexWriter对象。
// 指定索引库的位置。F:\temp\index
IndexReader indexReader = DirectoryReader.open(FSDirectory.open(
new File("F:\\temp\\index").toPath()));
//2.创建一个IndexSearcher对象,构造方法参数中的参数IndexReader对象。
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//3.创建一个Query查询对象
//参数一:要查询的域名,参数二:最小值【需要带上单位】,参数三:最大值【需要带上单位】。
Query query = LongPoint.newRangeQuery("size", 0l, 100l);
//4.执行查询
TopDocs topDocs = indexSearcher.search(query, 10);
// 5.取出查询结果的总记录数。
System.out.println("查询总记录数:" + topDocs.totalHits);
// 6.取文档列表。
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
// 7.打印文档中的内容。
for(ScoreDoc doc : scoreDocs){
//取出文档id
int docId = doc.doc;
//根据id取出文档对象
Document document = indexSearcher.doc(docId);
//从文档对象获取文档属性
System.out.println(document.get("name"));
System.out.println(document.get("path"));
// System.out.println(document.get("content"));
System.out.println(document.get("size"));
System.out.println("-----华丽的分隔符-----");
}
// 8.关闭IndexReader对象
indexReader.close();
}
public void searchIndex()throws Exception{
// 1.创建一个Director对象,指定索引库的位置。
Directory directory = FSDirectory.open(new File("F:\\temp\\index").toPath());
// 2.创建一个IndexReader对象。
IndexReader indexReader = DirectoryReader.open(directory);
// 3.创建一个IndexSearcher对象,构造方法参数中的参数IndexReader对象。
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
// 4.创建一个Query对象。TermQuery。
// 参数一指的是关键词所在的域,参数二指的是要查询的关键词
Query query = new TermQuery(new Term("name","spring"));
// 5.执行查询,得到一个TopDocs对象。
//参数一:查询对象,参数二:查询结果最大记录数
TopDocs topDocs = indexSearcher.search(query, 10);
// 6.取出查询结果的总记录数。
System.out.println("查询总记录数:" + topDocs.totalHits);
// 7.取文档列表。
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
// 8.打印文档中的内容。
for(ScoreDoc doc : scoreDocs){
//取出文档id
int docId = doc.doc;
//根据id取出文档对象
Document document = indexSearcher.doc(docId);
//从文档对象获取文档属性
System.out.println(document.get("name"));
System.out.println(document.get("path"));
// System.out.println(document.get("content"));
System.out.println(document.get("size"));
System.out.println("-----华丽的分隔符-----");
}
// 9.关闭IndexReader对象
indexReader.close();
}
}
(2)范例
二.使用QueryParser进行查询
可以对要查询的内容先分词,然后基于分词的结果进行查询。
1.步骤
0.导入lucene-queryparser-7.4.0.jar
1.创建一个Director对象,基于Director对象创建一个IndexWriter对象。
指定索引库的位置。F:\temp\index
2.创建一个IndexSearcher对象,构造方法参数中的参数IndexReader对象。
3.创建一个QueryParser对象
参数一:默认搜索域,参数二:分析器对象
4.使用QueryParser对象创建一个Query对象
5.执行查询
6.取出查询结果的总记录数。
7.取文档列表。
8.打印文档中的内容。
9.关闭IndexReader对象