全文检索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、效果展示

  

原文地址:https://www.cnblogs.com/Zzzzn/p/12362522.html