Lucene7入门demo

           加入依赖

<!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-core -->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-core</artifactId>
            <version>7.3.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-queryparser -->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-queryparser</artifactId>
            <version>7.3.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-analyzers-common -->
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-analyzers-common</artifactId>
            <version>7.3.1</version>
        </dependency>

创建索引代码实例:

 @Test
    public void testCreateIndex() throws IOException {
        //指定索引库的存放位置Directory对象
        Directory directory = FSDirectory.open(Paths.get("F:\\file\\test"));
        //指定一个标准分析器,对文档内容进行分析
        Analyzer analyzer =new StandardAnalyzer();
        //创建indexwriterCofig对象
        //参数:分析器对象
        IndexWriterConfig config =new IndexWriterConfig(analyzer);
        //创建一个indexwriter对象
        IndexWriter writer = new IndexWriter(directory,config);
        //原始文档的路径
        File  file = new File("F:\\file\\searchsource");
        File[] files=file.listFiles();
        for (File file1:files){
            //创建document对象
            Document document=new Document();
            //创建field对象,将field添加到document对象中

            //文件名称
            String fileName =file1.getName();
            //创建文件名域
            //第一个参数:域的名称
            //第二个参数:域的内容
            //第三个参数:是否存储
            Field fileNameField = new TextField("fileName",fileName, Field.Store.YES);
            //文件路径
            String filePath = file1.getPath();
            //文件路径域(不分析、不索引、只存储)
            Field filePathField=new StoredField("filePath",filePath);
            //文件内容
            String fileContent=FileUtils.readFileToString(file1);
            Field fileContentField=new TextField("fileContent",fileContent, Field.Store.YES);
            document.add(fileContentField);
            document.add(fileNameField);
            document.add(filePathField);
            //使用indexwriter对象将document对象写入索引库,此过程进行索引创建。并将索引和document对象写入索引库。
            writer.addDocument(document);
        }
        //关闭IndexWriter对象。
        writer.close();
    }

2. 查询索引

 @Test
    public void testMatchAllDocsQuery() throws IOException {
        //创建一个Directory对象,指定索引库存放的路径
        Directory directory=FSDirectory.open(Paths.get("F:\\file\\test"));
        //创建IndexReader对象,需要指定Directory对象
        IndexReader reader = DirectoryReader.open(directory);
        //创建Indexsearcher对象,需要指定IndexReader对象
        IndexSearcher searcher=new IndexSearcher(reader);
        //创建查询条件
        //使用MatchAllDocsQuery查询索引目录中的所有文档
        Query query =new MatchAllDocsQuery();
        //执行查询
        //第一个参数是查询对象,第二个参数是查询结果返回的最大值
        TopDocs topDocs =searcher.search(query,10);
        System.out.println("查询结果总数"+topDocs.totalHits);
        //遍历查询结果
        //topDocs.scoreDocs存储了document对象的id
        //ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc scoreDoc:topDocs.scoreDocs){
            //scoreDoc.doc属性就是document对象的id
            //int doc = scoreDoc.doc;
            //根据document的id找到document对象
            Document document =searcher.doc(scoreDoc.doc);
            //文件名称
            System.out.println(document.get("fileName"));
            //文件内容
            System.out.println(document.get("fileContent"));
            //文件路径
            System.out.println(document.get("filePath"));
            System.out.println("----------------------------------");
        }
        //关闭indexreader对象
        reader.close();
    }

3:精确查询

    @Test
    public void testSearchIndex() throws IOException{
        //创建一个Directory对象,指定索引库存放的路径
        Directory directory=FSDirectory.open(Paths.get("F:\\file\\test"));
        //创建IndexReader对象,需要指定Directory对象
        IndexReader reader = DirectoryReader.open(directory);
        //创建Indexsearcher对象,需要指定IndexReader对象
        IndexSearcher searcher=new IndexSearcher(reader);
        //创建一个TermQuery(精准查询)对象,指定查询的域与查询的关键词
        //创建查询
        Query query=new TermQuery(new Term("fileContent","bigdata"));
        //执行查询
        //第一个参数是查询对象,第二个参数是查询结果返回的最大值
        TopDocs topDocs =searcher.search(query,10);
        //查询结果的总条数
        System.out.println("查询结果的总条数:"+ topDocs.totalHits);
        //遍历查询结果
        //topDocs.scoreDocs存储了document对象的id
        //ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc scoreDoc:topDocs.scoreDocs){
            //scoreDoc.doc属性就是document对象的id
            //int doc = scoreDoc.doc;
            //根据document的id找到document对象
            Document document =searcher.doc(scoreDoc.doc);
            //文件名称
            System.out.println(document.get("fileName"));
            //文件内容
            System.out.println(document.get("fileContent"));
            //文件路径
            System.out.println(document.get("filePath"));
        }
        //关闭indexreader对象
        reader.close();
    }

碰到问题:doc文档乱码无法解决

posted on 2018-05-29 20:56  fttdfc  阅读(115)  评论(0)    收藏  举报