Lucene 7.1.0 入门

Lucene 7.1.0 相比以前的版本, 代码发生了一些变化, 如果还按照以前的写法的话, 代码已经不能正常运行了.

在这里, 给大家整理了一下新版本的基本功能的代码, 希望对大家有所帮助!

  • 创建索引库
        //1.指定索引存放的路径
        Path path = Paths.get("C:/index");
        
        //2.获取索引文件夹对象
        FSDirectory dir = FSDirectory.open(path);
        
        //3.创建分析器对象
        Analyzer analyzer = new IKAnalyzer();//中文分析器
        
        //4.创建索引配置对象
        IndexWriterConfig config = new IndexWriterConfig(analyzer);
        
        //5.创建索引写出对象
        IndexWriter writer = new IndexWriter(dir, config);
        
        //6.指定一个文件夹, 获取它的内容, 把它的指定内容写到索引库中
        File srcDir = new File("C:/gongxm/Mozilla Firefox");
        
        //遍历文件夹, 获取到文件夹中的内容
        File[] files = srcDir.listFiles();
        for (File file : files) {
            //获取到文件的名字
            String name = file.getName();
            //获取到文件的绝对路径
            String absolutePath = file.getAbsolutePath();
            //获取到文件的大小
            long length = file.length();
            
            //创建一个文档对象
            Document doc = new Document();
            
            //创建域对象, 存放需要写到索引库中的内容
            TextField nameField = new TextField("name", name,Store.YES);
            TextField absolutePathField = new TextField("absolutePath", absolutePath,Store.YES);
            StoredField lengthField = new StoredField("lengthField", length);
            
            //把域对象存到文档对象中
            doc.add(nameField);
            doc.add(absolutePathField);
            doc.add(lengthField);
            
            //把文档对象写到索引库中
            writer.addDocument(doc);
        }
        
        //关闭索引写出对象
        writer.close();
        
        System.out.println("索引库创建完成!");

  • 查询索引库
        //1.指定索引存放的路径
        Path path = Paths.get("C:/index");
        
        //2.获取索引文件夹对象
        FSDirectory dir = FSDirectory.open(path);
        
        //3.获取索引读取对象
        IndexReader reader = DirectoryReader.open(dir);
        
        //4.创建索引搜索对象
        IndexSearcher searcher = new IndexSearcher(reader);
        
        //5.创建查询对象
        Query query = new MatchAllDocsQuery();//查询所有内容
        
        //6.获取到搜索结果
        TopDocs topDocs = searcher.search(query, 100);
        
        //7.获取结果数量
        long totalHits = topDocs.totalHits;
        
        System.out.println("一共搜索到"+totalHits+"条结果!");
        
        //8.遍历一下, 看看搜索到的结果是什么内容
        if(totalHits>0) {
            
            //取出搜索结果的信息数组
            ScoreDoc[] scoreDocs = topDocs.scoreDocs;
            //遍历数组, 获取到每条记录的信息
            for (ScoreDoc scoreDoc : scoreDocs) {
                //取出搜索结果文档的ID
                int id = scoreDoc.doc;
                //根据ID获取到对应的文档对象
                Document doc = reader.document(id);
                
                //查看文档对象的内容
                System.out.println("name:"+doc.get("name"));
                System.out.println("absolutePath:"+doc.get("absolutePath"));
                System.out.println("length:"+doc.get("length"));
                
            }
        }

  • 常用的查询对象
    查询的时候基本上就是以上的逻辑, 其他的查询, 就是创建的查询的对象不一样, 所以, 只需要把上面的代码中的查询对象改变一下即可, 以下举例一些常用的查询对象:
1. 多条件查询
        BooleanQuery.Builder builder = new Builder();
        builder.add(query1, Occur.MUST); // 必须: AND
        builder.add(query2, Occur.MUST_NOT);// 不是: NOT
        builder.add(query3, Occur.SHOULD);// 应该: OR
        BooleanQuery query = builder.build();

2.字符串范围查询: name的长度在1~20000之间的, 不包含1, 包含20000
TermRangeQuery query = new TermRangeQuery("name", new BytesRef("1"), new BytesRef("20000"), false, true);

3.前缀查询: 查询name域中以de开头的所有内容
    PrefixQuery query = new PrefixQuery(new Term("name", "de"));

4.关键词查询:
   /**
    *  所谓PhraseQuery,就是通过短语来检索,比如我想查“big car”这个短语,
    *  那么如果待匹配的document的指定项里包含了"big car"这个短语,
    *  这个document就算匹配成功。可如果待匹配的句子里包含的是“big black car”,
    *  那么就无法匹配成功了,如果也想让这个匹配,就需要设定slop,
    *  先给出slop的概念:slop是指两个项的位置之间允许的最大间隔距离
    * @throws Exception
    */
第一种写法:
        PhraseQuery.Builder builder = new PhraseQuery.Builder();
        builder.add(new Term("name", "api"));
        builder.add(new Term("name", "core"));
        builder.setSlop(50);
        PhraseQuery query = builder.build();

第二种写法:
        PhraseQuery query = new PhraseQuery(50, "name", new String[]{"api","core"});

5.模糊查询: 可以查询相近的关键词
        FuzzyQuery query = new FuzzyQuery(new Term("name", "api"));

6.通配符查询: ?代表一个字符, *代表0~多个字符
WildcardQuery query = new WildcardQuery(new Term("name", "ap*i"));

7.分词搜索: 把要搜索的内容进行分词再搜索!
        IKAnalyzer ikAnalyzer = new IKAnalyzer();  //中文分析器
        QueryParser parser = new QueryParser("name", ikAnalyzer);//进行分词
        Query query = parser.parse("api文档"); //生成查询对象


你可能感兴趣的:(Lucene 7.1.0 入门)