有时用户会需要一种在一个范围内查找某个文档,比如查找某一时间段内的所有文档,此时,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. 1.使用using释放资源

    using语句有二个关键字 >>作为关键字,using可以导入命名空间 >>作为C#语句,using可以释放对象占用的内存资源 语法: using(SqlConnection ...

  2. javascript一些小问题

    1.async 类型:Boolean 默认值: true.默认设置下,所有请求均为异步请求.如果需要发送同步请求,请将此选项设置为 false. 注意,同步请求将锁住浏览器,用户其它操作必须等待请求完 ...

  3. mui禁止横屏显示,仅支持竖屏显示

    mui.plusReady(function () { plus.screen.lockOrientation("portrait-primary"); });

  4. BZOJ 2190: [SDOI2008]仪仗队

    2190: [SDOI2008]仪仗队 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2689  Solved: 1713[Submit][Statu ...

  5. BZOJ 2705: [SDOI2012]Longge的问题

    2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2554  Solved: 1566[Submit][ ...

  6. Centos5.8 安装SVN并配置HTTP访问

    安装 svn sudo yum install subversion 测试 svn --version 安装 httpd 的 svn 模块 sudo yum install mod_dav_svn 前 ...

  7. .net AES加密解密

    using System;      using System.Collections.Generic;      using System.Text;      using System.Secur ...

  8. 2016 08 27 印刷菜单增加sql语句

    insert into `module` (`ID`, `CONSONANTCODE`, `CREATEDATE`, `DESCRIPTION`, `HANDLER`, `HASCHILD`, `IC ...

  9. DEDECMS之十 修改织梦链和文章的默认来源及作者

    今天在用织梦搭网站的时候,发现了两个问题,一个就是最新的dedecms5.7系统中默认会加上“织梦链”这一个链接组,织梦的做法是可以理解的, 但是给别人做网站,这些链接是不能要的,所以在数据库,模板文 ...

  10. UOJ #150 【NOIP2015】 运输计划

    题目描述 公元 \(2044\) 年,人类进入了宇宙纪元. \(L\) 国有 \(n\) 个星球,还有 \(n-1\) 条双向航道,每条航道建立在两个星球之间,这 \(n-1\) 条航道连通了 \(L ...