Lucene7.2.1系列(二)luke使用及索引文档的基本操作
系列文章:
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依赖
<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日最新的版本)
- 相关测试代码
主方法:
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查看相关信息:
注意: 创建索引之后,后续测试方法才能正确运行。
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(); }
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(); }
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(); }
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(); }
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(); }
欢迎关注我的微信公众号(分享各种Java学习资源,面试题,以及企业级Java实战项目回复关键字免费领取):
Lucene我想暂时先更新到这里,仅仅这三篇文章想掌握Lucene是远远不够的。另外我这里三篇文章都用的最新的jar包,Lucene更新太快,5系列后的版本和之前的有些地方还是有挺大差距的,就比如为文档域设置权值的setBoost方法6.6以后已经被废除了等等。因为时间有限,所以我就草草的看了一下Lucene的官方文档,大多数内容还是看java1234网站的这个视频来学习的,然后在版本和部分代码上做了改进。截止2018/4/1,上述代码所用的jar包皆为最新。
最后推荐一下自己觉得还不错的Lucene学习网站/博客:
Github:Apache Lucene and Solr

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Lucene7.2.1系列(一)快速入门
系列文章: Lucene系列(一)快速入门 Lucene系列(二)luke使用及索引文档的基本操作 Lucene系列(三)查询及高亮 Lucene是什么? Lucene在维基百科的定义 Lucene是一套用于全文检索和搜索的开放源代码程序库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程序接口,能够做全文索引和搜索,在Java开发环境里Lucene是一个成熟的免费开放源代码工具;就其本身而论,Lucene是现在并且是这几年,最受欢迎的免费Java信息检索程序库。 另外,Lucene不提供爬虫功能,如果需要获取内容需要自己建立爬虫应用。Lucene只做索引和搜索工作。 Lucene官网 http://lucene.apache.org/ 打开Luncene官网你会发现Lucene版本更新的太快了,现在最新的版本已经是7.2.1。不过这也变相说明了Luncene这个开源库的火爆。 Lucene和solr 我想提到Lucene,不得不提solr了。 很多刚接触Lucene和Solr的人都会问这个明显的问题:我应该使用Lucene还是Solr? 答案很简单:如果你...
- 下一篇
Lucene7.2.1系列(三)查询及高亮
系列文章: Lucene系列(一)快速入门 Lucene系列(二)luke使用及索引文档的基本操作 Lucene系列(三)查询及高亮 一 准备 创建项目并添加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> <...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器