`

多个 TermQuery或一个MultiFieldQueryParser构建BooleanQuery多个域的检索学习实例代码

阅读更多
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();
}
}
}
}



分享到:
评论

相关推荐

    lunces入门资料

    如常见的TermQuery就是将一个简单的关键字进行封装后的对象,类似的还有BooleanQuery,即布尔型的查找。 IndexSearcher对象的search方法中总是需要一个Query对象(或是Query子类的对象),本节就来介绍各种Query类...

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

    4.10. MultiFieldQueryParser类--多域搜索 13 4.11. MultiSearcher类--多个索引搜索 13 4.12. ParalellMultiSearcher类---多线程搜索 14 5. 排序 14 5.1. Sort类 14 5.2. SortField类 14 5.3. 指定排序的法则 15 ...

    基于lucene的搜索引擎总结

    不允许使用多个IndexWriter或IndexReader实例同时对一个索引进行修改 IndexWriter和IndexReader是线程安全的,可以被多线程共享 全文索引/搜索 中文分词器 最大匹配法(机械分词):按照一定的策略将待分析的汉字串...

    lucene第一天完整代码

    @Test ... BooleanQuery booleanQuery = new BooleanQuery(); Query query1 = new TermQuery(new Term("fileName","apache")); Query query2 = new TermQuery(new Term("fileName","lucene"));

    Lucene 3.6 学习笔记

    (5) 多条件查询(BooleanQuery) 12 (6) 短语查询(PhraseQuery) 12 (7) 模糊查询(FuzzyQuery) 12 3.3 QueryParser 13 (1) 创建QueryParser 13 (2) 各种匹配方式 13 3.4 分页搜索 14 (1) 普通分页 14 (2) search...

    lucene2.9.1所有最新开发包及源码及文档

    ★3) 文档由若干域(Field)组成:文件的属性(文件路径,文件的内容)映射成一个域。记录的某个字段映射成一个域。 ☆4) 域由若干词(关键字)(Term)组成:文件的属性的内容中某个字符串映射成一个词。 4. Lucene包...

    lucene2.9.1完整DEMO及开发文档

    //创建一个语法分析器 IndexWriter iwriter = null; Directory directory = null; try { directory = FSDirectory.open(destDir); //把索引文件存储到磁盘目录 //创建一个IndexWriter(存放索引文件的目录...

    基于Term-Query-URL异构信息网络的查询推荐* (2014年)

    查询推荐是一种帮助搜索引擎更好的理解用户检索需求的方法.基于查询的上下文片段训练词汇和查询之间的语义关系,同时结合查询和URL的点击图以及查询中的序列行为构建Term-Query-URL异构信息网络,采用重启动随机...

    InformationRetrievalWithLucene

    使用Lucene实现一个IR系统 功能: 索引:1.创建索引 2.delete index 3.add index 4.update index 搜索: 1.termQuery 2.multiFieldQuery 3.booleanQuery 4.prefixQuery 5.phraseQuery 6.multiPhraseQuery 7....

    lucene-sequence-diagram:lucene搜索端uml时序图,lucene源码解析

    只考虑最简单的查询,比如只对一个字段,用一个term去查,即TermQuery;然后索引也只有一个segment,简单的情况利于理解。 步骤 以下只描述了几个重要步骤,包含了加权,读取索引文件,收集,评分,分页这几个重要...

    ESPractice:SpringBoot+ES+RabbitMQ实现搜索的示例

    包含常用操作,没有业务代码干扰,拿来即可用主要包含的内容:ES创建Index Mapping的全过程(包含日期 数组映射,中文分词等)ES对Document的增删改查与业务逻辑的结合ES常用查询(包含boolQuery filter termQuery ...

    elasticsearch中term与match的区别讲解

    今天小编就为大家分享一篇关于elasticsearch中term与match的区别讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    SpringBoot整合es源码

    SpringBoot整合es源码, 包括详细的批量操作 bulk, 批量导入, 查询所有, 分页, termQuery:词条查询, matchQuery:词条分词查询, 模糊查询:WildcardQuery, 模糊查询:regexpQuery, 模糊查询:perfixQuery, 范围查询:...

Global site tag (gtag.js) - Google Analytics