Lucene 一种索引数据库

Posted 闫广庆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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包但是并没有试过
   
Analyzer analyzer = new StandardAnalyzer();
这个位置我们定义一个存储方式,就是三个类型的存储最经常的使用
分别是
RAMDirectory 内存存储方式

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

mmapdiretory 虚拟内存存储方式


    // Store the index in memory:
    Directory directory = new RAMDirectory();
    // To store an index on disk, use this instead:
    //Directory directory = FSDirectory.open("/tmp/testindex");
   
定义一个写入配置类,并将我们之前定义好的分词类给这个写入配置类    
IndexWriterConfig config = new IndexWriterConfig(analyzer);  
这个就是索引写入的东西 在IndexWrite下具有    
IndexWriter iwriter = new IndexWriter(directory, config);
这里是一个终点
   Document doc = new Document();    String text = "This is the text to be indexed.";
第一个参数决定了数据在查询的时候需要查询哪个字段,第二个字段代表字段的内容,
第三个参数决定数据在Lucene中是否进行保存操作(ps第三个参数我会在后面进行详细
的讲解)
   doc.add(new Field("fieldname", text, TextField.TYPE_STORED));
这个时候我们在document类中加入了数据我们就可以用上面定义好的IndexWriter类
把数据存入我们的Lucene的数据库中。
   iwriter.addDocument(doc);
这个位置需要注意一下,我们在使用完这个类之后一定要及时将这个类进行关闭操作,
未关闭的时候,我们的jvm监控中会看到比较让程序难以接受的问题。
   iwriter.close();    这下面的方法就是Lucene的查询的方法。    // Now search the index:
首先打开一个读取的类,在读取的类上加入上面我们定义的字典也就是我们的数据存入到
哪里的一个方法
   DirectoryReader ireader = DirectoryReader.open(directory);
这个时候我们就可以打开我们的索引搜索类加载入我们的索引搜索    
IndexSearcher isearcher = new IndexSearcher(ireader);    // Parse a simple query that searches for "text":    
QueryParser 是Lucene为我们封装好的一个查询接口 其中会包括很多的查询方法

    需要查询的字段名称以及分词器定义,分词这个方面需要注意一下,建议用海量分词器
   word分词器 hanlp分词器
QueryParser parser = new QueryParser("fieldname", analyzer);

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

我们按照需要的字段 注意query的语法 这个地方的语法可以进行多重的查询定义,这个后面
会详细的讲到。而这个字段的返回就确定了我们在数据库中的数据,最后的是对文档相似
度的一个评分    
ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs;    
断言 返回数据的长度1    assertEquals
(1, hits.length);    // Iterate through the results:
迭代器实现数据的转换从我们取到的数据中将我们需要的数据返回到document对象中
   for (int i = 0; i < hits.length; i++) {      Document hitDoc = isearcher.doc(hits[i].doc);      assertEquals("This is the text to be indexed.", hitDoc.get("fieldname"));    }
注意一定要关闭我们的索引对象和字典对象,不然会有内存溢出的风险
   ireader.close();    directory.close();

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


以上是关于Lucene 一种索引数据库的主要内容,如果未能解决你的问题,请参考以下文章

Javalucene4.0学习心得

知识图谱实战系列六:Lucene在知识图谱上构建索引

lucene介绍

Lucene高性能索引之道

Lucene建立索引库

lucene之创建索引代码