资讯专栏INFORMATION COLUMN

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

hedzr / 1420人阅读

摘要:系列文章系列一快速入门系列二使用及索引文档的基本操作系列三查询及高亮入门简介地址下载地址是一个用于搜索引擎的,方便开发和诊断的可视化工具。使用作为其最低级别的搜索引擎基础。截止,上述代码所用的包皆为最新。

系列文章:

Lucene系列(一)快速入门

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

Lucene系列(三)查询及高亮

luke入门 简介:

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

下载地址:https://github.com/DmitryKey/luke/releases

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.


3.

4.

索引文档的CRUD操作

创建项目并添加Maven依

        
            junit
            junit
            4.12
            test
        
        
        
        
            org.apache.lucene
            lucene-core
            7.2.1
        
        
        
            org.apache.lucene
            lucene-queryparser
            7.2.1
        
        
        
            org.apache.lucene
            lucene-analyzers-common
            7.2.1
        

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

相关测试代码

主方法:

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:luceneindex_crudindexdata"));
        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查看相关信息:


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

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

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


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

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


4)测试删除 在合并前:

    /**
     * 测试删除 在合并前
     * 
     * @throws Exception
     */
    @Test
    public void testDeleteBeforeMerge() throws Exception {
        //写入索引文档的路径
        dir = FSDirectory.open(Paths.get("D:luceneindex_crudindexdata"));
        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();
    }


5)测试删除 在合并后:

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

    /**
     * 测试删除 在合并后
     * 
     * @throws Exception
     */
    @Test
    public void testDeleteAfterMerge() throws Exception {
           //写入索引文档的路径
        dir = FSDirectory.open(Paths.get("D:luceneindex_crudindexdata"));
        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();
    }


6)测试更新操作:

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

    /**
     * 测试更新
     * 
     * @throws Exception
     */
    @Test
    public void testUpdate() throws Exception {
        // 写入索引文档的路径
        dir = FSDirectory.open(Paths.get("D:luceneindex_crudindexdata"));
        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();
    }


欢迎关注我的微信公众号:“Java面试通关手册”(分享各种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的介绍和使用

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68950.html

相关文章

  • Lucene系列(一)快速入门

    摘要:系列文章系列一快速入门系列二使用及索引文档的基本操作系列三查询及高亮是什么在维基百科的定义是一套用于全文检索和搜索的开放源代码程序库,由软件基金会支持和提供。全面准确和快速是衡量全文检索系统的关键指标。结果列表有相关度排序。 系列文章: Lucene系列(一)快速入门 Lucene系列(二)luke使用及索引文档的基本操作 Lucene系列(三)查询及高亮 Lucene是什么? Luc...

    骞讳护 评论0 收藏0
  • 在选择数据库路上,我们遇到过哪些坑?(2)

    摘要:有关进行调用的进一步危害,请观看这段有关安全漏洞的讨论。索引索引基本上会复制数据库中的信息片段,这样有利于它迅速找到节点。不管怎样,它都能事务性地依次通过数据库中的所有节点。 【编者按】你会怎么选择数据库,是关系数据库、XML 数据库、资源描述框架(RDF),还是图形数据库?本文的第1部分深入而生动地探讨了各种选择。在第2部分,将深入介绍使用 Neo4j 的注意点。文章系国内 ITOM...

    lavnFan 评论0 收藏0
  • Lucene解析 - 基本概念

    摘要:基本概念在深入解读之前,先了解下的几个基本概念,以及这几个概念背后隐藏的一些东西。如图是一个内的基本组成,内数据只是一个抽象表示,不代表其内部真实数据结构。即词典,是根据条件查找的基本索引。 前言 Apache Lucene是一个开源的高性能、可扩展的信息检索引擎,提供了强大的数据检索能力。Lucene已经发展了很多年,其功能越来越强大,架构也越来越精细。它目前不仅仅能支持全文索引,也...

    sunnyxd 评论0 收藏0

发表评论

0条评论

hedzr

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<