zoukankan      html  css  js  c++  java
  • 全文检索Lucene框架---查询索引

    一、 Lucene索引库查询

      对要搜索的信息创建Query查询对象,Lucene会根据Query查询对象生成最终的查询语法,类似关系数据库Sql语法一样Lucene也有自己的查询语法,比如:“name:lucene”表示查询Field的name为“lucene”的文档信息。

      可通过两种方法创建查询对象:

      1)使用Lucene提供Query子类

      2)使用QueryParse解析查询表达式

    二、 TermQuery

      TermQuery,通过项查询,TermQuery不使用分析器所以建议匹配不分词的Field域查询,比如订单号、分类ID号等。

      指定要查询的域和要查询的关键词。

    1、代码实现

    package com.zn;
    
    import org.apache.lucene.document.Document;
    import org.apache.lucene.index.DirectoryReader;
    import org.apache.lucene.index.IndexReader;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.search.*;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import org.junit.jupiter.api.Test;
    
    import java.io.File;
    import java.io.IOException;
    
    /**
     * 查询索引
     */
    public class QueryTest {
    
        /**
         * 根据域或关键词进行搜索
         */
        @Test
        public void termQuery() throws IOException {
            Directory directory= FSDirectory.open(new File("E:\accp\Y2\进阶内容\Lucene\Lucene\Index").toPath());
            IndexReader indexReader= DirectoryReader.open(directory);
            IndexSearcher indexSearcher=new IndexSearcher(indexReader);
            //创建查询条件
            Query query=new TermQuery(new Term("fieldName","spring"));
            //执行查询
            TopDocs topDocs=indexSearcher.search(query,10);
            System.out.println("返回的文档个数:"+topDocs.totalHits);
    
            //获取到文档集合
            ScoreDoc [] scoreDocs=topDocs.scoreDocs;
            for (ScoreDoc doc:scoreDocs) {
                //获取到文档
                Document document = indexSearcher.doc(doc.doc);
                //获取到文档域中数据
                System.out.println("fieldName:"+document.get("fieldName"));
                System.out.println("fieldPath:"+document.get("fieldPath"));
                System.out.println("fieldSize:"+document.get("fieldSize"));
                System.out.println("fieldContent:"+document.get("fieldContent"));
                System.out.println("==============================================================");
            }
            //关闭
            indexReader.close();
        }
    }

    2、查询效果

      

    三、 RangeQuery数值查询

    1、代码实现

    package com.zn;
    
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.LongPoint;
    import org.apache.lucene.index.DirectoryReader;
    import org.apache.lucene.index.IndexReader;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.search.*;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import org.junit.jupiter.api.Test;
    
    import java.io.File;
    import java.io.IOException;
    
    /**
     * 查询索引
     */
    public class QueryTest {
        
        /**
         * RangeQuery:范围搜索
         */
        @Test
        public void rangeQuery() throws IOException {
            Directory directory= FSDirectory.open(new File("E:\accp\Y2\进阶内容\Lucene\Lucene\Index").toPath());
            IndexReader indexReader= DirectoryReader.open(directory);
            IndexSearcher indexSearcher=new IndexSearcher(indexReader);
            //创建查询条件
            //设置范围搜索的条件 参数一范围所在的域
            Query query= LongPoint.newRangeQuery("fieldSize",0,50);
            //查询
            TopDocs topDocs = indexSearcher.search(query, 10);
            System.out.println("返回的文档个数:"+topDocs.totalHits);
    
            //获取到文档集合
            ScoreDoc [] scoreDocs=topDocs.scoreDocs;
            for (ScoreDoc doc:scoreDocs) {
                //获取到文档
                Document document = indexSearcher.doc(doc.doc);
                //获取到文档域中数据
                System.out.println("fieldName:"+document.get("fieldName"));
                System.out.println("fieldPath:"+document.get("fieldPath"));
                System.out.println("fieldSize:"+document.get("fieldSize"));
                System.out.println("fieldContent:"+document.get("fieldContent"));
                System.out.println("==============================================================");
            }
    
            //关闭
            indexReader.close();
        }
    
    }

    2、查询效果

      

    四、 QueryParser

      通过QueryParser也可以创建QueryQueryParser提供一个Parse方法,此方法可以直接根据查询语法来查询。Query对象执行的查询语法可通过System.out.println(query);查询。

      需要使用到分析器。建议创建索引时使用的分析器和查询索引时使用的分析器要一致。

      需要加入queryParser依赖的jar包。

    1、导入依赖

        <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-queryparser -->
        <dependency>
          <groupId>org.apache.lucene</groupId>
          <artifactId>lucene-queryparser</artifactId>
          <version>7.4.0</version>
        </dependency>

    2、代码实现

    package com.zn;
    
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.LongPoint;
    import org.apache.lucene.index.DirectoryReader;
    import org.apache.lucene.index.IndexReader;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.queryparser.classic.ParseException;
    import org.apache.lucene.queryparser.classic.QueryParser;
    import org.apache.lucene.search.*;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import org.junit.jupiter.api.Test;
    import org.wltea.analyzer.lucene.IKAnalyzer;
    
    import java.io.File;
    import java.io.IOException;
    
    /**
     * 查询索引
     */
    public class QueryTest {
        
        /**
         * QueryParser:将搜索条件分词
         */
        @Test
        public void queryParser() throws IOException, ParseException {
            Directory directory= FSDirectory.open(new File("E:\accp\Y2\进阶内容\Lucene\Lucene\Index").toPath());
            IndexReader indexReader= DirectoryReader.open(directory);
            IndexSearcher indexSearcher=new IndexSearcher(indexReader);
            //创建QueryParser对象 参数一范围所在的域   参数二:使用哪种分析器
            QueryParser parser=new QueryParser("fieldContent",new IKAnalyzer());
            //设置匹配的数据条件
            Query query = parser.parse("新添加的文档的内容");
            //查询
            TopDocs topDocs = indexSearcher.search(query, 10);
            System.out.println("返回的文档个数:"+topDocs.totalHits);
    
            //获取到文档集合
            ScoreDoc [] scoreDocs=topDocs.scoreDocs;
            for (ScoreDoc doc:scoreDocs) {
                //获取到文档
                Document document = indexSearcher.doc(doc.doc);
                //获取到文档域中数据
                System.out.println("fieldName:"+document.get("fieldName"));
                System.out.println("fieldPath:"+document.get("fieldPath"));
                System.out.println("fieldSize:"+document.get("fieldSize"));
                System.out.println("fieldContent:"+document.get("fieldContent"));
                System.out.println("==============================================================");
            }
    
            //关闭
            indexReader.close();
        }
    
    }

    3、效果展示

      

  • 相关阅读:
    BZOJ 1036 树的统计
    codevs 4712 gcd与lcm问题
    codevs 1574 矩阵乘法
    Python定时任务框架APScheduler
    PHP集成支付宝快速实现充值功能
    玩转Web之easyui(二)-----easy ui 异步加载生成树节点(Tree),点击树生成tab(选项卡)
    玩转Web之easyui(一)-----easy ui datagird 分页
    Android访问服务器(TOMCAT)乱码引发的问题
    工厂方法模式--结合具体例子学习工厂方法模式
    简单工厂模式--结合实例学习简单工厂模式
  • 原文地址:https://www.cnblogs.com/Zzzzn/p/12362522.html
Copyright © 2011-2022 走看看