本帖最后由 我是楠楠 于 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. TermQueryTermQuery,通过项查询,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口出 |
|