A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 我是楠楠 黑马粉丝团   /  2018-5-15 14:47  /  1048 人查看  /  0 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 我是楠楠 于 2018-5-15 14:50 编辑

【郑州校区】Lucene&Solr(2)上

1. 课程计划
Lucene的高级查询、solr入门
1、Lucene的查询
a) 使用Query的子类查询
i. MatchAllDocsQuery
ii. TermQuery
iii. NumericRangeQuery
iv. BooleanQuery
b) 使用QueryParser
i. QueryParser
ii. MulitFieldQueryParser
2、电商搜索案例分析
3、Solr的安装及配置
a) Solr整合tomcat
b) Solr后台管理功能介绍
c) 配置中文分析器
2. Lucene索引库查询(重点)
        对要搜索的信息创建Query查询对象,Lucene会根据Query查询对象生成最终的查询语法,类似关系数据库Sql语法一样Lucene也有自己的查询语法,比如:“name:lucene”表示查询Field的name为“lucene”的文档信息。
        可通过两种方法创建查询对象:
        1)使用Lucene提供Query子类
        Query是一个抽象类,lucene提供了很多查询对象,比如TermQuery项精确查询,NumericRangeQuery数字范围查询等。
        如下代码:
[AppleScript] 纯文本查看 复制代码
Query query = new TermQuery(new Term("name", "lucene"));
        2)使用QueryParse解析查询表达式
        QueryParse会将用户输入的查询表达式解析成Query对象实例。
        如下代码:
[AppleScript] 纯文本查看 复制代码
QueryParser queryParser = new QueryParser("name", new IKAnalyzer());
Query query = queryParser.parse("name:lucene");
2.1. 使用query的子类查询
2.1.1. MatchAllDocsQuery
使用MatchAllDocsQuery查询索引目录中的所有文档
[AppleScript] 纯文本查看 复制代码
@Test
public void testMatchAllDocsQuery() throws Exception {
IndexSearcher indexSearcher = getIndexSearcher();
//创建查询条件
Query query = new MatchAllDocsQuery();
//执行查询
printResult(query, indexSearcher);
}
2.1.2. TermQuery
TermQuery,通过项查询,TermQuery不使用分析器所以建议匹配不分词的Field域查询,比如订单号、分类ID号等。
指定要查询的域和要查询的关键词。
[AppleScript] 纯文本查看 复制代码
//使用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
可以根据数值范围查询。
[AppleScript] 纯文本查看 复制代码
//数值范围查询
@Test
public void testNumericRangeQuery() throws Exception {
IndexSearcher indexSearcher = getIndexSearcher();
//创建查询
//参数:
//1.域名
//2.最小值
//3.最大值
//4.是否包含最小值
//5.是否包含最大值
Query query = NumericRangeQuery.newLongRange("size", 1l, 1000l, true, true);
//执行查询
printResult(query, indexSearcher);
}
2.1.4. BooleanQuery
可以组合查询条件。
[AppleScript] 纯文本查看 复制代码
//组合条件查询
@Test
public void testBooleanQuery() throws Exception {
IndexSearcher indexSearcher = getIndexSearcher();
//创建一个布尔查询对象
BooleanQuery query = new BooleanQuery();
//创建第一个查询条件
Query query1 = new TermQuery(new Term("filename", "apache"));
Query query2 = new TermQuery(new Term("content", "apache"));
//组合查询条件
query.add(query1, Occur.MUST);
query.add(query2, Occur.MUST);
//执行查询
printResult(query, indexSearcher);
}
Occur.MUST:必须满足此条件,相当于and
Occur.SHOULD:应该满足,但是不满足也可以,相当于or
Occur.MUST_NOT:必须不满足。相当于not
2.2. 使用queryparser查询
通过QueryParser也可以创建Query,QueryParser提供一个Parse方法,此方法可以直接根据查询语法来查询。Query对象执行的查询语法可通过System.out.println(query);查询。
需要使用到分析器。建议创建索引时使用的分析器和查询索引时使用的分析器要一致。
2.2.1. QueryParser
需要加入queryParser依赖的jar包。
程序实现
[AppleScript] 纯文本查看 复制代码
@Test
public void testQueryParser() throws Exception {
IndexSearcher indexSearcher = getIndexSearcher();
//创建queryparser对象
//第一个参数默认搜索的域
//第二个参数就是分析器对象
QueryParser queryParser = new QueryParser("content", new IKAnalyzer());
Query query = queryParser.parse("Lucene是java开发的");
//执行查询
printResult(query, indexSearcher);
}
查询语法
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: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.2.2. MulitFieldQueryParser
可以指定多个默认搜索域
[AppleScript] 纯文本查看 复制代码
@Test
public void testMultiFiledQueryParser() throws Exception {
IndexSearcher indexSearcher = getIndexSearcher();
//可以指定默认搜索的域是多个
String[] fields = {"filename", "content"};
//创建一个MulitFiledQueryParser对象
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields, new IKAnalyzer());
Query query = queryParser.parse("java and apache");
System.out.println(query);
//执行查询
printResult(query, indexSearcher);
}
更多
传智播客·黑马程序员郑州校区地址
河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话 0371-56061160/61/62
来校路线  地铁一号线梧桐街站A口出

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马