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文档"); //生成查询对象


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,621评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,649评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,039评论 25 707
  • 文章大纲:1.题目简介2.重点分析3.知识拓展 1.题目简介 输入一个链表的头结点,从尾到头反过来打印出每个节点的...
    柠檬乌冬面阅读 502评论 2 2
  • 刘长顺和安蓉驱车3个半小时抵达了云海湖,湖虽然有人管理,但并没有严格禁止进车,围栏也没有。只是在北面有一个大石头,...
    天气好时不出门阅读 385评论 0 0