zoukankan      html  css  js  c++  java
  • Lucene7.2.1系列(二)luke使用及索引文档的基本操作

    系列文章:

    Lucene系列(一)快速入门

    Lucene系列(二)luke使用及索引文档的基本操作

    Lucene系列(三)查询及高亮

    luke入门

    简介:

    github地址https://github.com/DmitryKey/luke

    下载地址https://github.com/DmitryKey/luke/releases
    luke图标
    Luke是一个用于Lucene/Solr/Elasticsearch 搜索引擎的,方便开发和诊断的 GUI(可视化)工具。

    它有以下功能:

    • 查看文档并分析其内容(用于存储字段)
    • 在索引中搜索
    • 执行索引维护:索引运行状况检查;索引优化(运行前需要备份)
    • 从hdfs读取索引
    • 将索引或其部分导出为XML格式
    • 测试定制的Lucene分析工具

    - 创建自己的插件

    luke适用的搜索引擎

    • Apache Lucene. 大多数情况下,luke可以打开由纯Lucene生成的lucene索引。 现在人们做出纯粹的Lucene索引吗?
    • Apache Solr. Solr和Lucene共享相同的代码库,所以luke很自然可以打开Solr生成的Lucene索引。
    • Elasticsearch. Elasticsearch使用Lucene作为其最低级别的搜索引擎基础。 所以luke也可以打开它的索引!

    下载安装与简单使用

    下载安装

    1.
    1
    2.
    2
    3.
    3
    4.
    4
    5.
    5

    索引文档的CRUD操作

    1. 创建项目并添加Maven依
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-core -->
            <!-- Lucene核心库 -->
            <dependency>
                <groupId>org.apache.lucene</groupId>
                <artifactId>lucene-core</artifactId>
                <version>7.2.1</version>
            </dependency>
            <!-- Lucene解析库 -->
            <dependency>
                <groupId>org.apache.lucene</groupId>
                <artifactId>lucene-queryparser</artifactId>
                <version>7.2.1</version>
            </dependency>
            <!-- Lucene附加的分析库 -->
            <dependency>
                <groupId>org.apache.lucene</groupId>
                <artifactId>lucene-analyzers-common</artifactId>
                <version>7.2.1</version>
            </dependency>

    我们下面要用到单元测试,所以这里我们添加了Junit单元测试的依赖(版本为4.12,2018/3/30日最新的版本)

    1. 相关测试代码

    主方法:

    package lucene_index_crud;
    
    import java.nio.file.Paths;
    
    import org.apache.lucene.analysis.Analyzer;
    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.document.StringField;
    import org.apache.lucene.document.TextField;
    import org.apache.lucene.index.DirectoryReader;
    import org.apache.lucene.index.IndexReader;
    import org.apache.lucene.index.IndexWriter;
    import org.apache.lucene.index.IndexWriterConfig;
    import org.apache.lucene.index.Term;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import org.junit.Test;
    
    public class Txt1 {
        // 下面是测试用到的数据
        private String ids[] = { "1", "2", "3" };
        private String citys[] = { "qingdao", "nanjing", "shanghai" };
        private String descs[] = { "Qingdao is a beautiful city.", "Nanjing is a city of culture.",
                "Shanghai is a bustling city." };
        //Directory对象  
        private Directory dir;
    }

    相关测试方法编写:

    1)测试创建索引

        /**
         * 创建索引
         * @throws Exception
         */
        @Test
        public void testWriteIndex() throws Exception {
            //写入索引文档的路径
            dir = FSDirectory.open(Paths.get("D:\lucene\index_crud\indexdata"));
            IndexWriter writer = getWriter();
            for (int i = 0; i < ids.length; i++) {
                //创建文档对象,文档是索引和搜索的单位。
                Document doc = new Document();
                doc.add(new StringField("id", ids[i], Field.Store.YES));
                doc.add(new StringField("city", citys[i], Field.Store.YES));
                doc.add(new TextField("desc", descs[i], Field.Store.NO));
                // 添加文档
                writer.addDocument(doc); 
            }
            writer.close();
        }

    通过luke查看相关信息:
    desc
    city
    id

    注意: 创建索引之后,后续测试方法才能正确运行。

    2)测试写入了几个文档:

        /**
         * 测试写了几个文档
         * 
         * @throws Exception
         */
        @Test
        public void testIndexWriter() throws Exception {
            //写入索引文档的路径
            dir = FSDirectory.open(Paths.get("D:\lucene\index_crud\indexdata"));
            IndexWriter writer = getWriter();
            System.out.println("写入了" + writer.numDocs() + "个文档");
            writer.close();
        }

    testIndexWriter()
    3)测试读取了几个文档:

        /**
         * 测试读取了几个文档
         * 
         * @throws Exception
         */
        @Test
        public void testIndexReader() throws Exception {
            //写入索引文档的路径
            dir = FSDirectory.open(Paths.get("D:\lucene\index_crud\indexdata"));
            IndexReader reader = DirectoryReader.open(dir);
            System.out.println("最大文档数:" + reader.maxDoc());
            System.out.println("实际文档数:" + reader.numDocs());
            reader.close();
        }

    testIndexReader()
    4)测试删除 在合并前:

        /**
         * 测试删除 在合并前
         * 
         * @throws Exception
         */
        @Test
        public void testDeleteBeforeMerge() throws Exception {
            //写入索引文档的路径
            dir = FSDirectory.open(Paths.get("D:\lucene\index_crud\indexdata"));
            IndexWriter writer = getWriter();
            System.out.println("删除前:" + writer.numDocs());
            writer.deleteDocuments(new Term("id", "1"));
            writer.commit();
            System.out.println("writer.maxDoc():" + writer.maxDoc());
            System.out.println("writer.numDocs():" + writer.numDocs());
            writer.close();
        }

    testDeleteBeforeMerge()
    5)测试删除 在合并后:

    我们这里先把dataindex目录下的文件删除,然后运行上面的testWriteIndex() 方法之后再测试。

        /**
         * 测试删除 在合并后
         * 
         * @throws Exception
         */
        @Test
        public void testDeleteAfterMerge() throws Exception {
               //写入索引文档的路径
            dir = FSDirectory.open(Paths.get("D:\lucene\index_crud\indexdata"));
            IndexWriter writer = getWriter();
            System.out.println("删除前:" + writer.numDocs());
            writer.deleteDocuments(new Term("id", "1"));
            writer.forceMergeDeletes(); // 强制删除
            writer.commit();
            System.out.println("writer.maxDoc():" + writer.maxDoc());
            System.out.println("writer.numDocs():" + writer.numDocs());
            writer.close();
        }

    testDeleteAfterMerge()
    6)测试更新操作:

    我们这里先把dataindex目录下的文件删除,然后运行上面的testWriteIndex() 方法之后再测试。

        /**
         * 测试更新
         * 
         * @throws Exception
         */
        @Test
        public void testUpdate() throws Exception {
            // 写入索引文档的路径
            dir = FSDirectory.open(Paths.get("D:\lucene\index_crud\indexdata"));
            IndexWriter writer = getWriter();
            Document doc = new Document();
            doc.add(new StringField("id", "1", Field.Store.YES));
            doc.add(new StringField("city", "beijing", Field.Store.YES));
            doc.add(new TextField("desc", "beijing is a city.", Field.Store.NO));
            writer.updateDocument(new Term("id", "1"), doc);
            writer.close();
        }

    desc
    city

    欢迎关注我的微信公众号(分享各种Java学习资源,面试题,以及企业级Java实战项目回复关键字免费领取):
    微信公众号

    Lucene我想暂时先更新到这里,仅仅这三篇文章想掌握Lucene是远远不够的。另外我这里三篇文章都用的最新的jar包,Lucene更新太快,5系列后的版本和之前的有些地方还是有挺大差距的,就比如为文档域设置权值的setBoost方法6.6以后已经被废除了等等。因为时间有限,所以我就草草的看了一下Lucene的官方文档,大多数内容还是看java1234网站的这个视频来学习的,然后在版本和部分代码上做了改进。截止2018/4/1,上述代码所用的jar包皆为最新。

    最后推荐一下自己觉得还不错的Lucene学习网站/博客:

    官方网站:[Welcome to Apache Lucene](Welcome to Apache Lucene)

    Github:Apache Lucene and Solr

    Lucene专栏

    搜索系统18:lucene索引文件结构

    Lucene6.6的介绍和使用

  • 相关阅读:
    工作中遇到的java 内存溢出,问题排查
    java线上内存溢出问题排查步骤
    性能测试-java内存溢出问题排查
    164 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 04 终止finally执行的方法
    163 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 03 使用多重catch结构处理异常
    162 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 02 使用try-catch结构处理异常
    161 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 01 try-catch-finally简介
    160 01 Android 零基础入门 03 Java常用工具类01 Java异常 03 异常处理简介 01 异常处理分类
    159 01 Android 零基础入门 03 Java常用工具类01 Java异常 02 异常概述 02 异常分类
    158 01 Android 零基础入门 03 Java常用工具类01 Java异常 02 异常概述 01 什么是异常?
  • 原文地址:https://www.cnblogs.com/snailclimb/p/9086401.html
Copyright © 2011-2022 走看看