BooleanQuery也是实际开发过程中经常使用的一种Query。它其实是一个组合的Query,在使用时可以把各种Query对象添加进去并标明它们之间的逻辑关系。

BooleanQuery本身来讲是一个布尔子句的容器,它提供了专门的API方法往其中添加子句,并标明它们之间的关系,以下代码为BooleanQuery提供的用于添加子句的API接口:

public void add(Query query, boolean required, boolean prohibited);

注意:BooleanQuery是可以嵌套的,一个BooleanQuery可以成为另一个BooleanQuery的条件子句。

package ch11;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery; public class BooleanQueryTest1 { public static void main(String[] args) throws Exception { // 生成新的Document对象 Document doc1 = new Document(); doc1.add(Field.Text("name", "word1 word2 word3")); doc1.add(Field.Keyword("title", "doc1")); Document doc2 = new Document(); doc2.add(Field.Text("name", "word1 word4 word5")); doc2.add(Field.Keyword("title", "doc2")); Document doc3 = new Document(); doc3.add(Field.Text("name", "word1 word2 word6")); doc3.add(Field.Keyword("title", "doc3")); // 生成索引书写器 IndexWriter writer = new IndexWriter("c://index",
new StandardAnalyzer(), true); // 添加到索引中 writer.addDocument(doc1); writer.addDocument(doc2); writer.addDocument(doc3); writer.close(); Query query1 = null; Query query2 = null; BooleanQuery query = null; Hits hits = null; // 生成IndexSearcher对象 IndexSearcher searcher = new IndexSearcher("c://index"); query1 = new TermQuery(new Term("name", "word1")); query2 = new TermQuery(new Term("name", "word2")); // 构造一个布尔查询 query = new BooleanQuery(); // 添加两个子查询 query.add(query1, true, false); query.add(query2, true, false); hits = searcher.search(query); printResult(hits, "word1和word2"); } public static void printResult(Hits hits, String key) throws Exception { System.out.println("查找 /"" + key + "/" :"); if (hits != null) { if (hits.length() == 0) { System.out.println("没有找到任何结果"); } else { System.out.println("找到" + hits.length() + "个结果"); for (int i = 0; i < hits.length(); i++) { Document d = hits.doc(i); String dname = d.get("title"); System.out.print(dname + " "); } System.out.println(); System.out.println(); } } }
}

代码首先构造了两个TermQuery,然后构造了一个BooleanQuery的对象,并将两个TermQuery当成它的查询子句加入Boolean查询中。

再来看一下BooleanQuery的add方法,除了它的第一个参数外,它还有另外两个布尔型的参数。第1个参数的意思是当前所加入的查询子句是否必须满足,第2个参数的意思是当前所加入的查询子句是否不需要满足。这样,当这两个参数分别选择true和false时,会有4种不同的组合。

     true &false:表明当前加入的子句是必须要满足的。

     false&true:表明当前加入的子句是不可以被满足的。

     false&false:表明当前加入的子句是可选的。

     true&true:错误的情况。

由前面的示例可以看出由于加入的两个子句都选用了true&false的组合,因此它们两个都是需要被满足的,也就构成了实际上的“与”关系

如果是要进行“或”运算,则可按如下代码来构建查询子句

query.add(query1, false, false);

query.add(query2, false, false);

由于布尔型的查询是可以嵌套的,因此可以表示多种条件下的组合。不过,如果子句的数目太多,可能会导致查找效率的降低。因此,Lucene给出了一个默认的限制,就是布尔型Query的子句数目不能超过1024。

lucene-查询query->BooleanQuery “与或”搜索的更多相关文章

  1. Lucene 查询(Query)子类

    QueryParser(单域查询) QueryParser子类对单个域查询时创建查询query,构造方法中需要传入Lucene版本号,检索域名和分词器. QueryParser parser = ne ...

  2. Lucene 06 - 使用Lucene的Query API查询数据

    目录 1 Query对象的创建(方式一): 使用子类对象 1.1 常用的Query子类对象 1.2 常用的Query子类对象使用 1.2.1 使用TermQuery 1.2.2 使用NumericRa ...

  3. lucene 查询的使用

    各种查询方式一:使用QueryParser与查询语法.(会使用分词器) MultiFieldQueryParser查询字符串 ------------------------> Query对象 ...

  4. lucene 查询 (转载)

    原网址:http://hi.baidu.com/lszhuhaichao/blog/item/ccffc7cb858f1514bf09e66f.html Lucene3.0之查询处理(1):原理201 ...

  5. lucene查询索引库、分页、过滤、排序、高亮

    2.查询索引库 插入测试数据 xx.xx. index. ArticleIndex @Test public void testCreateIndexBatch() throws Exception{ ...

  6. Lucene全文检索_分词_复杂搜索_中文分词器

    1 Lucene简介 Lucene是apache下的一个开源的全文检索引擎工具包. 1.1 全文检索(Full-text Search)  1.1.1 定义 全文检索就是先分词创建索引,再执行搜索的过 ...

  7. 利用Lucene.net搜索引擎进行多条件搜索的做法

    利用Lucene.net搜索引擎进行多条件搜索的做法 2018年01月09日 ⁄ 搜索技术 ⁄ 共 613字 ⁄ 字号 小 中 大 ⁄ 评论关闭 利用Lucene.net搜索引擎进行多条件搜索的做法 ...

  8. Lucene查询索引(分页)

    分页查询只需传入每页显示记录数和当前页就可以实现分页查询功能 Lucene分页查询是对搜索返回的结果进行分页,而不是对搜索结果的总数量进行分页,因此我们搜索的时候都是返回前n条记录 package c ...

  9. 第六步:Lucene查询索引(优化一)

    package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...

  10. lucene 查询+分页+排序

    lucene 查询+分页+排序 1.定义一个工厂类 LuceneFactory 1 import java.io.IOException; 2 3 import org.apache.lucene.a ...

随机推荐

  1. windows下使用 linux命令好办法

    1. 安装下载 CygwinPortable一键安装包.7z 2. 把安装路径下/  [D:\cygwinportable\CygwinPortable\App\Cygwin\bin] 加到 Path ...

  2. svn恢复被删除的分支 svn del 分支

    笔者不小心,在操作时,删除了一个主开发分支(main_dev). 一. 悲剧的语句: svn del  -m"1.误删除分支"  http://svr_path/branches/ ...

  3. bzoj1787 [Ahoi2008]Meet 紧急集合

    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 2272  Solved: 1029 [Submi ...

  4. js 增删改查方法

    push() 向数组的末尾添加一个或多个元素 pop() 删除数组内部并返回数组的最后一个元素 shift() 把数组内部的第一个元素从其中删除,并返回第一个元素的值 unshift() 向数组外部的 ...

  5. ACA烤箱菜单各项温度

    说明书找不到了, 网上找到的各项温度说明, 记一个备用 casserole 218度 cake 171度 backery 177度 frozen food 238度 patato 232度 roast ...

  6. Hangfire项目实践

    Hangfire项目实践分享 Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget ...

  7. android 打Patch的方法 .

    http://blog.csdn.net/sunyubo458/article/details/6680840 作为程序员,了解diff&patch命 令是非常必要的.比如说我们发现某个项目有 ...

  8. Framework/base 下添加自定义模块的步骤

    在Android源码编译成功的基础上,重新编译带自己API的android.jar需要进行以下几个步骤操作:1.添加自己的源代码,在android源码的frameworks/base目录下新建一个文件 ...

  9. 向jboss写入服务器日志

    实际开发中,记录日志是常用的功能,jboss默认情况下已经记录了很多运行日志,如果开发人员要手动在server.log中写入日志,可以参考下面的方法: package utils; import ja ...

  10. React Native中设计主题机制

    昨天和同事讨论组件隔离性的时候讨论到关于默认样式的问题:很多情况下我们希望能够把组件设计为通用的,然后在具体项目中给他们指定一些通用的样式,譬如:背景颜色.默认字体等等.这听起来在CSS下运作起来就很 ...