系统学习Lucene全文检索技术(五)

一、Lucene高级搜索

1、文本搜索

(1)

QueryParser支持默认搜索域, 第一个参数为默认搜索域.
如果在执行parse方法的时候, 查询语法中包含域名则从指定的这个域名中搜索, 如果只有查询的关键字,
则从默认搜索域中搜索结果.
需求描述 : 查询名称中包含华为手机关键字的结果.

(2)

@Test
public void testIndexSearch() throws Exception {
// 1. 创建Query搜索对象
// 创建分词器
Analyzer analyzer = new IKAnalyzer();
// 创建搜索解析器,第一个参数:默认Field域,第二个参数:分词器
QueryParser queryParser = new QueryParser("brandName", analyzer);
// 创建搜索对象
Query query = queryParser.parse("name:华为手机");
// 2. 创建Directory流对象,声明索引库位置
Directory directory = FSDirectory.open(Paths.get("E:\\dir"));
// 3. 创建索引读取对象IndexReader
IndexReader reader = DirectoryReader.open(directory);
// 4. 创建索引搜索对象
IndexSearcher searcher = new IndexSearcher(reader);
// 5. 使用索引搜索对象,执行搜索,返回结果集TopDocs
// 第一个参数:搜索对象,第二个参数:返回的数据条数,指定查询结果最顶部的n条数据返回
TopDocs topDocs = searcher.search(query, 50);
System.out.println("查询到的数据总条数是:" + topDocs.totalHits);
// 获取查询结果集
ScoreDoc[] docs = topDocs.scoreDocs;
// 6. 解析结果集
for (ScoreDoc scoreDoc : docs) {
// 获取文档
int docID = scoreDoc.doc;
Document doc = searcher.doc(docID);
System.out.println("=============================");
System.out.println("docID:" + docID);
System.out.println("id:" + doc.get("id"));
System.out.println("name:" + doc.get("name"));
System.out.println("price:" + doc.get("price"));
System.out.println("brandName:" + doc.get("brandName"));
System.out.println("image:" + doc.get("image"));
}
// 7. 释放资源
reader.close();
}

 

2、数值范围搜索

(1)

需求描述 : 查询价格大于等于100, 小于等于1000的商品

(2)

@Test
Query query = FloatPoint.newRangeQuery("price", 100, 1000);
// 2. 创建Directory流对象,声明索引库位置
Directory directory = FSDirectory.open(Paths.get("E:\\dir"));
// 3. 创建索引读取对象IndexReader
IndexReader reader = DirectoryReader.open(directory);
// 4. 创建索引搜索对象
IndexSearcher searcher = new IndexSearcher(reader);
// 5. 使用索引搜索对象,执行搜索,返回结果集TopDocs
// 第一个参数:搜索对象,第二个参数:返回的数据条数,指定查询结果最顶部的n条数据返回
TopDocs topDocs = searcher.search(query, 10);
System.out.println("查询到的数据总条数是:" + topDocs.totalHits);
// 获取查询结果集
ScoreDoc[] docs = topDocs.scoreDocs;
// 6. 解析结果集
for (ScoreDoc scoreDoc : docs) {
// 获取文档
int docID = scoreDoc.doc;
Document doc = searcher.doc(docID);
System.out.println("=============================");
System.out.println("docID:" + docID);
System.out.println("id:" + doc.get("id"));
System.out.println("name:" + doc.get("name"));
System.out.println("price:" + doc.get("price"));
System.out.println("brandName:" + doc.get("brandName"));
System.out.println("image:" + doc.get("image"));
}
// 7. 释放资源
reader.close();
}

 

3、组合搜索

(1)

需求描述 : 查询价格大于等于100, 小于等于1000, 并且名称中不包含华为手机关键字的商品
BooleanClause.Occur.MUST 必须 相当于and, 并且
BooleanClause.Occur.MUST_NOT 不必须 相当于not, 非
BooleanClause.Occur.SHOULD 应该 相当于or, 或者
注意 : 如果逻辑条件中, 只有MUST_NOT, 或者多个逻辑条件都是MUST_NOT, 无效, 查询不出任何数据.

(2)

@Test
public void testBooleanSearch() throws Exception {
// 创建分词器
Analyzer analyzer = new IKAnalyzer();
// 创建数值范围搜索对象
Query query1 = FloatPoint.newRangeQuery("price", 100, 1000);

QueryParser queryParser = new QueryParser("name", analyzer);
// 创建搜索对象
Query query2 = queryParser.parse("华为手机");
//创建组合搜索对象
BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.add(new BooleanClause(query1, BooleanClause.Occur.MUST));
builder.add(new BooleanClause(query2, BooleanClause.Occur.MUST_NOT));

// 2. 创建Directory流对象,声明索引库位置
Directory directory = FSDirectory.open(Paths.get("E:\\dir"));
// 3. 创建索引读取对象IndexReader
IndexReader reader = DirectoryReader.open(directory);
// 4. 创建索引搜索对象
IndexSearcher searcher = new IndexSearcher(reader);
// 5. 使用索引搜索对象,执行搜索,返回结果集TopDocs
// 第一个参数:搜索对象,第二个参数:返回的数据条数,指定查询结果最顶部的n条数据返回
TopDocs topDocs = searcher.search(builder.build(), 10);
System.out.println("查询到的数据总条数是:" + topDocs.totalHits);
// 获取查询结果集
ScoreDoc[] docs = topDocs.scoreDocs;
// 6. 解析结果集
for (ScoreDoc scoreDoc : docs) {
// 获取文档
int docID = scoreDoc.doc;
Document doc = searcher.doc(docID);
System.out.println("=============================");
System.out.println("docID:" + docID);
System.out.println("id:" + doc.get("id"));
System.out.println("name:" + doc.get("name"));
System.out.println("price:" + doc.get("price"));
System.out.println("brandName:" + doc.get("brandName"));
System.out.println("image:" + doc.get("image"));
}
// 7. 释放资源
reader.close();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值