lucene-查询query->RangeQuery在某一范围内搜索

时间:2022-11-18 22:42:09

有时用户会需要一种在一个范围内查找某个文档,比如查找某一时间段内的所有文档,此时,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 查询&lpar;Query&rpar;子类

    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 查询原理 传统二级索引方案 倒排链合并 &Tab;倒排索引&Tab;跳表 位图

    提问: 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. &lbrack;Android&rsqb; adb&period;exe换了位置

    好久没有做android开发了,今天重新下载了新的sdk,发现adb.exe从sdk/tools里面消失了,添加了系统环境变量的路径就还是没法调动adb.exe命令,网上搜了一下原理是存在了新版的sd ...

  2. ie6-7 overflow&colon;hidden失效问题的解决方法

    即使父元素设置了overflow:hidden.解决这个bug很简单,在父元素中使用position:relative; zoom: 1;触发haslayout 即可解决该BUG.

  3. linux局域网不能相互访问

    1.关闭防火墙 /etc/init.d/iptable stop   2.关闭selinux   1.临时禁用SELinux: root@server# setenforce 0  这样重启服务器之后 ...

  4. &num;include &lt&semi;boost&sol;scoped&lowbar;array&period;hpp&gt&semi;

    多个元素使用#include <boost/scoped_array.hpp> 单个元素使用#include <boost/scoped_ptr.hpp> 作用域数组 作用域数 ...

  5. &lpar;转&rpar;Free函数的参数一定要是malloc返回的那个指针

    Free函数的参数一定要是malloc返回的那个指针   之前认为只要free的参数在malloc分配的区域之内就可以了, 现在发现不对的.在嵌入式里分配堆都是按照块来的,只要在这个块内系统就能识别, ...

  6. nginx源代码分析--读请求主体(1)

    首先,读取请求体已进入HTTP要求11相,我们需要做的请求正文部分处理一些模块,所以这个模块需要注册功能在这个阶段,在阅读功能要求的身体ngx_http_read_client_request_bod ...

  7. Ecological Premium - UVa10300

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/uva10300.html 题目描述 Pr ...

  8. highCharts实现简单柱形图

    js: function chart(data,title){ $('#container').highcharts({ chart: { type: 'bar' }, title: { text: ...

  9. 剑指Offer 8&period; 跳台阶 (递归)

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 题目地址 https://www.nowcoder.com/pract ...

  10. MySQL状态变量详解

    MySQL状态变量详解 mysql的状态变量(status variables)记录的mysql服务器的运行状态信息.查看语法如下: SHOW [GLOBAL | SESSION] STATUS; S ...