我们在实际使用lucene的过程中,筛选多个条件时BooleanQuery这个类来实现,比如下面代码: BooleanQuery.Builder bqBuilder = new BooleanQuery.Builder clauses())){ bqBuilder.add(new WildcardQuery(new Term("name","*")),BooleanClause.Occur.SHOULD); } BooleanQuery
leavesToCache.minSizeRatio: 每个segment若要启用缓存则"该segment的文档数/IndexSearcher总文档数"必须>=minSizeRatio. skipCacheFactor: 对于BooleanQuery BooleanQuery的多个条件如何缓存的? 是分别缓存的, 只要顶层BooleanQuery是不需要分数的, 那么顶层BooleanQuery和其所有子Query都会分别单独缓存. 不过要注意的是在CachingPolicy里有个特殊处理, BooleanQuery的缓存查询数阈值为正常阈值-1, 也就是说如果只反复查询同一个BooleanQuery, 最终只会缓存这个BooleanQuery
booleanQuery = new BooleanQuery(); booleanQuery.add(query1, Occur.MUST); // 书名带有apache的必须包含进来 booleanQuery = new BooleanQuery(); booleanQuery.add(query1, Occur.SHOULD); // 书名带有mybatis的应该包含进来 booleanQuery = new BooleanQuery(); booleanQuery.add(query1, Occur.MUST_NOT); // 书名带有mybatis的不能包含进来 booleanQuery = new BooleanQuery(); booleanQuery.add(query1, Occur.MUST_NOT); // 书名带有apache的必须不包含进来 booleanQuery = new BooleanQuery(); booleanQuery.add(query1, Occur.SHOULD); // 书名带有lucene的应该包含进来
TermQuery termQuery = new TermQuery(term); BoostQuery query =new BoostQuery(termQuery, 0.5f); // 若使用 BooleanQuery 进行查询时: booleanQueryBuilder.add(query, BooleanClause.Occur.SHOULD); BooleanQuery booleanQuery = booleanQueryBuilder.build (); log.info("lucene search terms:{}", booleanQuery.toString("question")); 这时候日志应该记录如下: ?
booleanQuery = new BooleanQuery(); //多字段查询同时搜索title和summary MultiFieldQueryParser (query1, BooleanClause.Occur.MUST); //booleanQuery.Add(query2, BooleanClause.Occur.MUST ); //booleanQuery.Add(query3, BooleanClause.Occur.MUST); booleanQuery.Add (query4, BooleanClause.Occur.MUST); //booleanQuery.Add(query5, BooleanClause.Occur.MUST (booleanQuery, null, 100);//执行搜索,获取查询结果集对象 recCount = ts.totalHits;//获取命中的文档个数
“ Lucene对于查询的方式较多,可以实现TermQuery、BooleanQuery、PhraseQuery、 TermRangeQuery等一系列的基于不同类型的词组的检索。 Query query = new TermQuery(new Term("title","PHP")) BooleanQuery(组合搜索) BooleanQuery是合并多个查询条件的Query,例如合并 BooleanQuery query = new BoolQuery(); query.add(new TermQuery(new Term("title","PHP"))); query.add(new
Lucene 的提供了很多Query方式,比如TermQuery 查询文档中某个term是否存在,PhraseQuery 查询文档中两个或多个词是否存在和设定他们之间的距离, FuzzyQuery 模糊查询,BooleanQuery phraseQuery.Add(new Term(filedName,value)); phraseQuery.Add(new Term(filedName,value)); phraseQuery.Slop=10; BooleanQuery booleanQuery = new BooleanQuery(); booleanQuery.Add(termQuery, Occur.Must); booleanQuery.Add(phraseQuery ,Occur.Must); luceneSearcher.search(booleanQuery,topn); 上面的只是举例,当然在实际开发中是不会一路写下来的。
IndexReader reader = DirectoryReader.open(dir); IndexSearcher is=new IndexSearcher(reader); BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder(); SmartChineseAnalyzer analyzer=new SmartChineseAnalyzer QueryParser parser2=new QueryParser("description",analyzer); Query query2=parser2.parse(q); booleanQuery.add (query, BooleanClause.Occur.SHOULD); booleanQuery.add(query2, BooleanClause.Occur.SHOULD); TopDocs hits=is.search(booleanQuery.build(), 100); QueryScorer scorer=new QueryScorer(query);
查询(Query)Lucene提供丰富的查询类型,包括:TermQuery:最基本的词项查询PhraseQuery:短语查询BooleanQuery:组合多个查询条件(AND/OR/NOT)RangeQuery 复杂查询Lucene的查询语法非常灵活,可以构建复杂查询:```java// 多字段查询BooleanQuery.Builder builder = new BooleanQuery.Builder() builder.build();// 范围查询Query rangeQuery = LongPoint.newRangeQuery("date", startDate, endDate);// 组合多个查询BooleanQuery.Builder finalBuilder = new BooleanQuery.Builder();finalBuilder.add(query, BooleanClause.Occur.MUST);finalBuilder.add builder = new BooleanQuery.Builder();builder.add(contentQuery, BooleanClause.Occur.SHOULD);builder.add
这是一个复合查询,复合查询需要使用到一个关键的类 BooleanQuery,它可以对多个子 Query 进行逻辑组合来融合查询结果。 (new Term("content", "动物")); var query2 = new TermQuery(new Term("content", "世界")); var query = new BooleanQuery.Builder (new Term("content", "动物")); var query2 = new TermQuery(new Term("content", "世界")); var query = new BooleanQuery.Builder (new Term("content", "动物")); var query2 = new TermQuery(new Term("content", "经济")); var query = new BooleanQuery.Builder var query1 = new TermQuery(new Term("content", "动物")); var query = new BooleanQuery.Builder()
Query子类,Lucene支持的最基本的一个查询类 例子:TermQuery termQuery = new TermQuery(new Term("filename", "lucene")); BooleanQuery BooleanQUery,布尔查询,是一个组合Query(多个查询条件的组合) BooleanQuery是可以嵌套的 栗子: BooleanQuery query = new BooleanQuery (); BooleanQuery query2 = new BooleanQuery(); TermQuery termQuery1 = new TermQuery(new Term("fileName termQuery1, Occur.SHOULD); query.add(termQuery2, Occur.SHOULD); query.add(query2, Occur.SHOULD);; //BooleanQuery
关键词查询 TermQuery 与组合查询 BooleanQuery 关键词查询是最简单的查询,在 QueryParser 的语法里它就是一个「无空格」普通的字符串。 query, 10).scoreDocs; -------------- content:北京大学 如果在「北京」和「大学」之间多了一个空格, 那么解析的结果将默认会是「逻辑或」表达式,相当于 BooleanQuery System.out.println(query); ------------ content:北京 content:大学 我们打印一下上面的 query 对象的 Class,你就会发现它确实是一个 BooleanQuery System.out.println(query.getClass()); ------------ class org.apache.lucene.search.BooleanQuery 我们还可以稍微调整一下表达式 ,将上面的解析结果变成成「逻辑与」,表示文章中出现「北京」或者「大学」的都会进入查询结果,使用 + 号作为前缀,这里的加号相当于 BooleanQuery 中的 MUST 选项。
当 FuzzyQuery 扩展多于 BooleanQuery.maxClauseCount 时 ,只有最相关的term会被重新写入query,因此避免了异常的抛出。 org.apache.lucene.maxFieldLength, org.apache.lucene.termIndexInterval, org.apache.lucene.mergeFactor, 还有 BooleanQuery 这个类比普通的 RangeQuery 类的好处是它并不展开到 BooleanQuery ,因此也不存在区间最大term上限。 为BooleanQuery增加了最小的匹配短语。见:BooleanQuery.setMinimumNumberShouldMatch().
上次已经写过一篇关于solr中,查询条件过多的异常的文章,这次在总结扩展一下: 有时候我们的查询条件会非常多,由于solr的booleanquery默认设置的条件数为1024,所以超过这个限制的 仔细看solr的文档里面,写这下面一段话: Java代码 Max Boolean Clauses Maximum number of clauses in each BooleanQuery
IndexSearcher 是lucene中最基本的检索工具,所有的检索都会用到IndexSearcher工具; Query 查询,lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery 多条件查询 /** * 多条件查询 * * BooleanQuery也是实际开发过程中经常使用的一种Query。 * BooleanQuery本身来讲是一个布尔子句的容器,它提供了专门的API方法往其中添加子句, * 并标明它们之间的关系,以下代码为BooleanQuery提供的用于添加子句的API接口: * builder = new BooleanQuery.Builder(); // BooleanClause用于表示布尔查询子句关系的类, // 包 括: // BooleanClause.Occur.MUST builder.add(query1, BooleanClause.Occur.SHOULD); builder.add(query2, BooleanClause.Occur.SHOULD); BooleanQuery
indexSearcher, query, 10); //关闭IndexReader indexSearcher.getIndexReader().close(); } BooleanQuery BooleanQuery,布尔查询,实现组合条件查询。 Query query2=NumericRangeQuery.newLongRange("fileSize", 1000L, 2000L, true, true); //创建BooleanQuery BooleanQuery query=new BooleanQuery(); //添加查询条件,这个条件是必须满足的 :Occur.MUST
org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery TermQuery TermQuery q1 =new TermQuery(t1); TermQuery q2 =new TermQuery(t2); //创建BooleanQuery 对象 BooleanQuery query = new BooleanQuery(); //将两个TermQuery加入到BooleanQuery的子句中去,且其关系均为必须满足
可通过两种方法创建查询对象: 1)使用Lucene提供Query子类 Query是一个抽象类,lucene提供了很多查询对象,比如TermQuery项精确查询,TermRangeQuery,范围查询, BooleanQuery booleanQuery = new BooleanQuery.Builder(); Query query1 = new TermQuery(new Term("fileName" ,"albert")); Query query2 = new TermQuery(new Term("fileName","yang")); booleanQuery.add (query1, BooleanClause.Occur.MUST); booleanQuery.add(query2, BooleanClause.Occur.SHOULD); System.out.println(booleanQuery); printResult(indexSearcher, booleanQuery.build()); /
org.apache.lucene.queryparser.xml.builders.NumericRangeQueryBuilder; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.BooleanQuery NumericRangeQuery.newDoubleRange("fileSize", 0.0, 15075.0, true, true); /** * *************组合查询************* */ BooleanQuery query=new BooleanQuery(); Query query1=new TermQuery(new Term("fileName","mysql")); Query query2
field.name() + ",[fieldValue]=" + fieldValue); } System.out.println(); } } 多条件搜索 多条件搜索基于BooleanQuery 100); Query queryPath = new QueryParser("path", new SimpleAnalyzer()).parse("test\\/index"); BooleanQuery.Builder builder = new BooleanQuery.Builder(); builder.add(queryContent, BooleanClause.Occur.MUST); builder.add (boost, BooleanClause.Occur.SHOULD); builder.add(queryPath, BooleanClause.Occur.MUST); BooleanQuery