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的介绍和使用

  • 相关阅读:
    LeetCode——37. 解数独
    LeetCode ——42. 接雨水
    异常
    IO/FILE
    函数与模块
    选择与循环
    运算符
    字符串、列表、元组等
    SVTyper
    Error:Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-not69mld/pysam/
  • 原文地址:https://www.cnblogs.com/snailclimb/p/9086400.html
Copyright © 2011-2022 走看看