`
iluoxuan
  • 浏览: 580025 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

BooleanQuery组合查询2.x版本吧

 
阅读更多

转载:http://zhxmyself.iteye.com/blog/466066

 

 

应用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); 

Java代码  收藏代码
  1. package com.zhx.test;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.apache.lucene.analysis.Analyzer;  
  6. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  7. import org.apache.lucene.document.Document;  
  8. import org.apache.lucene.document.Field;  
  9. import org.apache.lucene.index.CorruptIndexException;  
  10. import org.apache.lucene.index.IndexReader;  
  11. import org.apache.lucene.index.IndexWriter;  
  12. import org.apache.lucene.index.Term;  
  13. import org.apache.lucene.search.BooleanClause;  
  14. import org.apache.lucene.search.BooleanQuery;  
  15. import org.apache.lucene.search.IndexSearcher;  
  16. import org.apache.lucene.search.ScoreDoc;  
  17. import org.apache.lucene.search.Searcher;  
  18. import org.apache.lucene.search.TermQuery;  
  19. import org.apache.lucene.search.TopDocs;  
  20. import org.apache.lucene.store.LockObtainFailedException;  
  21.   
  22. public class BooleanQuerySearcher {  
  23.   
  24.     /** 
  25.      * @param args 
  26.      */  
  27.     public static void main(String[] args) {  
  28.          //索引目录  
  29.          String IDNEX_PATH = "Z:/data/paoding/test_index";     
  30.          //字段名  
  31.          String FIELD_NAME = "field_name";  
  32.          //字段名  
  33.          String FIELD_CONTENT = "field_content";  
  34.             //获取Paoding中文分词器     
  35.             Analyzer analyzer = new StandardAnalyzer();     
  36.             //建立索引     
  37.             IndexWriter writer;     
  38.             try {     
  39.                 writer = new IndexWriter(IDNEX_PATH, analyzer, true,new IndexWriter.MaxFieldLength(10));     
  40.                   
  41.                 Document doc = new Document();     
  42.                 Field field = new Field(FIELD_NAME, "第一条记录", Field.Store.YES,     
  43.                         Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);   
  44.                 doc.add(field);    
  45.                 field = new Field(FIELD_CONTENT, "中华人民共和国", Field.Store.YES,     
  46.                         Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);   
  47.                 doc.add(field);     
  48.                 writer.addDocument(doc);   
  49.                   
  50.                 doc = new Document();    
  51.                 field = new Field(FIELD_NAME, "第二条记录", Field.Store.YES,     
  52.                         Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);    
  53.                 doc.add(field);  
  54.                 field = new Field(FIELD_CONTENT, "人民共和国", Field.Store.YES,     
  55.                         Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);     
  56.                 doc.add(field);  
  57.                 writer.addDocument(doc);   
  58.                 writer.close();     
  59.                 System.out.println("Indexed success!");     
  60.                       
  61.                 //检索     
  62.                 IndexReader reader = IndexReader.open(IDNEX_PATH);   
  63.                 //生成查询条件  
  64.                 Term term1 = new Term(FIELD_CONTENT,"共");  
  65.                 Term term2 = new Term(FIELD_CONTENT,"人");  
  66.                 Term term3 = new Term(FIELD_NAME,"二");  
  67.                 TermQuery q1 = new TermQuery(term1);  
  68.                 TermQuery q2 = new TermQuery(term2);  
  69.                 TermQuery q3 = new TermQuery(term3);  
  70.                 BooleanQuery booleanQuery = new BooleanQuery();  
  71.                 booleanQuery.add(q1, BooleanClause.Occur.MUST);  
  72.                 booleanQuery.add(q2, BooleanClause.Occur.MUST);  
  73.                 booleanQuery.add(q3, BooleanClause.Occur.MUST_NOT);  
  74.                 Searcher searcher = new IndexSearcher(reader);     
  75.                 TopDocs topDocs = searcher.search(booleanQuery,10);     
  76.                 if (topDocs.totalHits == 0) {     
  77.                     System.out.println("topDocs.totalHits = 0");     
  78.                 } else{  
  79.                     ScoreDoc[] scoreDocs = topDocs.scoreDocs;  
  80.                     for(int i=0;i<topDocs.totalHits;i++){  
  81.                         int docId = scoreDocs[i].doc;  
  82.                         Document document = searcher.doc(docId);  
  83.                         System.out.println("记录"+i+":"+document.get(FIELD_NAME)+" "+document.get(FIELD_CONTENT));                          
  84.                     }  
  85.                 }  
  86.                 reader.close();     
  87.             } catch (CorruptIndexException e) {     
  88.                 // TODO Auto-generated catch block     
  89.                 e.printStackTrace();     
  90.             } catch (LockObtainFailedException e) {     
  91.                 // TODO Auto-generated catch block     
  92.                 e.printStackTrace();     
  93.             } catch (IOException e) {     
  94.                 // TODO Auto-generated catch block     
  95.                 e.printStackTrace();     
  96.             }  
  97.   
  98.     }  
  99.   
  100. }  
分享到:
评论

相关推荐

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

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

    Lucene3.0之查询类型详解

    booleanQuery.add(query2, BooleanClause.Occur.MUST); // 另一个AND操作 ``` 以上就是Lucene3.0查询处理的基本原理、模型、流程以及主要查询类型的详细说明。通过这些知识,开发者可以有效地构建和执行复杂的信息...

    lucence.net查询

    例如,`new BooleanQuery.Builder().Add(query1, Occur.MUST).Add(query2, Occur.SHOULD).Build()`将创建一个必须包含query1且可以包含query2的查询。 2. **短语查询**:通过`PhraseQuery`,可以查找精确的短语匹配...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-06.Lucene索引搜索 共13页.pptx

    在实际应用中,除了这些基本操作,还需要了解其他Lucene组件,如Filter(用于进一步筛选结果)、Sort(用于结果排序)、分词器(如StandardAnalyzer、IKAnalyzer等)以及高级查询构造如BooleanQuery、PhraseQuery、...

    lucene-4.7.0.zip

    3. 查询(Query):用户输入的搜索条件被转换为Lucene理解的查询对象,如TermQuery、BooleanQuery等。 4. 搜索(Searching):使用查询对象在索引中查找匹配的文档,并返回结果集。 5. 排序与评分(Sorting & ...

    Lucene 3.0 原理与代码分析完整版

    1. 查询解析:用户输入的查询字符串被解析成Query对象,如TermQuery、BooleanQuery等。 2. 查询扩展:根据查询语句,Lucene可能进行同义词扩展、短语匹配等。 3. 相关性评分:使用TF-IDF、BM25等算法计算文档与查询...

    lucene3.0-api.CHM

    6. Query:代表搜索查询的对象,如TermQuery、BooleanQuery等。 7. Hit/HitCollector:搜索结果的表示,HitCollector用于收集搜索结果。 三、索引与搜索流程 1. 创建索引:首先,创建一个Directory实例,然后使用...

    lucene-2.3.0-src

    2. **Query**:表示查询表达式,如`TermQuery`对应单个词项,`BooleanQuery`对应布尔组合。 3. **IndexWriter**:用于创建和更新索引,如添加、删除和修改文档。 4. **IndexReader**:用于读取已建立的索引,获取...

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

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

    Lucene查询语法

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

    hibernate-search-4.5.2.Final-dist.zip

    4. 高级查询:提供布尔组合查询、范围查询、近似查询等多种高级查询方式,如使用`BooleanQuery`、`NumericRangeQuery`等。 5. 排序和评分:可以基于各种因素(如相关性、距离等)对搜索结果进行排序和评分。 6. 分页...

    Lucene实战讲解

    也可以直接创建Query对象,如TermQuery、BooleanQuery等。 2. 执行搜索:使用Searcher对象的search方法,传入Query对象和TopDocs参数,返回匹配的文档集合。 3. 结果排序:Lucene支持多种排序方式,如按相关度、...

    lucene-4.9.1

    6. 查询(Query):表示一个搜索请求,如TermQuery、BooleanQuery等。 7. 搜索器(Searcher):执行查询,返回匹配的文档集合。 8. 排序(Sort):定义搜索结果的排序方式,可以基于评分、字段值等。 总之,Apache ...

    Lucene留言项目源码.rar

    在留言项目中,可能支持关键词、布尔组合等多种查询语法。 2. 索引搜索(Index Search):使用Query对象与倒排索引进行匹配,找出包含所有查询词的文档。 3. 排序与评分(Scoring):Lucene使用TF-IDF算法计算文档与...

    Lucene-入门

    8. **Query**:表示用户查询的抽象类,有多种子类如TermQuery、BooleanQuery等。 9. **ScoreDoc**:表示搜索结果的评分和文档编号。 10. **Hit**:搜索结果的一个匹配项,包含文档编号、文档得分和文档信息。 **四...

    lucene5.3.1增删改查

    在Lucene 5.3.1版本中,我们可以通过API实现对索引的创建、删除、更新和查询操作,这些是构建高效全文搜索引擎的关键步骤。 ### 创建索引 创建索引是Lucene的第一步,它将文档内容转换为可搜索的结构。这个过程...

    Lucene3总体图_建索引_查询_数据库索引[参考].pdf

    - 支持多种查询语法,如TermQuery、BooleanQuery等,提供与SQL类似的查询能力。 5. **Search**: - Query类:各种查询类型的实现,如TermQuery、BooleanQuery等,它们负责在索引中寻找匹配的文档。 - 提供搜索...

    【分享:lucene学习资料】---<下载不扣分,回帖加1分,欢迎下载,童叟无欺>

    一共有2份资料 1&gt; lucene学习笔记 2&gt; 全文检索的实现机制 【1】lucene学习笔记的目录如下 1. 概述 3 2. lucene 的包结构 3 3. 索引文件格式 3 4. lucene中主要的类 4 4.1. Document文档类 4 4.1.1. 常用方法 4 ...

    lucene3.6工程原文件

    2. **Boolean 查询**:结合多个 Term 查询,使用 AND、OR、NOT 等布尔运算符来构造复杂的查询表达式。 3. **Phrase 查询**:用于查找包含特定短语的文档,例如 "information retrieval",它会考虑词语之间的顺序。 ...

    Lucene 搜索方法(布尔搜索)

    2. **构造布尔查询**: 使用`BooleanQuery.Builder`创建一个查询实例,然后添加子查询,每个子查询都是一个`Query`对象,如`TermQuery`或`WildcardQuery`,并指定其对应的布尔运算符。 3. **设置查询权重**: 如果...

Global site tag (gtag.js) - Google Analytics