转自:<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();
- }
-
- }
-
- }
分享到:
相关推荐
- **Query**:表示用户查询,如TermQuery、BooleanQuery等。 - **Searcher**:执行搜索操作,如IndexSearcher。 - **Hit/ScoreDoc**:表示搜索结果的排名和分数。 4. **高级特性** - **多字段搜索**:一个文档...
在Lucene中,这包括创建Query对象,如TermQuery、BooleanQuery等,以及解析用户输入的查询字符串,将其转化为Query对象。理解如何正确构造和解析查询,能确保搜索引擎准确响应用户的意图。 "索引的管理"部分将介绍...
接着,构建一个`Query`对象,比如`TermQuery`、`WildcardQuery`或`BooleanQuery`等,它们对应不同的查询模式。使用`IndexSearcher`的`search(Query query, int n)`方法,可以找到与查询匹配的前n个文档,并返回一个`...
5. **查询构造**:学习使用QueryParser创建标准查询,以及如何使用TermQuery、BooleanQuery、WildcardQuery、PhraseQuery等不同类型的查询来满足复杂搜索需求。 6. **搜索执行**:通过Searcher对象执行查询,获取...
根据不同的查询需求,`Query`有多个子类,如`TermQuery`、`BooleanQuery`和`PrefixQuery`等。这些子类用于将用户的查询字符串转化为Lucene可以理解和执行的结构。 接着,我们关注`Term`类,它是Lucene中表示搜索的...
2. **Query构造**:Lucene提供多种Query类,如TermQuery、BooleanQuery、WildcardQuery等,可以根据需求构造复杂的查询条件。 3. **评分机制**:Lucene使用TF-IDF算法计算文档与查询的相关性,得分高的文档在搜索...
3. **查询(Query)**:学习如何创建查询对象,如`TermQuery`、`WildcardQuery`或`BooleanQuery`,以及如何使用`IndexSearcher`执行查询。 4. **评分与排序(Scoring and Sorting)**:Lucene根据相关性对搜索结果...
6. `Query`:表示一个搜索条件,例如,你可以创建`TermQuery`、`BooleanQuery`等。 7. `IndexReader`和`IndexSearcher`:分别用于读取索引和执行搜索。`IndexSearcher`使用`IndexReader`来访问索引,并执行`Query`。...
提供了索引搜索器IndexSearcher类和各种Query类,如TermQuery、BooleanQuery等。 6) queryParser模块:负责查询语句的语法分析。提供了解析查询语句的QueryParser类 7) util模块:包含一些公共工具类。 5. 创建...
6. **Query**:Lucene 提供了多种查询类型,如 TermQuery、BooleanQuery、WildcardQuery 等,它们对应不同的搜索逻辑。用户可以通过这些查询类型组合出复杂的搜索条件。 7. **Hit 和 Score**:搜索结果以 Hit 形式...
通过查看这些代码,你可以学习如何使用`TokenStream`进行自定义的文本分析,以及如何利用`TermQuery`、`BooleanQuery`和`WildcardQuery`等进行复杂查询。 在学习这些示例时,重点要理解以下几个关键概念: - **...
9. **Query**:表示搜索条件的抽象对象,如TermQuery(单个词查询)、BooleanQuery(布尔逻辑查询)等。 10. **Hit**:搜索结果中的一个匹配项,包含文档的相关信息,如文档ID、分数等。 **在Eclipse中运行Lucene...
在描述中提到的Leave_msg_project可能是演示如何在留言系统中使用Lucene的例子。在这个项目中,可能会有以下功能: - 用户提交留言时,使用Analyzer对留言内容进行分词并创建索引。 - 当用户搜索留言时,通过构建...
用户输入的查询字符串被解析成`Query`对象,Lucene.Net提供多种查询类型,如TermQuery、PhraseQuery、BooleanQuery等。`Analyzer`类用于处理查询字符串的分词,确保查询与索引中的词元匹配。 ### 4. 结果检索与排序...
查询解析器将用户的输入转换为Query对象,如TermQuery、BooleanQuery等。然后,Searcher执行查询,通过倒排索引(Inverted Index)找到相关文档。匹配度由评分函数(Scoring Function)确定,如TF-IDF算法。 4. **...