lucene&solr全文检索_3查询索引

创建完索引之后,我们需要查询。

百度的查询接口及结果如图所示:

具体步骤已经在上个博客中写到,直接上代码:(由于是一个完整的程序,我把创建索引的代码也post上)

package come.me.lucene;

import static org.junit.jupiter.api.Assertions.*;

import java.io.File;

import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.StoredField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.jupiter.api.Test;

public class FirstLucene {

    @Test
    public void testIndex() throws Exception{
        // TODO Auto-generated method stub
        //创建索引
//        第一步:创建一个java工程,并导入jar包。
//        第二步:创建一个indexwriter对象。
//        1)指定索引库的存放位置Directory对象
//        2)指定一个分析器,对文档内容进行分析。
        Directory directory =FSDirectory.open(new File("D:\\temp\\index"));//创建document对象
        Analyzer analyzer=new StandardAnalyzer();//官方推荐标准分析器
        IndexWriterConfig config=new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);//第一个变量为用的lucene版本号,第二个为分析器对象
        IndexWriter indexwriter =new IndexWriter(directory,config);

//        第三步:创建field对象,将field添加到document对象中。
        File f=new File("C:\\Users\\lenovo\\Desktop\\searchsource\\searchsource");
        File[] listFiles = f.listFiles();
        for(File file: listFiles) {//遍历文件
            //由于对文件的某些属性不需要分析例如大小路径,所以field有很多个实现类,可以选择是否储存,是否分析,是否索引
//        第四步:创建document对象。
            Document document =new Document();
//            文件名字
            String file_name = file.getName();
            Field fileNameField=new TextField("fileName", file_name, Store.YES);
//            文件大小
            long file_size = FileUtils.sizeOf(file);//使用文件工具类获取文件大小
            Field fileSizeFiled=new LongField("fileSize", file_size, Store.YES);
//            文件路径
            String file_path = file.getPath();
            Field filePathField=new StoredField("filePath", file_path);
//            文件内容
            String file_content = FileUtils.readFileToString(file);//使用文件工具类获取文件内容
            Field fileContentField =new TextField("fileContent", file_content, Store.YES);
            document.add(fileNameField);
            document.add(fileSizeFiled);
            document.add(filePathField);
            document.add(fileContentField);
//        第五步:使用indexwriter对象将document对象写入索引库,此过程进行索引创建。并将索引和document对象写入索引库。
            indexwriter.addDocument(document);

        }
//        第六步:关闭IndexWriter对象。
        indexwriter.close();

    }
    @Test
    void testSearch() throws Exception {
//        第一步:创建一个Directory对象,也就是索引库存放的位置。
        Directory directory =FSDirectory.open(new File("D:\\temp\\index"));
//        第二步:创建一个indexReader对象,需要指定Directory对象。
        IndexReader indexreader=DirectoryReader.open(directory);
//        第三步:创建一个indexsearcher对象,需要指定IndexReader对象
        IndexSearcher indexsearcher=new IndexSearcher(indexreader);
//        第四步:创建一个TermQuery对象,指定查询的域和查询的关键词。
        Query query=new TermQuery(new Term("fileName","apache"));
//        第五步:执行查询。
//        第六步:返回查询结果。遍历查询结果并输出。
        TopDocs topDocs = indexsearcher.search(query, 2);
        ScoreDoc[] scoreDoc = topDocs.scoreDocs;
        for(ScoreDoc scoreDoc1:scoreDoc) {
            int doc= scoreDoc1.doc;
            Document doc2 = indexsearcher.doc(doc);
            //文件名称
            System.out.println("文件名称");
            String fileName=doc2.get("fileName");
            System.out.println(fileName);
            //文件内容
            System.out.println("文件内容");
            String fileContent=doc2.get("fileContent");
            System.out.println(fileContent);
            //文件路径
            System.out.println("文件路径");
            String filePath=doc2.get("filePath");
            System.out.println(filePath);
            //文件大小
            System.out.println("文件大小");
            String fileSize=doc2.get("fileSize");
            System.out.println(fileSize);
            System.out.println("-------------------");
        }
//        第七步:关闭IndexReader对象
        indexreader.close();
    }

}

运行结果如图:

需要注意的是搜索方法有多种:

原文地址:https://www.cnblogs.com/tkg1314/p/12249921.html

时间: 2024-10-08 20:30:31

lucene&solr全文检索_3查询索引的相关文章

lucene&solr全文检索_5索引的维护

增加新内容的时候,或者删除的时候我们需要对索引进行增删改查来进行索引的维护. 先上代码: package come.me.lucene; //索引维护 import java.io.File; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; impo

lucene&solr全文检索_4改进

在之前的程序中我们发现分词不太准确,因此我们可以使用支持中文分词. 分析器的执行过程: 从一个reader字符流开始,创建一个基于reader的tokenizer分词器,经过三个tokenfilter(第一个大写变小写,第二个用回车替换空格,去掉不需要的a,the,and,逗号等)生成tokens.要看分析器的分析效果只需要看tokenstream中的内容就可以了,每个分析器都有一个方法tokenstream,返回一个tokenstream对象. lucene自带中文分析器: standardA

lucene&solr全文检索_7solr后台界面的介绍

接着上个博客,用浏览器打开solr之后的界面: Dashboard:仪表盘,显示了该solr实例开始运行的时间.版本.系统资源,jvm等信息 Logging:solr的运行日志,如果出现问题会告诉你什么问题. Core Admin:solr core 的管理界面.solr core是solr 的一个独立运行实例单位,他可以对外提供索引和搜索服务,一个solr工程可以运行多个solrcore,一个core对应一个索引目录. 可以手动添加solr core: 步骤: 1.复制collection1改

lucene查询索引之解析查询——(八)

0.语法介绍: 1.公共部分代码同七中一样 // IndexReader IndexSearcher public IndexSearcher getIndexSearcher() throws Exception { // 第一步:创建一个Directory对象,也就是索引库存放的位置. Directory directory = FSDirectory.open(new File("E:\\lucene&solr\\index"));// 磁盘 // 第二步:创建一个ind

lucene查询索引之Query子类查询——(七)

0.文档名字:(根据名字索引查询文档) 1. 提取获取InsexSearch 与 处理结果的公共代码 //IndexReader IndexSearcher public IndexSearcher getIndexSearcher() throws Exception{ // 第一步:创建一个Directory对象,也就是索引库存放的位置. Directory directory = FSDirectory.open(new File("D:\\temp\\index"));// 磁

lucene入门查询索引——(三)

1.用户接口(lucene不提供) 2.创建查询 3.执行查询 4.渲染结果: 5.过程分析 根据关键字查询索引库中的内容: 1)  创建IndexSearcher对象 2)  创建QueryParser对象 3)  创建Query对象来封装关键字 4)  用IndexSearcher对象去索引库中查询符合条件的前100条记录,不足100条记录的以实际为准 5)  获取符合条件的编号 6)  用indexSearcher对象去索引库中查询编号对应的Document对象 7)  将Document

Lucene查询索引

索引创建 以新闻文档为例,每条新闻是一个document,新闻有news_id.news_title.news_source.news_url.news_abstract.news_keywords这6个域,添加两个news document到索引中,下面再贴一下创建索引的代码: package ucas.ir.lucene; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.An

solr全文检索实现原理

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过Http Get操作提出查找请求,并得到XML/Json格式的返回结果.采用Java5开发,基于Lucene. Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部

Lucene/Solr搜索引擎开发系列 - 第1章 Solr安装与部署(Jetty篇)

一.为何开博客写<Lucene/Solr搜索引擎开发系列>     本人毕业于2011年,2011-2014的三年时间里,在深圳前50强企业工作,从事工业控制领域的机器视觉方向,主要使用语言为C/C++:现就职于一家大型国企所属电子商务公司,主要使用语言为Java,负责公司新一代搜索引擎的开发工作,故开此系列来总结自己在Lucene/Solr上的学习历程,同时,也希望能给予对搜索引擎开发有兴趣的朋友一些帮助和启发. 二.Lucene和Solr简要介绍     Lucene是apache软件基金