`
zhxmyself
  • 浏览: 40661 次
  • 来自: ...
社区版块
存档分类
最新评论

BooleanQuery组合查询

阅读更多
应用BooleanQuery进行组合查询时,条件之间的关系是由类BooleanClause.Occur控制的,BooleanClause.Occur中提供了三个参数值进行控制,分别是BooleanClause.Occur.MUST
BooleanClause.Occur.MUST_NOT
BooleanClause.Occur.SHOULD

它们的组合关系代表的意思如下:
1、MUST和MUST表示“与”的关系,即“并集”。
2、MUST和MUST_NOT前者包含后者不包含。
3、MUST_NOT和MUST_NOT没意义
4、SHOULD与MUST表示MUST,SHOULD失去意义;
5、SHOUlD与MUST_NOT相当于MUST与MUST_NOT。
6、SHOULD与SHOULD表示“或”的概念。

BooleanQuery的条件生成方法如下:
Term term1 = new Term(FIELD_CONTENT,"共");
TermQuery q1 = new TermQuery(term1);
BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.add(q1, BooleanClause.Occur.MUST);

package com.zhx.test;

import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.LockObtainFailedException;

public class BooleanQuerySearcher {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		 //索引目录
		 String IDNEX_PATH = "Z:/data/paoding/test_index";   
         //字段名
		 String FIELD_NAME = "field_name";
		 //字段名
		 String FIELD_CONTENT = "field_content";
	        //获取Paoding中文分词器   
	        Analyzer analyzer = new StandardAnalyzer();   
	        //建立索引   
	        IndexWriter writer;   
	        try {   
	            writer = new IndexWriter(IDNEX_PATH, analyzer, true,new IndexWriter.MaxFieldLength(10));   
	            
	            Document doc = new Document();   
	            Field field = new Field(FIELD_NAME, "第一条记录", Field.Store.YES,   
		                Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS); 
	            doc.add(field);  
	            field = new Field(FIELD_CONTENT, "中华人民共和国", Field.Store.YES,   
		                Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS); 
	            doc.add(field);   
	            writer.addDocument(doc); 
	            
	            doc = new Document();  
	            field = new Field(FIELD_NAME, "第二条记录", Field.Store.YES,   
		                Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);  
	            doc.add(field);
	            field = new Field(FIELD_CONTENT, "人民共和国", Field.Store.YES,   
		                Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);   
		        doc.add(field);
	            writer.addDocument(doc); 
	            writer.close();   
	            System.out.println("Indexed success!");   
	                
	            //检索   
	            IndexReader reader = IndexReader.open(IDNEX_PATH); 
	            //生成查询条件
	            Term term1 = new Term(FIELD_CONTENT,"共");
	            Term term2 = new Term(FIELD_CONTENT,"人");
	            Term term3 = new Term(FIELD_NAME,"二");
	            TermQuery q1 = new TermQuery(term1);
	            TermQuery q2 = new TermQuery(term2);
	            TermQuery q3 = new TermQuery(term3);
	            BooleanQuery booleanQuery = new BooleanQuery();
	            booleanQuery.add(q1, BooleanClause.Occur.MUST);
	            booleanQuery.add(q2, BooleanClause.Occur.MUST);
	            booleanQuery.add(q3, BooleanClause.Occur.MUST_NOT);
	            Searcher searcher = new IndexSearcher(reader);   
	            TopDocs topDocs = searcher.search(booleanQuery,10);   
	            if (topDocs.totalHits == 0) {   
	                System.out.println("topDocs.totalHits = 0");   
	            } else{
	            	ScoreDoc[] scoreDocs = topDocs.scoreDocs;
	            	for(int i=0;i<topDocs.totalHits;i++){
	            		int docId = scoreDocs[i].doc;
	            		Document document = searcher.doc(docId);
	            		System.out.println("记录"+i+":"+document.get(FIELD_NAME)+" "+document.get(FIELD_CONTENT));	            		
	            	}
	            }
	            reader.close();   
	        } catch (CorruptIndexException e) {   
	            // TODO Auto-generated catch block   
	            e.printStackTrace();   
	        } catch (LockObtainFailedException e) {   
	            // TODO Auto-generated catch block   
	            e.printStackTrace();   
	        } catch (IOException e) {   
	            // TODO Auto-generated catch block   
	            e.printStackTrace();   
	        }

	}

}
分享到:
评论

相关推荐

    Lucene3.0之查询类型详解

    举例来说,以下是如何创建一个"星期一"和"五月一日"的逻辑组合查询: ```java Term term1 = new Term("content", "星期一"); Term term2 = new Term("content", "五月一日"); TermQuery query1 = new TermQuery(term...

    lucene创建修改删除组合条件查询

    在本主题中,我们将深入探讨如何使用Lucene进行创建、删除、修改和组合条件查询,以及如何实现类似MySQL中的LIKE、IN、OR和时间范围条件查询。 首先,**创建索引**是使用Lucene的第一步。创建索引涉及到读取数据源...

    lucene高级智能查询小案例

    例如,我们可以使用TermQuery来查找特定关键词,使用BooleanQuery组合多个条件,或者使用WildcardQuery进行通配符查询。在高级查询中,我们可能会利用FuzzyQuery进行模糊匹配,或者使用PrefixQuery进行前缀搜索,...

    lucence.net查询

    本文将深入探讨Lucene.NET的多字段查询、建立索引以及组合查询等核心知识点。 一、Lucene.NET基础 1. **建立索引**:Lucene.NET的核心功能之一是创建全文索引,这使得快速检索成为可能。首先,我们需要创建一个`...

    Lucene查询语法

    组合查询允许将多个查询组合在一起,形成更复杂的查询表达式。 ##### 1.9 查询过滤 查询过滤用于在返回结果之前先进行过滤操作,确保结果集满足特定条件。 #### 三、字符串构造查询 字符串构造查询是一种简单直观...

    Lucene 搜索方法(布尔搜索)

    Lucene是一个高性能、全文本搜索库,它提供了强大的信息检索功能,而布尔搜索是其中一种常用且灵活的搜索方式,允许用户通过逻辑运算符(如AND、OR、NOT等)来组合多个查询条件,以精确地控制搜索结果。 描述部分...

    Lucene分词查询

    查询对象(Query)代表了用户输入的搜索条件,如`TermQuery`用于精确匹配,`WildcardQuery`用于通配符查询,`BooleanQuery`则允许组合多个查询条件。对于中文查询,我们需要确保使用与建立索引时相同的Analyzer,...

    lucene 多字段查询+文字高亮显示

    例如,可以创建一个BooleanQuery,将各个字段的Query子句以AND、OR或NOT的关系组合起来。此外,还可以使用MultiFieldQueryParser,它允许指定一组字段,并自动处理这些字段上的查询。 接着,我们探讨“文字高亮显示...

    java实现倒排索引表的布尔查询

    4. **布尔查询**:布尔查询是通过逻辑运算符(AND、OR、NOT等)组合多个查询条件来实现的。例如,"dog AND cat"表示同时包含"dog"和"cat"的文档。在Java中,可以通过遍历每个查询词的倒排索引,根据逻辑运算符合并...

    搜索引擎的个人学习

    Lucene提供多种查询类型,如TermQuery(单个词查询)、BooleanQuery(布尔组合查询)、PhraseQuery(短语查询)等,满足不同查询需求。用户可以通过构造复杂的查询表达式,精确匹配或模糊查找所需信息。 结果显示和...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-07.Lucene搜索实战1 共4页.pptx

    在实际编程中,这些概念可以通过BooleanQuery类来实现,通过添加不同的BooleanClause来构造复杂的查询表达式。 另外,课程还涉及了TermRangeQuery,这是一种用于执行范围搜索的查询类型。TermRangeQuery允许用户...

    lucene-4.6.0官方文档

    TermQuery匹配单个词项,PhraseQuery用于短语匹配,BooleanQuery可以组合多个查询条件。查询执行后,通过Scorer和Collector进行文档评分和收集,决定哪些文档应该返回给用户。 5. **高级特性** Lucene还提供了高级...

    Lucene实现全文检索

    例如,使用BooleanQuery组合多个条件,使用PhraseQuery匹配精确的词序,使用FuzzyQuery支持相似词搜索,使用ScoreDoc根据相关性排序。 总的来说,Lucene通过索引机制和高效的查询算法,为开发者提供了强大的全文...

    lucene例子

    2. **BooleanQuery**:可以组合多个Query对象,通过AND、OR、NOT等布尔运算符进行多条件查询。 3. **PrefixQuery**、**WildcardQuery** 和 **RegexQuery**:这些查询类支持模糊匹配,如前缀查询、通配符查询和正则...

    lucene中文资料

    2. **查询类型**:Lucene 支持多种查询类型,如 TermQuery(单个词查询)、PhraseQuery(短语查询)、BooleanQuery(布尔组合查询)等。 3. **评分与排名**:Lucene 使用 TF-IDF(词频-逆文档频率)算法计算相关性...

    javacc lucene全文检索语言转换.jjt

    例如,用户可能会输入一个像"title:(java AND book) OR author:(Smith)"这样的查询,这个自定义查询语言可能被解析为一系列Lucene的Query对象,如TermQuery、BooleanQuery等。JavaCC生成的解析器会负责这个转化过程...

    lucene部分常用代码

    在上面的代码中,我们使用BooleanQuery来组合多个Query,从而实现多条件搜索。 过滤 Lucene中的Filter可以对搜索结果进行过滤,从而获得更小范围内更精确的结果。下面是一个示例代码: ```java filter filter = ...

    lucene5.5.0源码

    Query对象包括TermQuery(单个词元查询)、BooleanQuery(布尔组合查询)、PhraseQuery(短语查询)等,它们在查询过程中扮演重要角色。 7. **过滤器与高亮显示**:Filter可以限制搜索结果,如通过TermFilter筛选...

    lucene 检索

    Lucene 支持多种查询类型,如 TermQuery(单个词查询)、BooleanQuery(布尔组合查询)、PhraseQuery(短语查询)等。同时,它还使用 TF-IDF(词频-逆文档频率)等算法计算文档的相关性评分,帮助确定搜索结果的排序...

    一个基于lucene制作的搜索引擎源码

    1. 构建Query:根据用户输入的查询字符串创建Query对象,如使用TermQuery匹配单个词项,BooleanQuery组合多个条件。 2. 查询执行:使用Searcher对象的search方法,传入Query和指定的文档集范围。 3. 结果排序:...

Global site tag (gtag.js) - Google Analytics