有时用户会需要一种在一个范围内查找某个文档,比如查找某一时间段内的所有文档,此时,Lucene提供了一种名为RangeQuery的类来满足这种需求。

RangeQuery表示在某范围内的搜索条件,实现从一个开始词条到一个结束词条的搜索功能,在查询时“开始词条”和“结束词条”可以被包含在内也可以不被包含在内。它的具体用法如下:

RangeQuery query = new RangeQuery(begin, end, included);

在参数列表中,最后一个boolean值表示是否包含边界条件本身,即当其为TRUE时,表示包含边界值,用字符可以表示为“[begin TO end]”;当其为FALSE时,表示不包含边界值,用字符可以表示为“{begin TO end}”。

 RangeQueryTest.java

package ch11;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.Term;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.RangeQuery;

public class RangeQueryTest {

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

         //生成文档对象,下同

         Document doc1 = new Document();

         //添加“time”字段中的内容,下同

         doc1.add(Field.Text("time", "200001"));

         //添加“title”字段中的内容,下同

         doc1.add(Field.Keyword("title", "doc1"));

         Document doc2 = new Document();

         doc2.add(Field.Text("time", "200002"));

         doc2.add(Field.Keyword("title", "doc2"));

         Document doc3 = new Document();

         doc3.add(Field.Text("time", "200003"));

         doc3.add(Field.Keyword("title", "doc3"));

         Document doc4 = new Document();

         doc4.add(Field.Text("time", "200004"));

         doc4.add(Field.Keyword("title", "doc4"));

         Document doc5 = new Document();

         doc5.add(Field.Text("time", "200005"));

         doc5.add(Field.Keyword("title", "doc5"));

         //生成索引书写器

         IndexWriter writer = new IndexWriter("c://index", new StandardAnalyzer(), true);

         //设置为混合索引格式

          writer.setUseCompoundFile(true);

         //将文档对象添加到索引中

         writer.addDocument(doc1);

         writer.addDocument(doc2);

         writer.addDocument(doc3);

         writer.addDocument(doc4);

         writer.addDocument(doc5);

         //关闭索引

         writer.close();

         //生成索引搜索器

         IndexSearcher searcher = new IndexSearcher("c://index");

         //构造词条

         Term beginTime = new Term("time","200001");

         Term endTime = new Term("time","200005");

         //用于保存检索结果

         Hits hits = null;

         //生成RangeQuery对象,初始化为null

         RangeQuery query = null;

         //构造RangeQuery对象,检索条件中不包含边界值

         query = new RangeQuery(beginTime, endTime, false);

         //开始检索,并返回检索结果

         hits = searcher.search(query);

         //输出检索结果的相关信息

         printResult(hits, "从200001~200005的文档,不包括200001和200005");

         //再构造一个RangeQuery对象,检索条件中包含边界值

         query = new RangeQuery(beginTime, endTime, true);

         //开始第二次检索

         hits = searcher.search(query);

         //输出检索结果的相关信息

         printResult(hits, "从200001~200005的文档,包括200001和200005");

     }

     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.print("找到");

                 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词条,然后构造了一个RangeQuery对象。在初始化RangeQuery对象的时候,使用构造的两个Term词条作为RangeQuery构造函数的参数。前面已经说过,RangeQuery的构造函数中的两个参数分别称为“开始词条”和“结束词条”,它的含义也就是查找介于这两者之间的所有Document。

代码使用RangeQuery共进行了两次检索,第一次的检索条件中不包括边界值,第二次的检索条件中包括边界值。

第1次使用FALSE参数构造的RangeQuery对象不包括2个边界值,因此只返回3个Document,而第2次使用TRUE参数构造的RangeQuery则包括2个边界值,因此将5个Document全部返回了。

lucene-查询query->RangeQuery在某一范围内搜索的更多相关文章

  1. Lucene 查询(Query)子类

    QueryParser(单域查询) QueryParser子类对单个域查询时创建查询query,构造方法中需要传入Lucene版本号,检索域名和分词器. QueryParser parser = ne ...

  2. Lucene 06 - 使用Lucene的Query API查询数据

    目录 1 Query对象的创建(方式一): 使用子类对象 1.1 常用的Query子类对象 1.2 常用的Query子类对象使用 1.2.1 使用TermQuery 1.2.2 使用NumericRa ...

  3. lucene 查询 (转载)

    原网址:http://hi.baidu.com/lszhuhaichao/blog/item/ccffc7cb858f1514bf09e66f.html Lucene3.0之查询处理(1):原理201 ...

  4. lucene查询解析器语法

    注意:使用QueryParser查询,关键词是会被分词的,如果不需要分词,可以选择使用Lucene提供的API查询类. Lucene提供了丰富的API来组合定制你所需要的查询器,同时也可以利用Quer ...

  5. Lucene 查询原理 传统二级索引方案 倒排链合并 倒排索引 跳表 位图

    提问: 1.倒排索引与传统数据库的索引相比优势? 2.在lucene中如果想做范围查找,根据上面的FST模型可以看出来,需要遍历FST找到包含这个range的一个点然后进入对应的倒排链,然后进行求并集 ...

  6. Lucene 查询工具 LQT

    Lucene Query Tool (lqt) 是一个命令行工具用来执行 Lucene 查询并对结果进行格式化输出. 使用方法: 01 $ ./lqt 02 usage: LuceneQueryToo ...

  7. Lucene查询索引(分页)

    分页查询只需传入每页显示记录数和当前页就可以实现分页查询功能 Lucene分页查询是对搜索返回的结果进行分页,而不是对搜索结果的总数量进行分页,因此我们搜索的时候都是返回前n条记录 package c ...

  8. 第六步:Lucene查询索引(优化一)

    package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...

  9. 第六步:Lucene查询索引

    package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...

  10. lucene 查询的使用

    各种查询方式一:使用QueryParser与查询语法.(会使用分词器) MultiFieldQueryParser查询字符串 ------------------------> Query对象 ...

随机推荐

  1. php一句话后门过狗姿势万千之传输层加工(1)

    写在前面:过狗相关的资料网上也是有很多,所以在我接下来的文章中,可能观点或者举例可能会与网上部分雷同,或者表述不够全面.但是我只能说,我所传达给大家的信息,是我目前所掌握或者了解的,不能保证所有人都会 ...

  2. 画图解释 SQL join 语句

    转:http://blog.jobbole.com/40443/ 本文由 伯乐在线 - 奇风余谷 翻译.未经许可,禁止转载!英文出处:Jeff Atwood.欢迎加入翻译组. 我认为 Ligaya T ...

  3. html-webpack-plugin插件的详细介绍和使用

    var webpack = require('webpack'); var HtmlWebpackPlugin = require('html-webpack-plugin'); module.exp ...

  4. Java核心技术点之反射

    1. 概述 Java 反射是可以让我们在运行时获取类的方法.属性.父类.接口等类的内部信息的机制.也就是说,反射本质上是一个“反着来”的过程.我们通过new创建一个类的实例时,实际上是由Java虚拟机 ...

  5. Java设计模式之-----策略模式

    首先,我们来看下策略模式的概念.一般的解释如下:     策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The St ...

  6. 十大经典排序算法总结——JavaScrip版

    首先,对于评述算法优劣术语的说明: 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面:即排序后2个相等键值的顺序和排序之前它们的顺序相同 不稳定:如果a原本在b的前面,而a=b,排序之后a ...

  7. netcore 控制台中文乱码

    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Console.OutputEncoding = Encoding.Get ...

  8. c++ 头文件

    可以将程序分为二部分: 头文件:包含结构声明和使用这些结构的函数的原型 源代码文件: 包含与结构有关的函数的代码 不要将函数的定义或变量的声明放在头文件里, 一般头文件可以包含以下内容 >函数原 ...

  9. github上最全的资源教程-前端涉及的所有知识体系

    前面分享了前端入门资源汇总,今天分享下前端所有的知识体系. 个人站长对个人综合素质要求还是比较高的,要想打造多拉斯自媒体网站,不花点心血是很难成功的,学习前端是必不可少的一个环节, 当然你不一定要成为 ...

  10. 一例完整的websocket实现群聊demo

    前言 业余我都会花一些时间在tcp.http和websocket等领域的学习,现在觉得有点收获,所以把一个基于websocket的群聊功能的例子提供给大家玩玩.当然这是一个很完整的例子,包括webso ...