lucene4.0学习心得

简介: lucene4.0在项目中的使用,学习心得,全局搜索参考

项目中需要用到全局搜索的功能,因为服务器流程审核比较严格,所以选择了lucene。总体来讲,个人感觉lucene主要有几个重点,分词器(我们用的中文IK分词),索引文件,索引查询几块。这里主要截取代码稍微介绍。还有一个问题就是Lucene貌似没有做向下兼容的操作,每个版本的API都不一定相同。附上jar包,demo,ik分词器jar包,分词器操作手册等,仅供参考和新手共同了解学习进步。

如下代码片段,指定了索引文件生成的位置,使用的分词器,lucene版本,索引的生成模式等。
OpenMode.CREATE是重新生成
OpenMode.APPEND是增量更新
项目中主要用的着两种,API里面还有各种其它的方式。

    IndexWriter writer = null;
    try {
        directory = FSDirectory.open(new File("C:/lucene/testIndex"));
        Analyzer analyzer = new IKAnalyzer();
        IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_40,
                analyzer);
        conf.setOpenMode(OpenMode.CREATE);
        conf.setMaxBufferedDocs(100);
        writer = new IndexWriter(directory, conf);

下面是生成索引的代码片段。
1主要有Document document = new Document();(新建一个doc对象,往里面添加索引用的)
2其中对分词有StringField,TextField,IntergerField等等,主要决定字段的类型,以及精细度,实际操作发现比如 “我爱北京”,String会分成“我|爱|我爱|北京”,Text直接就是“我爱北京“,当然具体如何分词跟选用的分词器也有关系。

String query = "。。。";
            ResultSet result = st.executeQuery(query);
            while (result.next()) {
                Document document = new Document();
                document.add(newStringField("id",result.getString("id"),Field.Store.YES));
                if(result.getString("theme") != null){
                    if("userInfo".equals(result.getString("type"))){
                        document.add(new StringField("theme", result.getString("theme"), Field.Store.YES));
                    }
                        document.add(new TextField("theme", result.getString("theme"), Field.Store.YES));
                }
                if(result.getString("content") !=null){
                    document.add(new TextField("content", result.getString("content"), Field.Store.YES));
                }
                document.add(new StringField("type", result.getString("type"), Field.Store.YES));
                System.out.println(document.getFields()+"--------------------");
                writer.addDocument(document);

索引生成完毕之后就是查询了,如下是查询的。获取查找reader的实例

public IndexSearcher getSearcher() throws IOException {
    IndexReader reader = DirectoryReader.open(directory);
    IndexSearcher searcher = new IndexSearcher(reader);
    return searcher;
}

单条件查询的代码块如下,传入需要查找的字段,num为支持数量筛选
WildcardQuery 模糊查找,TermQuery 精确查找

public void searchByTerm(String field, String name, int num) throws IOException {
    IndexSearcher searcher = getSearcher();
    // WildcardQuery 模糊查找
    // TermQuery 精确查找
    Query query = new WildcardQuery(new Term(field, name));
    TopDocs tds = searcher.search(query, num);
    System.out.println("count:" + tds.totalHits);
    for (ScoreDoc sd : tds.scoreDocs) {
        Document doc = searcher.doc(sd.doc);
        System.out.println("id:" + doc.get("id"));
        System.out.println("theme:" + doc.get("theme"));
        System.out.println("content:" + doc.get("content"));
        System.out.println("type:" + doc.get("type"));
    }
}

多条件需要用到布尔查询,布尔组合条件查询的时候
主要有Occur.SHOULD(相当于or),Occur.MUST(相当于and),Occur.MUST_NOT(相当于!)列如代码中,就是要查找主题和正文中包含人名为陈洁的内容,但是排除news(资讯)

public void booleanQuery() throws Exception {
    IndexSearcher searcher = getSearcher();
    
    Term term = new Term("theme", "陈洁");  
    WildcardQuery wildcardQuery = new WildcardQuery(term);  
    Term term3 = new Term("type", "news");  
    TermQuery termQuery2 = new TermQuery(term3);  
    Term term2 = new Term("content", "陈洁"); 
    WildcardQuery wildcardQuery2 = new WildcardQuery(term2);
    TermQuery termQuery = new TermQuery(term2);  
    BooleanQuery booleanQuery = new BooleanQuery();  
    booleanQuery.add(wildcardQuery, Occur.SHOULD);  
    booleanQuery.add(termQuery2, Occur.MUST_NOT);  
    booleanQuery.add(termQuery, Occur.SHOULD);
    TopDocs topDocs = searcher.search(booleanQuery,null, 10);
    
    System.out.println("共检索出 " + topDocs.totalHits + " 条记录");
    System.out.println();
    
    ScoreDoc[] scoreDocs = topDocs.scoreDocs;
    for (ScoreDoc scDoc : scoreDocs) {
        Document doc = searcher.doc(scDoc.doc);
        System.out.println("id:" + doc.get("id"));
        System.out.println("theme:" + doc.get("theme"));
        System.out.println("content:" + doc.get("content"));
        System.out.println("type:" + doc.get("type"));
    }
    
}
相关文章
|
机器学习/深度学习 传感器 算法
Matlab 粒子群优化算法优化极限学习机(PSO-ELM)分类预测
Matlab 粒子群优化算法优化极限学习机(PSO-ELM)分类预测
521 0
Matlab 粒子群优化算法优化极限学习机(PSO-ELM)分类预测
|
缓存 Cloud Native Java
性能优化与架构能力复盘报告
本复盘总结了在性能优化、架构设计及云原生方面的实践经验,涵盖性能分析、全链路压测、缓存策略、微服务治理等内容,展示了从系统性能提升到成本控制的综合能力,并规划了未来在JVM优化、ServiceMesh及APM平台建设等方面的能力提升路径。
367 3
|
JSON 自然语言处理 搜索推荐
开发一款专属的 VSCode 代码提示插件
作为前端开发者一定用过VsCode这款利器,而其强大的插件能力无疑更是让我们深深的爱上了它。据不完全统计,VsCode插件市场中的插件数量已经超过了3万,由此可见大家的热情有多高。其中涉及到各种各样功能的插件,有主题曲相关的,有代码开发相关的,比如代码片段、Git插件、tslint等等。作为开发者,肯定用过各种各样的代码提示的插件,代表性的有TabNine、Copilot等等。今天就让我们来自己动手,开发一款专属的代码提示插件。毕竟别人的再好也是别人的, 属于自己的才是最好的。
3712 1
开发一款专属的 VSCode 代码提示插件
|
JavaScript 前端开发 数据管理
React和Vue的优缺点
【10月更文挑战第23天】React和Vue的优缺点
628 0
|
编解码 小程序
无影云电脑产品使用黑神话悟空之:游戏服务器更新/配置问题
该文档主要介绍了使用无影云电脑玩《黑神话:悟空》时可能遇到的问题及解决方法,包括游戏服务器更新、配置问题、画质建议及如何开启帧数显示等内容,并提供了详细的步骤指导与参考链接。
|
人工智能 Unix 物联网
深入理解操作系统:从概念到实践
【7月更文挑战第31天】本文将带领读者深入探索操作系统的世界,从基本概念、发展历程、核心组件,到实际应用场景和未来趋势。我们将揭示操作系统如何作为软件与硬件之间的桥梁,以及它如何影响计算机系统的性能和用户体验。通过本文,您将获得对操作系统设计哲学的深刻理解,并掌握评估不同操作系统特性的能力。
510 7
固定资产入库,多个相同种类物品如何自动给每个物品都生成标签和编码?
固定资产入库,多个相同种类物品如何自动给每个物品都生成标签和编码?
412 2
|
数据库
SAP ABAP——数据类型(五)【LIKE系列关键字】
本文主要介绍一下SAP ABAP中的声明数据类型的LIKE系列关键字,主要包括了LIKE、LIKE TABLE OF、LIKE LINE OF、LIKE REF TO。LIKE系列语句是与TYPE系列所对应的语句,前者主要是参照数据类型进行定义,而后者则是参照实例化的数据对象进行定义,在下一章中笔者将对数据对象进行详细的讲述。
1491 0
SAP ABAP——数据类型(五)【LIKE系列关键字】
|
安全 druid Apache
CVE-2021-36749——Apache Druid LoadData 任意文件读取漏洞
CVE-2021-36749——Apache Druid LoadData 任意文件读取漏洞
1081 0
CVE-2021-36749——Apache Druid LoadData 任意文件读取漏洞
|
JavaScript 前端开发
如何在页面中引入JS教程
如何在页面中引入JS教程