import java.io.IOException;
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.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
/**
* 与或非布尔查询——Lucene中的BooleanQuery
* @author USER
*
*/
public class TestBooleanQuery {
/**
* 主函数,运行测试程序
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//建索引
createIndex();
//多个TermQuery构建BooleanQuery检索
searchIndex4TermQuery();
//一个MultiFieldQueryParser构建BooleanQuery多个域的检索
searchIndex4MultiFieldQueryParser();
}
/**
* 建索引
* @throws Exception
*/
public static void createIndex() throws Exception {
Document doc1 = new Document();
Field field = null;
field = new Field("name", "word1 word2 word3", Field.Store.YES,
Field.Index.TOKENIZED);
doc1.add(field);
field = new Field("title", "doc1", Field.Store.YES, Field.Index.TOKENIZED);
doc1.add(field);
Document doc2 = new Document();
field = new Field("name", "word4 word5", Field.Store.YES,
Field.Index.TOKENIZED);
doc2.add(field);
field = new Field("title", "doc2", Field.Store.YES, Field.Index.TOKENIZED);
doc2.add(field);
Document doc3 = new Document();
field = new Field("name", "word1 word2 word6", Field.Store.YES,
Field.Index.TOKENIZED);
doc3.add(field);
field = new Field("title", "doc3", Field.Store.YES, Field.Index.TOKENIZED);
doc3.add(field);
/**
* 为测试MultiFieldQueryParser而添加的文档
*/
Document doc4 = new Document();
field = new Field("name", "word1 word2 word3", Field.Store.YES,
Field.Index.TOKENIZED);
doc4.add(field);
field = new Field("title", "doc1 word1", Field.Store.YES, Field.Index.TOKENIZED);
doc4.add(field);
/**
* 对MultiFieldQueryParser更深理解
*/
Document doc5 = new Document();
field = new Field("title", "北京2008年奥运会", Field.Store.YES,
Field.Index.TOKENIZED);
doc5.add(field);
field = new Field("name", "这是一届创造奇迹、超越梦想的.......", Field.Store.YES, Field.Index.TOKENIZED);
doc5.add(field);
Document doc6 = new Document();
field = new Field("title", "北京2008年奥运会", Field.Store.YES,
Field.Index.TOKENIZED);
doc6.add(field);
field = new Field("name", "这是一届创造奇迹、超越梦想的奥运会.......", Field.Store.YES, Field.Index.TOKENIZED);
doc6.add(field);
IndexWriter writer = new IndexWriter("e:\\java\\index",
new StandardAnalyzer(), true);
writer.addDocument(doc1);
writer.addDocument(doc2);
writer.addDocument(doc3);
writer.addDocument(doc4);
writer.addDocument(doc5);
writer.addDocument(doc6);
writer.close();
}
/**
* 由TermQuery和BooleanQuery构建的多个域检索
* @throws Exception
*/
public static void searchIndex4TermQuery() throws Exception{
TermQuery query1 = null;
TermQuery query2 = null;
TermQuery query3 = null;
TermQuery query4 = null;
TermQuery query5 = null;
TermQuery query6 = null;
BooleanQuery bquerymain = null;
BooleanQuery bquery1 = null;
BooleanQuery bquery2 = null;
BooleanQuery bquery3 = null;
Hits hits = null;
IndexSearcher searcher = new IndexSearcher("e:\\java\\index");
query1 = new TermQuery(new Term("name", "word1"));
query2 = new TermQuery(new Term("name", "word2"));
query3 = new TermQuery(new Term("name", "word3"));
query4 = new TermQuery(new Term("name", "word4"));
query5 = new TermQuery(new Term("name", "word5"));
query6 = new TermQuery(new Term("name", "word6"));
// 构造布尔查询(可根据你的要求随意组合)
bquerymain = new BooleanQuery();
bquery1 = new BooleanQuery();
bquery2 = new BooleanQuery();
bquery3 = new BooleanQuery();
bquery1.add(query1, BooleanClause.Occur.MUST);
bquery1.add(query3, BooleanClause.Occur.MUST);
bquery2.add(query3, BooleanClause.Occur.MUST);
bquery2.add(query4, BooleanClause.Occur.MUST);
bquery3.add(query5, BooleanClause.Occur.MUST);
bquery3.add(query6, BooleanClause.Occur.MUST_NOT);
bquerymain.add(bquery1, BooleanClause.Occur.SHOULD);
bquerymain.add(bquery2, BooleanClause.Occur.SHOULD);
bquerymain.add(bquery3, BooleanClause.Occur.MUST);
/**
* 根据你的要求建一个BooleanQuery对象,然后来查询
*/
hits = searcher.search(bquery3);
printResult(hits, bquery1.toString());
}
/**
* 由MultiFieldQueryParser和BooleanQuery构建的多个域检索
* @throws Exception
*/
public static void searchIndex4MultiFieldQueryParser() throws Exception{
Hits hits = null;
IndexSearcher searcher = new IndexSearcher("e:\\java\\index");
// 构造布尔查询(可根据你的要求随意组合)
BooleanClause.Occur[] flags = new BooleanClause.Occur[] {
BooleanClause.Occur.MUST, BooleanClause.Occur.MUST};
Query query = MultiFieldQueryParser.parse("word1", new String[] {
"name", "title"}, flags, new StandardAnalyzer());
/* //加深对MultiFieldQueryParser的理解(注意看建索引的文档doc5,doc6与检索后的结果)
Query query = MultiFieldQueryParser.parse("北京 奥运会", new String[] {
"name", "title"}, flags, new StandardAnalyzer()); */
hits = searcher.search(query);
printResult(hits, query.toString());
}
/**
* 打印输出检索出的文档,并输出检索的布尔语句
* @param hits
* @param key
* @throws Exception
*/
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();
}
}
}
}
分享到:
相关推荐
接着,我们构建一个`Term`对象,指定在"contents"字段中搜索关键词"lucene"(转为小写以忽略大小写),并通过`TermQuery`封装这个条件。最后,`search`方法执行查询,并用`Hits`对象保存结果。通过循环,我们打印出...
总之,Lucene-5.2.1是一个强大而灵活的全文检索框架,不仅适用于大型网站的搜索功能,也可以用于企业内部信息检索、文档管理系统等多个领域。通过学习和实践这些经典实例,开发者能够掌握如何利用Lucene构建高效的...
它是Java编写的一个高性能、可扩展的信息检索库,被广泛应用于各种搜索引擎的构建。在这个"一个关于lucene实例"的压缩包中,很可能是为了帮助初学者理解并掌握Lucene的基本用法和核心概念。 Lucene的主要功能包括...
在Lucene 3.6中,首先需要创建一个IndexWriter实例,用于构建和更新索引。IndexWriter配置了各种参数,如分词器(Analyzer)、写入模式等。接着,通过addDocument()方法将一个个文档添加到索引中。每个文档由多个...
在“Lucene.NET 搜索实例 源码 VS2008”这个项目中,我们主要探讨如何使用 Lucene.NET 在 Visual Studio 2008 开发环境中构建一个完整的搜索应用。下面将详细介绍几个关键的知识点: 1. **索引创建**:Lucene.NET ...
在信息技术领域,搜索引擎已经成为数据检索不可或缺的一部分,而Apache Lucene则是其中的佼佼者,它是一个开源的全文检索库,为开发者提供了强大的文本搜索功能。本文将深入探讨Lucene数据库的实例应用,帮助读者更...
通过添加多个TermQuery或其他Query子类实例到BooleanQuery来构建复杂的逻辑查询。 举例来说,以下是如何创建一个"星期一"和"五月一日"的逻辑组合查询: ```java Term term1 = new Term("content", "星期一"); Term ...
这个压缩包中的内容可能是关于如何使用Lucene进行全文检索的一个基础教程和示例代码。 **一、Lucene的基本概念** 1. **文档(Document)**:在Lucene中,每个要被搜索的信息被看作一个文档,可以包含多个字段...
这个源码实例对于学习Lucene和构建自己的搜索引擎非常有帮助,通过阅读和理解代码,可以掌握Lucene的核心概念和操作,同时也能了解到如何将搜索结果与数据库交互,实现数据持久化。对于Java开发者来说,这是一个绝佳...
在创建索引时,可以通过创建多个`IndexWriter`实例,将一个文档根据需求拆分为多个包含部分字段的文档,分别添加到不同的索引中。 二、多索引整合与并行搜索 为了整合多个目录下的索引进行并行搜索,可以使用`...
首先,构建一个`Query`对象,如`TermQuery`或`BooleanQuery`。然后,使用`IndexSearcher`的`search()`方法执行查询,返回匹配的`ScoreDoc`数组。最后,使用`HitCollector`或`TopDocs`来获取结果。 7. **查询解析器...
每个文档包含一个或多个字段,每个字段都有相应的分析器处理其内容。 2. **搜索过程**:索引完成后,使用 IndexSearcher 和 QueryParser 构建查询,执行搜索。然后,通过 ScoreDoc 对搜索结果进行排序,并获取高分...
3. 域(Field):文档由多个域构成,每个域代表一个特定的信息,如文件名、内容等。 4. 词(Term):域内的数据经过分词器(Analyzer)处理,转化为一个个独立的词,这些词是搜索的基本单位。 四、Lucene模块详解 1...
在本实例中,我们将深入探讨Lucene3的核心概念、主要组件以及如何通过具体代码实现来利用这些组件进行文本检索。 1. **核心概念** - **索引**: Lucene3的主要任务是创建和维护一个索引,它将文本数据转化为便于...
在Lucene 3.0版本中,它已经相当成熟且稳定,为开发者提供了一个构建高效搜索应用的框架。 二、Lucene 3.0核心概念 1. 文档(Document):文档是信息的基本单位,可以包含多个字段(Field),如标题、内容等。 2. ...
2. **构造布尔查询**: 使用`BooleanQuery.Builder`创建一个查询实例,然后添加子查询,每个子查询都是一个`Query`对象,如`TermQuery`或`WildcardQuery`,并指定其对应的布尔运算符。 3. **设置查询权重**: 如果...
`(代表一个字符)和`*`(代表零个或多个字符)进行模糊匹配,如`new WildcardQuery(new Term("field", "key?ord"))`。 3. **SynonymFilter**:通过在索引阶段使用同义词过滤器,将同义词关联起来,使得在查询时...
搜索是通过`IndexSearcher`对象进行的,它接受一个`Query`对象,如`TermQuery`或`BooleanQuery`,然后返回匹配的文档列表。查询语句可以是简单的关键词,也可以是复杂的布尔表达式。Lucene还支持评分系统,用于衡量...
Lucene 是一个用于构建全文检索应用程序的库,它包含了对文本进行索引和搜索所需的各种工具和技术。Lucene 不是一个即插即用的解决方案,而是需要开发者根据自己的需求来设计和实现搜索功能。 1.2 全文检索 全文...
在IT领域,Lucene是一个非常重要的全文检索库,由Apache软件基金会开发,广泛应用于各种搜索引擎的构建。这个压缩包文件“lucene开发部分例子”包含了关于Lucene开发的一些实例,涵盖了从基础到进阶的多个方面,对于...