转自:<a href="http://zhxmyself.iteye.com/blog/466066">http://zhxmyself.iteye.com/blog/466066</a>
应用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 {
-
-
-
-
- public static void main(String[] args) {
-
- String IDNEX_PATH = "Z:/data/paoding/test_index";
-
- String FIELD_NAME = "field_name";
-
- String FIELD_CONTENT = "field_content";
-
- 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) {
-
- e.printStackTrace();
- } catch (LockObtainFailedException e) {
-
- e.printStackTrace();
- } catch (IOException e) {
-
- e.printStackTrace();
- }
-
- }
-
- }
分享到:
相关推荐
@Test ... BooleanQuery booleanQuery = new BooleanQuery(); Query query1 = new TermQuery(new Term("fileName","apache")); Query query2 = new TermQuery(new Term("fileName","lucene"));
支持许多强大的查询类型,比如 PhraseQuery、WildcardQuery、RangeQuery、FuzzyQuery、BooleanQuery 等。 支持解析人们输入的丰富查询表达式。 允许用户使用定制排序、过滤和查询表达式解析扩展搜索行为。 使用基于...
如常见的TermQuery就是将一个简单的关键字进行封装后的对象,类似的还有BooleanQuery,即布尔型的查找。 IndexSearcher对象的search方法中总是需要一个Query对象(或是Query子类的对象),本节就来介绍各种Query类...
Lucene创建索引,查询索引的简单使用。
// BooleanQuery query = new BooleanQuery(); // query.add(query1, Occur.SHOULD); // query.add(query2, Occur.SHOULD); // QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_CURRENT, new ...
9.4. 按“与或”搜索—BooleanQuery 19 9.5. 在某一范围内搜索—RangeQuery 19 9.6. 使用前缀搜索—PrefixQuery 19 9.7. 短语搜索—PhraseQuery 20 9.8. 多短语搜索—MultiPhraseQuery 20 9.9. 模糊搜索—FuzzyQuery...
(3) 创建Term和TermQuery 9 (5) 根据TopDocs获取ScoreDoc 9 (6) 根据ScoreDoc获取相应文档 9 3.2 其他搜索 9 (1) 范围查询(TermRangeQuery) 10 (2) 数字查询(NumericRangeQuery) 11 (3) 前缀查询(PrefixQuery)...
信息检索 使用Lucene实现一个IR系统 ... 1.termQuery 2.multiFieldQuery 3.booleanQuery 4.prefixQuery 5.phraseQuery 6.multiPhraseQuery 7.regexpQuery 8.fuzzyQuery 9.queryparser 10.sort 11.filter
提供了索引搜索器IndexSearcher类和各种Query类,如TermQuery、BooleanQuery等。 6) queryParser模块:负责查询语句的语法分析。提供了解析查询语句的QueryParser类 7) util模块:包含一些公共工具类。 5. 创建...
Lucene7.4检索和打分过程的源代码阅读思路,这里只针对用BooleanQuery作为Query,从IndexSearch说起,从检索到打分的过程,还加入了自己的无关的一些想法,忽略即可。
特详细易懂的《Elasticsearch入门讲解》,包含Elasticsearch使用场景、数据类型、数据映射、BooleanQuery、聚合查询等内容的讲解。是我根据自己的理解,转化为通熟易懂的话,来呈现给大家。