热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Lucene介绍及简单入门案例(集成ik分词器)

介绍Lucene是apache软件基金会4jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了

介绍  

  Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。

  Lucene是Apache提供的一个开源的全文检索引擎工具包, 其本质就是一个工具包, 而非一个完整的搜索引擎, 但是我们可以通过Lucene来构建一个搜索引擎,比如solr和elasticsearch都是基于Lucene的搜索引擎。

使用Lucene如何构建索引

第一步:导入相关的jar包

<dependency>
    <groupId>org.apache.lucenegroupId>
    <artifactId>lucene-coreartifactId>
    <version>4.10.2version>
dependency>
<dependency>
    <groupId>org.apache.lucenegroupId>
    <artifactId>lucene-queriesartifactId>
    <version>4.10.2version>
dependency>
<dependency>
    <groupId>org.apache.lucenegroupId>
    <artifactId>lucene-test-frameworkartifactId>
    <version>4.10.2version>
dependency>
<dependency>
    <groupId>org.apache.lucenegroupId>
    <artifactId>lucene-analyzers-commonartifactId>
    <version>4.10.2version>
dependency>
<dependency>
    <groupId>org.apache.lucenegroupId>
    <artifactId>lucene-queryparserartifactId>
    <version>4.10.2version>
dependency>
<dependency>
    <groupId>org.apache.lucenegroupId>
    <artifactId>lucene-highlighterartifactId>
    <version>4.10.2version>
dependency>    

第二步:书写写入索引的代码

技术分享图片

简单案例:

public class LuceneIndex {
    public static void main(String[] args) throws IOException {
        //1 创建indexwriter对象
        //1.1 创建索引库
        FSDirectory directory = FSDirectory.open(new File("H:\\test"));
        //1.2 创建写入器配置对象 参数1 版本号, 参数2 分词器
        IndexWriterConfig cOnfig= new IndexWriterConfig(Version.LATEST, new StandardAnalyzer());
        //1.3 创建indexwriter对象
        IndexWriter indexWriter = new IndexWriter(directory, config);

        //2 写入文档
        //2.1 创建文档对象(lucene的document对象)
        Document document = new Document();
        //2.2 添加文档属性(字段)   new xxxField(字段名,字段值,是否保存)
        document.add(new IntField("id", 1, Field.Store.YES));
        document.add(new StringField("title", "Lucene介绍", Field.Store.YES));
        document.add(new TextField("content", "Lucene是一个全文检索的工具包", Field.Store.YES));
        //2.3 写入文档
        indexWriter.addDocument(document);

        //3 提交数据
        indexWriter.commit();

        //释放资源
        indexWriter.close();
    }
}

使用索引查看工具查看插入的索引信息

下载一个lukeall-xxxx(版本信息).jar, cmd运行这个工具jar包:

技术分享图片

技术分享图片

技术分享图片

Lucene集成IKAnalyzer 中文分词器

Analyzer: 分词器:

?   用于对文档中的数据进行分词, 其分词的效果取决于分词器的选择, Lucene中根据各个国家制定了各种语言的分词器,对中文有一个ChineseAnalyzer 但是其分词的效果, 是将中文进行一个一个字的分开

针对中文分词一般只能使用第三方的分词词,比如IKAnalyzer

首先要引入jar包:


<dependency>
    <groupId>com.janeluogroupId>
    <artifactId>ikanalyzerartifactId>
    <version>2012_u6version>
dependency>

代码部分只需要修改我们上面案例的分词器对象即可:

//1.2 创建写入器配置对象 参数1 版本号, 参数2 分词器
IndexWriterConfig cOnfig= new IndexWriterConfig(Version.LATEST, new IKAnalyzer());

高级使用:

ik分词器在2012年更新后, 就在没有更新, 其原因就取决于其强大的扩展功能,以保证ik能够持续使用

  ik支持对自定义词库, 其可以定义两个扩展的词典

    1) 扩展词典(新创建词功能):有些词IK分词器不识别 例如:“剑来”,“剑九黄”

    2) 停用词典(停用某些词功能)有些词不需要建立索引  例如:“哦”,“啊”,“的”

如何使用:

技术分享图片

在resources内创建者三个文件,在ext.dic中设置需要进行分词的内容即可, 在stopword中设置不被分词的内容即可,xml文件内容格式如下:

xml version="1.0" encoding="UTF-8"?>
DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">  
<properties>  
    <comment>IK Analyzer 扩展配置comment>
    
    <entry key="ext_dict">ext.dic;entry> 
    
    
    <entry key="ext_stopwords">stopword.dic;entry> 
    
properties>

其他两个词典内容格式:

剑来
剑九黄
剑开天门

API详解:

  • IndexWriter: 索引写入器对象

    其主要的作用, 添加索引, 修改索引和删除索引

    • 创建此对象的时候, 需要传入Directory和indexWriterConfig对象

  • Directory: 目录类, 用来指定索引库的目录

    • 常用的实现类:

      • FSDirectory: 用来指定文件系统的目录, 将索引信息保存到磁盘上

        • 优点: 索引可以进行长期保存, 安全系数高

        • 缺点: 读取略慢

      • RAMDriectory: 内存目录, 将索引库信息存放到内存中

        • 优点: 读取速度快

        • 缺点: 不安全, 无法长期保存, 关机后就消失了

  • IndexWriterConfig: 索引写入器的配置类

    • 创建此对象, 需要传递Lucene的版本和分词器

    • 作用:

      • 作用1 : 指定Lucene的版本和需要使用的分词器

      • 作用2: 设置Lucene的打开索引库的方式: setOpenMode();

//参数值: APPEND CREATE   CREATE_OR_APPEND
/**
 * APPEND: 表示追加, 如果索引库存在, 就会向索引库中追加数据, 如果索引库不存在, 直接报错
 * 
 * CREATE: 表示创建, 不管索引库有没有, 每一次都是重新创建一个新的索引库
 * 
 * CREATE_OR_APPEND: 如果索引库有, 就会追加, 如果没有 就会创建索引库
         默认值也是 CREATE_OR_APPEND
 */
config.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
  • Document: 文档

?     在Lucene中, 每一条数据以文档的形式进行存储, 文档中也有其对应的属性和值, Lucene中一个文档类似数据库的一个表, 表中的字段类似于文档中的字段,只不过这个文档只能保存一条数据

?     Document看做是一个文件, 文件的属性就是文档的属性, 文件对应属性的值就是文档的属性的值 content

  • 一个文档中可以有多个字段, 每一个字段就是一个field对象,不同的文档可以有不同的属性

  • 字段也有其对应数据类型, 故Field类也提供了各种数据类型的实现类

 

Field类数据类型Analyzed是否分析Indexed是否索引Stored是否存储说明
StringField(FieldName, FieldValue,Store.YES)) 字符串 N Y Y或N 这个Field用来构建一个字符串Field,但是不会进行分析,会将整个串存储在索引中,比如(订单号,姓名等)是否存储在文档中用Store.YES或Store.NO决定
LongField(FieldName, FieldValue,Store.YES) Long型 Y Y Y或N 这个Field用来构建一个Long数字型Field,进行分析和索引,比如(价格)是否存储在文档中用Store.YES或Store.NO决定
StoredField(FieldName, FieldValue) 重载方法,支持多种类型 N N Y 这个Field用来构建不同类型Field不分析,不索引,但要Field存储在文档中
TextField(FieldName, FieldValue, Store.NO)或TextField(FieldName, reader) 字符串或流 Y Y Y或N 如果是一个Reader, lucene猜测内容比较多,会采用Unstored的策略.

更改和删除索引:

    /**
     * 更新索引
     * 本质先删除再添加
     * 先删除所有满足条件的文档,再创建文档
     * 因此,更新索引通常要根据唯一字段
     */
    @Test
    public void testUpdate() throws Exception {

        // 创建更改后的文档对象
        Document document = new Document();
        document.add(new StringField("id", "3", Field.Store.YES));
        document.add(new TextField("title", "更改后的titlek", Field.Store.YES));

        // 索引库对象
        Directory directory = FSDirectory.open(new File("H:\\test"));
        // 索引写入器配置对象
        IndexWriterConfig cOnf= new IndexWriterConfig(Version.LATEST, new IKAnalyzer());
        // 索引写入器对象
        IndexWriter indexWriter = new IndexWriter(directory, conf);

        // 执行更新操作 参数1 要更改的对象, 参数2 更改后的对象
        indexWriter.updateDocument(new Term("id", "1"), document);
        // 提交
        indexWriter.commit();
        // 关闭
        indexWriter.close();

    }

    // 删除索引
    @Test
    public void testDelete() throws Exception {

        // 创建目录对象
        Directory directory = FSDirectory.open(new File("H:\\test"));
        // 创建索引写入器配置对象
        IndexWriterConfig cOnf= new IndexWriterConfig(Version.LATEST, new IKAnalyzer());
        // 创建索引写入器对象
        IndexWriter indexWriter = new IndexWriter(directory, conf);

        // 执行删除操作(根据词条),要求id字段必须是字符串类型
        indexWriter.deleteDocuments(new Term("id", "5"));
        // 根据查询条件删除
        // indexWriter.deleteDocuments(NumericRangeQuery.newLongRange("id", 2l, 4l, true, false));
        // 删除所有
        //indexWriter.deleteAll();

        // 提交
        indexWriter.commit();
        // 关闭
        indexWriter.close();
    }

Lucene介绍及简单入门案例(集成ik分词器)


推荐阅读
  • Lucene 全文检索技术入门
    一、搜索引擎的历史萌芽:Archie、Gopher起步:Robot(网络机器人)的出现与spider(网络爬虫)发展:excite、galax ... [详细]
  • 部署solr建立nutch索引
    2019独角兽企业重金招聘Python工程师标准接着上篇nutch1.4的部署应用,我们来部署一下solr,solr是对lucene进行了封装的企 ... [详细]
  • 1.0为什么要做这个博客站?  在工作学习中,经常要搜索查找各种各样的资料,每次找到相关资料后都会顺手添加到浏览器书签中,时间一长,书签也就满了。而且下次再点击这个书签时,可能就会忘记当时为什么要添加这个书签了,更有可能书签连接已经无效。这样一来,也就不方便 ... [详细]
  • camel_使用Camel在来自不同来源的Solr中索引数据
    camelApacheSolr是建立在Lucene之上的“流行的,快速的开源企业搜索平台”。为了进行搜索(并查找结果),通常需要从不同的源(例如内容管理 ... [详细]
  • 一:什么是solrSolr是apache下的一个开源项目,使用Java基于lucene开发的全文搜索服务器;Lucene是一个开放源代 ... [详细]
  • 说明:搜索模块针对的是买家用户,在找菜品找的很费劲下的一种查询方面。目前也是快速的检索商品。对于移动端的APP买家用户而言,要求的速度在3秒内完成。支持模糊查询,由于业务实战表面, ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • intellij idea的安装与使用(保姆级教程)
    intellijidea的安装与使用(保姆级教程)IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(gi ... [详细]
  • ES基本原理名词解释In-memorybuffer:ES内存缓冲区,新建的document写入的地方document:索引和搜索的 ... [详细]
  • Nexus3.0.0+Maven的使用(一)
    1、Nexus介绍Nexus是一个强大的Maven仓库管理器,它极大地简化了自己内部仓库的维护和外部仓库的访问。利用Nexus你可以只在一个地方就能够完全控制访问和部署在你所维护仓 ... [详细]
  • 用到lucene的爬虫的简单实现
    2019独角兽企业重金招聘Python工程师标准小菜鸟我最近研究了一下lucene,以及前面的爬虫的写法,我想到能否用lucene写一个站内搜索& ... [详细]
  • solr倒排索引(转载)
    原文地址:http:blog.csdn.netchichengitarticledetails9235157http:blog.csdn.netnjpjsoftdevarticle ... [详细]
  • 搞懂 ELK 并不是一件特别难的事
    点击下方“民工哥技术之路”,选择“设为星标”回复“1024”获取独家整理的学习资料!本篇文章主要介绍ELK的一些框架组成,原理和实践&#x ... [详细]
author-avatar
海纳百川2602902033
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有