zoukankan      html  css  js  c++  java
  • lucene-查询query->RangeQuery在某一范围内搜索

    有时用户会需要一种在一个范围内查找某个文档,比如查找某一时间段内的所有文档,此时,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全部返回了。

  • 相关阅读:
    什么是ORM
    ORM优缺点
    Azure 中快速搭建 FTPS 服务
    连接到 Azure 上的 SQL Server 虚拟机(经典部署)
    在 Azure 虚拟机中配置 Always On 可用性组(经典)
    SQL Server 2014 虚拟机的自动备份 (Resource Manager)
    Azure 虚拟机上的 SQL Server 常见问题
    排查在 Azure 中新建 Windows 虚拟机时遇到的经典部署问题
    上传通用化 VHD 并使用它在 Azure 中创建新 VM
    排查在 Azure 中新建 Windows VM 时遇到的部署问题
  • 原文地址:https://www.cnblogs.com/hwaggLee/p/5232415.html
Copyright © 2011-2022 走看看