Lucene7.2.1系列(二)luke使用及索引文档的基本操作-阿里云开发者社区

开发者社区> snailclimb> 正文

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

简介: 它有以下功能: - 查看文档并分析其内容(用于存储字段) - 在索引中搜索 - 执行索引维护:索引运行状况检查;索引优化(运行前需要备份) - 从hdfs读取索引 - 将索引或其部分导出为XML格式 - 测试定制的Lucene分析工具 - 创建自己的插件
+关注继续查看

系列文章:

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

  1. 2

3.
3
4.
4

  1. 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

Github:Apache Lucene and Solr

Lucene专栏

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

Lucene6.6的介绍和使用

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MongoDB数据库操作和程序基础文档
转自:http://blog.csdn.net/xto/archive/2010/03/22/5403855.aspx 数据库常用操作命令 Bin\mongod run 启动数据库服务端。 bin\mongod.exe --dbpath d:\data\mongo 启动数据库服务端并且将数据库目录设定在该地址下。
796 0
Sql Server之旅——第十站 看看DML操作对索引的影响
原文:Sql Server之旅——第十站 看看DML操作对索引的影响   我们都知道建索引是需要谨慎的,当只有利大于弊的时候才适合建,我们也知道建索引是需要维护成本的,这个维护也就在于DML操作了, 下面我们具体看看到底DML对索引都有哪些内幕。
760 0
IK Analyzer 和 lucene结合使用
特别注意:版本问题(IK Analyzer的版本中注意各个版本的细微区别,小编就是栽在IK Analyzer2012_U5 和IK Analyzer2012FF上了) 版本匹配: 1、IK Analyzer 2012_U5 支持的是 lucene 3.2-3.6版本 2、IK Analyzer2012 FF(你问啥是FF,其实就是For 4.0,在API和功能上保持不变,只是让其支持了Lucene4.0和Solr4.0,让这部分的用户能用起来。
1142 0
《Java编码指南:编写安全可靠程序的75条建议(英文版)》—— 6.3 在字符串中使用特殊字符
创建或显示字符串时,其文本必须用双引号括起。这些双引号不会显示出来,这就提出了一个很好的问题:如果要显示双引号该怎么办呢? 为显示双引号,Java创建了一个特殊编码\",可放到字符串中。在字符串中遇到该编码时,将其替换为双引号。例如,请看下面的例子:
1034 0
如何选择阿里云服务器操作系统?阿里云操作系统说明文档(Linux+Window)
阿里云云服务器ECS的操作系统有什么区别,阿里云linux服务器和windows服务器有何不同呢?
216 0
+关注
snailclimb
欢迎关注我的公众号:&ldquo;Java面试通关手册&rdquo;。永远不要跟别人比幸运.
102
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载