`

Lucene查询对象浅析(一)

阅读更多

Lucene作为一个开源的搜索工具包,它为开发人员提供了丰富的查询方法,总结如下:

 

第一种:TermQuery.TermQuery是Lucene里面最基本的一种原子查询。开发人员可以通过它来检索索引中含有指定词条的Document。代码如下:

public static void main(String[] args) throws IOException {

		createIndex();

		termQuery();
		
}


private static void createIndex() throws IOException {
		IndexWriter writer = new IndexWriter(STORE_PATH,
				new StandardAnalyzer(), true);
		writer.setUseCompoundFile(false);
		Document doc1 = new Document();
		Document doc2 = new Document();
		Field field = new Field("PostTitle", "Lucene开发浅谈", Field.Store.YES,
				Field.Index.TOKENIZED);
		Field field1 = new Field("PostContent", "Lucene是一个开源的搜索工具包",
				Field.Store.YES, Field.Index.TOKENIZED);
		doc1.add(field);
		doc1.add(field1);

		Field field2 = new Field("PostTitle", "云计算浅谈", Field.Store.YES,
				Field.Index.TOKENIZED);
		Field field3 = new Field("PostContent",
				"云计算是一种基于 Web 的服务,它使得普通计算机拥有超级计算机的能力", Field.Store.NO,
				Field.Index.TOKENIZED);
		doc2.add(field2);
		doc2.add(field3);
		writer.addDocument(doc1);
		writer.addDocument(doc2);
		writer.close();
}

private static void termQuery() throws IOException {

		IndexSearcher searcher = new IndexSearcher(STORE_PATH);
		Term term = new Term("PostContent", "lucene");
		Query termQuery = new TermQuery(term);
		Hits hits = searcher.search(termQuery);
		System.out.println("TermQuery demo------");
		System.out.println("hits.length()==" + hits.length());
		for (int i = 0; i < hits.length(); i++) {

			System.out.println(hits.doc(i));
		}
}
运行结果如下:
TermQuery demo------
hits.length()==1
Document<stored/uncompressed,indexed,tokenized<PostTitle:Lucene开发浅谈> stored/uncompressed,indexed,tokenized<PostContent:Lucene是一个开源的搜索工具包>>


   第二种:BooleanQuery。布尔查询其实就是将各种查询的结果再进行布尔运算,最后在得到查询结果。其中具体的组合方式有如下几种:

    1 MUST,MUST

    2 MUST,MUST_NOT

    3 MUST_SHOULD

    4 MUST_NOT,SHOULD.

    5 SHOULD,SHOULD

    6  MUST_NOT,MUST_NOT

    具体代码如下:

 

public static void main(String[] args) throws IOException {

		createIndex();

		booleanQuery();
		
}

private static void booleanQuery() throws IOException {

		IndexSearcher searcher = new IndexSearcher(STORE_PATH);

		Term term1 = new Term("PostTitle", "谈");
		Term term2 = new Term("PostContent", "源");

		TermQuery termquery1 = new TermQuery(term1);
		TermQuery termquery2 = new TermQuery(term2);

		BooleanQuery query = new BooleanQuery();
		query.add(termquery1, BooleanClause.Occur.MUST);
		query.add(termquery2, BooleanClause.Occur.MUST);
		Hits hits = searcher.search(query);
		System.out.println("BooleanQuery demo with MUST and MUST -------");
		System.out.println("hits.length()==" + hits.length());
		for (int i = 0; i < hits.length(); i++) {

			System.out.println(hits.doc(i));
		}
		System.out.println("-----------------------------------");

		BooleanQuery query1 = new BooleanQuery();
		query1.add(termquery1, BooleanClause.Occur.MUST);
		query1.add(termquery2, BooleanClause.Occur.MUST_NOT);
		Hits hits1 = searcher.search(query1);
		System.out.println("BooleanQuery demo with MUST and MUST_NOT -------");
		System.out.println("hits.length()==" + hits1.length());
		for (int i = 0; i < hits1.length(); i++) {

			System.out.println(hits1.doc(i));
		}

		System.out.println("-----------------------------------");

		BooleanQuery query2 = new BooleanQuery();
		query2.add(termquery1, BooleanClause.Occur.SHOULD);
		query2.add(termquery2, BooleanClause.Occur.MUST_NOT);
		Hits hits2 = searcher.search(query2);
		System.out.println("BooleanQuery demo with SHOULD and MUST_NOT -------");
		System.out.println("hits.length()==" + hits2.length());
		for (int i = 0; i < hits2.length(); i++) {

			System.out.println(hits2.doc(i));
		}
		
		System.out.println("-----------------------------------");
		
	    Term term3 = new Term("PostTitle","lucene");
		Term term4 = new Term("PostContent","云");
		TermQuery termquery3 = new TermQuery(term3);
		TermQuery termquery4 = new TermQuery(term4);
		
	    BooleanQuery query3 = new BooleanQuery();
		query3.add(termquery3, BooleanClause.Occur.SHOULD);
		query3.add(termquery4, BooleanClause.Occur.SHOULD);
		Hits hits3 = searcher.search(query3);
		System.out.println("BooleanQuery demo with SHOULD and SHOULD -------");
		System.out.println("hits.length()==" + hits3.length());
		for (int i = 0; i < hits3.length(); i++) {

			System.out.println(hits3.doc(i));
		}
}

 

 运行结果如下:

 

BooleanQuery demo with MUST and MUST -------
hits.length()==1
Document<stored/uncompressed,indexed,tokenized<PostTitle:Lucene开发浅谈> stored/uncompressed,indexed,tokenized<PostContent:Lucene是一个开源的搜索工具包>>
-----------------------------------
BooleanQuery demo with MUST and MUST_NOT -------
hits.length()==1
Document<stored/uncompressed,indexed,tokenized<PostTitle:云计算浅谈>>
-----------------------------------
BooleanQuery demo with SHOULD and MUST_NOT -------
hits.length()==1
Document<stored/uncompressed,indexed,tokenized<PostTitle:云计算浅谈>>
-----------------------------------
BooleanQuery demo with SHOULD and SHOULD -------
hits.length()==2
Document<stored/uncompressed,indexed,tokenized<PostTitle:Lucene开发浅谈> stored/uncompressed,indexed,tokenized<PostContent:Lucene是一个开源的搜索工具包>>
Document<stored/uncompressed,indexed,tokenized<PostTitle:云计算浅谈>>

 

 

其中Should和must组合时,检索结果为must的结果,当于must_not结合时就相当于must和must_not.

 

第三种:RangeQuery。范围查询顾名思意就是给定一个方位来查询,比如查询用户ID在“10001-10005”之间的用户等。具体的代码如下:

 

private static void rangeQuery() throws IOException {

		IndexWriter writer = new IndexWriter(STORE_PATH,
				new StandardAnalyzer(), true);
		Field field1 = new Field("userID", "10001", Field.Store.YES,
				Field.Index.TOKENIZED);
		Field field2 = new Field("userID", "10002", Field.Store.YES,
				Field.Index.TOKENIZED);
		Field field3 = new Field("userID", "10003", Field.Store.YES,
				Field.Index.TOKENIZED);
		Field field4 = new Field("userID", "10004", Field.Store.YES,
				Field.Index.TOKENIZED);
		Field field5 = new Field("userID", "10005", Field.Store.YES,
				Field.Index.TOKENIZED);
		Document doc1 = new Document();
		Document doc2 = new Document();
		Document doc3 = new Document();
		Document doc4 = new Document();
		Document doc5 = new Document();
		doc1.add(field1);
		doc2.add(field2);
		doc3.add(field3);
		doc4.add(field4);
		doc5.add(field5);

		writer.addDocument(doc1);
		writer.addDocument(doc2);
		writer.addDocument(doc3);
		writer.addDocument(doc4);
		writer.addDocument(doc5);

		writer.close();

		IndexSearcher searcher = new IndexSearcher(STORE_PATH);
		Term start = new Term("userID", "10001");
		Term end = new Term("userID", "10002");

		RangeQuery query = new RangeQuery(start, end, true);

		Hits hits = searcher.search(query);
		System.out.println("RangeQuery demo------");
		System.out.println("hits.length()==" + hits.length());
		for (int i = 0; i < hits.length(); i++) {

			System.out.println(hits.doc(i));
		}
	}

 

 

运行结果如下:

RangeQuery demo------
hits.length()==5
Document<stored/uncompressed,indexed,tokenized<userID:10001>>
Document<stored/uncompressed,indexed,tokenized<userID:10002>>
Document<stored/uncompressed,indexed,tokenized<userID:10003>>
Document<stored/uncompressed,indexed,tokenized<userID:10004>>
Document<stored/uncompressed,indexed,tokenized<userID:10005>>

 其中RangeQuery构造函数的第三个参数是用来指定是否包含边界值,如果是true,就是闭区间,如果为false则为开区间。

4
2
分享到:
评论

相关推荐

    Lucene3.0浅析

    Lucene3.0浅析Lucene3.0浅析Lucene3.0浅析Lucene3.0浅析

    lucene的查询语法事例

    **Lucene查询语法详解** Apache Lucene是一款高性能、全文本搜索库,被广泛应用于各种搜索引擎的构建。在使用Lucene进行信息检索时,理解和掌握其查询语法至关重要。本篇文章将深入探讨Lucene的查询语法,帮助你更...

    lucene查询工具类和IndexSearcher分页查询示例

    `IndexSearcher`是Lucene中的核心组件之一,用于执行对索引的查询。它允许我们执行匹配文档的搜索,计算评分,并获取匹配的文档ID。为了使用`IndexSearcher`,我们需要创建一个`Directory`对象,该对象指向包含索引...

    Lucene3.0之查询类型详解

    在Lucene3.0中,查询处理是一个关键环节,涉及多种查询方式和理论模型。以下是对这些概念的详细解释: 1. **查询方式**: - **顺序查询**:是最简单的查询方式,直接遍历索引,效率较低。 - **索引查询**:基于预...

    lucene查询结果集分页代码

    而我们可以将这两种方式结合下,每次查询都多缓存一部分的结果集,翻页的时候看看所查询的内容是不是在已经存在在缓存当中,如果已经存在了就直接拿出来,如果不存在,就进行查询后,从缓存中读出来. 比如:现在我们有一个...

    lucene表达式处理查询

    Lucene表达式查询是基于Analyzer和QueryParser实现的,它们负责将用户的输入转换为可执行的查询对象。Analyzer用于分词,QueryParser则解析这些词汇并生成对应的查询结构。这种查询方式提供了更大的灵活性和精确性,...

    lucene实现索引查询

    5. **解析查询**:`queryParser.parse()`方法接受用户输入的查询关键字,返回一个Query对象。 6. **创建查询器**:`IndexSearcher`执行查询,传入索引读取器和是否开启多线程。 7. **执行查询**:调用`...

    Lucene 索引的简单使用

    Lucene,作为Apache软件基金会的一个开源项目,是Java平台上的全文检索库,它提供了文本检索的核心工具,使得开发者能够快速地在应用程序中实现高级的搜索功能。本篇文章将详细阐述如何使用Lucene来创建和查询索引,...

    Lucene时间区间搜索

    在上面的代码中,`DateTools.DateToString`方法将DateTime对象转换为Lucene可理解的字符串格式,然后创建了一个包含这两个时间点的闭合范围查询。这里的“true”参数表示边界是包含的。 接下来,我们需要将这个...

    Lucene的一个毕业设计

    1. **查询解析**:用户输入的查询字符串需要通过 QueryParser 或 MultiFieldQueryParser 转换为 Lucene 查询对象。这些解析器会处理语法,识别短语、布尔运算符、通配符等。 2. **搜索执行**:使用 IndexSearcher ...

    lucene做索引查询流程

    lucene 做索引查询流程,来自《lucene in action》

    lucene与数据库连接进行查询

    2. **文档对象创建**:为每个数据库记录创建一个 Lucene 的 `Document` 对象,将字段映射到文档的字段中,例如,数据库中的“标题”对应 Lucene 文档的“title”字段。 3. **索引构建**:使用 `IndexWriter` 将 `...

    lucene 多字段查询+文字高亮显示

    Lucene支持这种多字段查询,你可以通过构建复杂的Query对象来实现。例如,可以创建一个BooleanQuery,将各个字段的Query子句以AND、OR或NOT的关系组合起来。此外,还可以使用MultiFieldQueryParser,它允许指定一组...

    Lucene分词与查询详解

    5. **评分(Scoring)**:Lucene会根据查询和文档的相关性给出一个分数,决定搜索结果的排序。TF-IDF(Term Frequency-Inverse Document Frequency)是最常用的评分算法。 现在,我们详细讲解如何在Lucene中进行...

    Lucene索引和查询

    查询阶段,用户输入查询字符串,Lucene将这个字符串转换为查询对象,然后与索引进行匹配。查询操作通常包括以下步骤: - 查询分析(Query Parsing):将用户的输入转换为查询语法,可能涉及短语查询、布尔查询等。 ...

    lucene facet查询示例

    **Lucene Facet查询详解** Lucene是一款强大的全文搜索引擎库,广泛应用于各种信息检索系统。在处理大量数据时,为了帮助用户快速、有效地探索和理解数据,Lucene引入了Facets(方面)功能,它提供了分类浏览和统计...

    lucene的一个实用例子

    5. **搜索(Search)**:Lucene 提供了查询解析器(QueryParser)和查询对象(Query)来构造搜索条件。用户可以使用布尔运算符、短语查询、范围查询等多种方式构建复杂的查询。 6. **排序与评分(Scoring)**:...

    Lucene5学习之分页查询

    本文将深入探讨"Lucene5学习之分页查询"这一主题,结合给定的标签"源码"和"工具",我们将讨论如何在Lucene5中实现高效的分页查询,并探讨其背后的源码实现。 首先,理解分页查询的重要性是必要的。在大型数据集的...

    Lucene建索引及查询关键字

    在Eclipse环境中运用java,Lucene建索引及查询关键字

Global site tag (gtag.js) - Google Analytics