Lucene索引库查询(详细)

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

 

公共代码提取,以下例子会用到该方法:

//公共代码提取——获得IndexSearcher对象
public IndexSearcher getIndexSearcher() throws IOException {
	//第一步:创建一个Directory对象,也就是索引库存放的位置。
	Directory directory = FSDirectory.open(new File("E:\\eclipse-workspace\\ww_19lucene&solr\\index"));
	//第二步:创建一个indexReader对象,需要指定Directory对象。
	IndexReader indexReader = DirectoryReader.open(directory);
	//第三步:创建一个indexsearcher对象,需要指定IndexReader对象
	return new IndexSearcher(indexReader);
	}
	
//公共代码提取——输出查询到的document
public void printResult(Query query,IndexSearcher indexSearcher) throws IOException {
	TopDocs topDocs = indexSearcher.search(query, 10);
	System.out.println("查询结果总条数:"+topDocs.totalHits);
	//第六步:返回查询结果。遍历查询结果并输出。
	for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
		//获得document的id
		int doc = scoreDoc.doc;
		//根据documentId获得document
		Document document = indexSearcher.doc(doc);
		//输出文件信息:文件名、文件大小、文件路径、文件内容
		System.out.println(document.get("fileName"));
		System.out.println(document.get("filePath"));
		System.out.println(document.get("fileSize"));
		System.out.println(document.get("fileContent"));
		System.out.println("-------------------------------------");
	}
}

1、使用query子类查询

(1)MatchAllDocsQuery

查询索引库中的所有document

@Test
public void testMatchAllDocsQuery() throws IOException {
	IndexSearcher indexSearcher = getIndexSearcher();
	Query query = new MatchAllDocsQuery();
	printResult(query, indexSearcher);
	indexSearcher.getIndexReader().close();
}

2TermQuery

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

@Test
public void testTermQuery() throws IOException {
	IndexSearcher indexSearcher = getIndexSearcher();
	Query query = new TermQuery(new Term("fileName", "apache"));
	printResult(query, indexSearcher);
	indexSearcher.getIndexReader().close();
}

3NumericRangeQuery

根据数值返回查询

@Test
public void testNumericRangeQuery() throws IOException {
	IndexSearcher indexSearcher = getIndexSearcher();
	Query query = NumericRangeQuery.newLongRange("fileSize", 0L, 200L, true, true);
	printResult(query, indexSearcher);
	indexSearcher.getIndexReader().close();
}

4BooleanQuery

组合条件查询

@Test
public void testBooleanQuery() throws IOException {
	IndexSearcher indexSearcher = getIndexSearcher();
		
	BooleanQuery query = new BooleanQuery();
     //后两个boolean表示是否包含左右边界值
	Query query1 = NumericRangeQuery.newLongRange("fileSize", 0L, 200L, true, true);
	Query query2 = new TermQuery(new Term("fileName", "apache"));
	query.add(query1,Occur.SHOULD);
	query.add(query2,Occur.MUST);
		
	printResult(query, indexSearcher);
	indexSearcher.getIndexReader().close();
}

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

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

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

2、

2、使用queryparser查询

使用需要添加jar包

(1)QueryParser

@Test
public void testQueryParser() throws Exception {
	IndexSearcher indexSearcher = getIndexSearcher();
		
	//第一个参数设置默认field
	QueryParser queryParser = new QueryParser("fileName", new IKAnalyzer());
	//Query query = queryParser.parse("fileName:lucene");
	//空格相当于or
	//Query query = queryParser.parse("fileName:lucene fileName:apache");
	//+相当于Must,没有符号表示条件可有可无
	//Query query = queryParser.parse("fileName:lucene +fileName:apache");
	//相当于and
	//Query query = queryParser.parse("+fileName:lucene +fileName:apache");
		
	//and、not、or必须大写
	//Query query = queryParser.parse("fileName:lucene AND fileName:apache");
	Query query = queryParser.parse("NOT fileName:lucene AND fileName:apache");
	//Query query = queryParser.parse("fileName:lucene OR fileName:apache");
		
		
	printResult(query, indexSearcher);
	indexSearcher.getIndexReader().close();
}

语法:

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

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

例如:content:java

  1. 范围查询

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

例如:size:[1 TO 1000]

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

  1. 组合条件查询

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

例如:+filename:apache +content:apache

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

例如:+filename:apache content:apache

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

例如:filename:apache content:apache

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

例如:-filename:apache content:apache

Occur.MUST 查询条件必须满足,相当于and

+(加号)

Occur.SHOULD 查询条件可选,相当于or

 

空(不用符号)

Occur.MUST_NOT 查询条件不能满足,相当于not非

-(减号)

 

第二种写法:

条件1 AND 条件2

条件1 OR 条件2

条件1 NOT 条件2

(2)MultiFieldQueryParser

可以指定多个默认搜索域

@Test
public void testMultiFiledQueryParser() throws Exception {
	IndexSearcher indexSearcher = getIndexSearcher();
		
	String[] fields = {"fileName","fileContent"};
	QueryParser queryParser = new MultiFieldQueryParser(fields, new IKAnalyzer());
	Query query = queryParser.parse("lucene AND apache");
		
		
	printResult(query, indexSearcher);
	indexSearcher.getIndexReader().close();
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值