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

Posted tkg1314

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:	empindex"));//创建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:UserslenovoDesktopsearchsourcesearchsource");
        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:	empindex"));
//        第二步:创建一个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();
    }
    
    


}

运行结果如图:

技术图片

 

 技术图片

 

 技术图片

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

技术图片

 

以上是关于lucene&solr全文检索_3查询索引的主要内容,如果未能解决你的问题,请参考以下文章

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

全文检索(Lucene&Solr)

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

Web-第二十八天 Lucene&solr使用一悟空教程

全文检索引擎:solr lucene

.NET开发过程中的全文索引使用技巧之Solr(转)