首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Lucene 一种索引数据库

Lucene作为一个企业级搜素引擎总会让人感觉到很惊讶,但是归根接地这个程序的本质就是让人去使用,而不是让人不知所措的去应用,本文将会按照源码的底层进行Lucene的讲解,当然讲解所用到的lucene版本也会是最新版本,现在的时间是2018年8月11日18:30:07,所以以后这篇文章可能会落后还请大家谅解。

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。

下面的几个是lucene的核心包

analysis 分词

codecs 编解码

document 存储类

geo 官网介绍是lucene的一个底层数据结构, 有时间会做详细的解析

index 索引方法

search 搜索方法

store 就是那个

RAMDirectory 内存存储方式

fsdirectory 硬盘存储方式

mmapdiretory 虚拟内存存储方式

util 工具类 (包含)

这个是官网所带的一个代码,简单的讲讲

定义分词器 这个部分可以换成自己定义的分词器 lucene上有一个对opennlp支持的

jar包但是并没有试过

Analyzeranalyzer=newStandardAnalyzer();

这个位置我们定义一个存储方式,就是三个类型的存储最经常的使用

分别是

RAMDirectory 内存存储方式

fsdirectory 硬盘存储方式 需要注意这个方法需要写入当前的文件存储位置。

mmapdiretory 虚拟内存存储方式

// Store the index in memory:Directorydirectory=newRAMDirectory();// To store an index on disk, use this instead://Directory directory = FSDirectory.open("/tmp/testindex");

定义一个写入配置类,并将我们之前定义好的分词类给这个写入配置类IndexWriterConfigconfig=newIndexWriterConfig(analyzer);

这个就是索引写入的东西 在IndexWrite下具有IndexWriteriwriter=newIndexWriter(directory,config);

这里是一个终点

Documentdoc=newDocument();Stringtext="This is the text to be indexed.";

第一个参数决定了数据在查询的时候需要查询哪个字段,第二个字段代表字段的内容,

第三个参数决定数据在Lucene中是否进行保存操作(ps第三个参数我会在后面进行详细

的讲解)

doc.add(newField("fieldname",text,TextField.TYPE_STORED));

这个时候我们在document类中加入了数据我们就可以用上面定义好的IndexWriter类

把数据存入我们的Lucene的数据库中。

iwriter.addDocument(doc);

这个位置需要注意一下,我们在使用完这个类之后一定要及时将这个类进行关闭操作,

未关闭的时候,我们的jvm监控中会看到比较让程序难以接受的问题。

iwriter.close();这下面的方法就是Lucene的查询的方法。// Now search the index:

首先打开一个读取的类,在读取的类上加入上面我们定义的字典也就是我们的数据存入到

哪里的一个方法

DirectoryReaderireader=DirectoryReader.open(directory);

这个时候我们就可以打开我们的索引搜索类加载入我们的索引搜索IndexSearcherisearcher=newIndexSearcher(ireader);// Parse a simple query that searches for "text":

QueryParser是Lucene为我们封装好的一个查询接口 其中会包括很多的查询方法

需要查询的字段名称以及分词器定义,分词这个方面需要注意一下,建议用海量分词器

word分词器 hanlp分词器

QueryParserparser=newQueryParser("fieldname",analyzer);

这个位置就是需要按照业务进行传参的位置Queryquery=parser.parse("text");

我们按照需要的字段 注意query的语法 这个地方的语法可以进行多重的查询定义,这个后面

会详细的讲到。而这个字段的返回就确定了我们在数据库中的数据,最后的是对文档相似

度的一个评分ScoreDoc[]hits=isearcher.search(query,null,1000).scoreDocs;

断言 返回数据的长度1 assertEquals(1,hits.length);// Iterate through the results:

迭代器实现数据的转换从我们取到的数据中将我们需要的数据返回到document对象中

for(inti=;i

注意一定要关闭我们的索引对象和字典对象,不然会有内存溢出的风险

ireader.close();directory.close();

昂我在放一段源代码,大家可以按照自己的需求进行开发

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180812G0WRKI00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券