`
gamehiboy
  • 浏览: 5386 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Lucene里经常被聊到的几个话题

阅读更多
1、索引及搜索的概念

将原始数据处理成一个高效的交差引用的查找结构以便于快速的搜索。索引结构是指快速随机访问存于其内部的关键词的数据结构。

搜索是在一个索引中查找单词来找出它们所出现的文档的过程。支持单个和多个词汇的查询,短语查询,通配符,结果分级和排序。


2、lucene的核心类

核心索引类

IndexWriter唯一能写索引的类 索引的写入和索引的整体的维护 合并,优化

Analyzer:分析文本内容,提取关键字

Document:一个Document代表字段的集合

Field:每个Document含有一个或多个字段,具体化为Field类。是否存储,是否索引,是否分词

核心搜索类

IndexSearcher以只读方式打开索引,提供几个搜索方法,最简单的接受单个Query对象做为参数并返回一个Hits 对象。

Term是搜索的基本单元。与Field对象类似,它由一对字符串元素组成:字段的名称和字段的值。

Query q = new TermQuery(new Term(“contents”, “lucene”));

Hits hits = is.search(q);

Query的几个子类实现就是lucene的几种搜索方式:TermQuery、BooleanQuery,模糊查询PhraseQuery,前缀查询PrefixQuery, PhrasePrefixQuery, 范围搜索RangeQuery

通配符搜索WildcardQuery

Hits类是一个搜索结果(匹配给定查询的文档)文档队列指针的简单容器。并不从索引中加载所有匹配文档。


3、提高索引效率。

可以合并索引来减少目录索引文件的数量,以提高处理索引的效率。

IndexWriter的optimize()对索引目录和缓存目录下所有的segment优化,Lucene只需要打开一个索引文件加载,效率会大大提高。

优化也会带来一些损失:耗费更多的内存和磁盘空间

MERGE_FACTOR用于子索引(Segment)合并,相当于ORAl数据库中对大批量的数据插入操作优化,值越大,索引效率越快。


RAMDirectory把一个普通的index完全读取到内存中,比真正的文件系统快很多.

尽可能对字段进行索引来提高查询速度.


4、lucene2.1到2.4的变动

IndexWriter 的构造器 参数多了一个字段长度,(目录,分析器,重建索引)

IndexWriter.flush()更改为commit();

Hits 命中类 3.0中会被删除。

5、分词方法

字符串匹配的分词方法(正向最大 反向匹配  最小切分 双向匹配)

词义分析(不成熟 LingPipe自然语言处理的Java开源工具包 主题概念分类)、统计分词(分词词典)。

6、lucene索引访问原则

同一时刻,lucene索引中允许有一个进程对其进行加入文档,删除文档,更新索引等操作。

同一时刻,lucene索引允许多个线程同时对其进行检索。

7、Lucene锁机制

使用commit.lock与write.lock实现锁机制。所谓的锁其实是存放于系统临时目录内的一个文件。

建立索引 write.lock / 合并索引 commit.lock segment合并和读取

8、lucene索引文件格式

segment:一个索引中,会包含有多个segment。每个segment都有一个统一的前缀,前缀是当前索引的document数量

segments:一个完整的索引中,有且只有一个“segments”文件,记录了当前索引中所有segment的信息。

.cfs格式:复合索引格式,IndexWriter的属性:useCompoundFile,索引的内容可能非常大,文件数量可能非常的多

.tii和.tis格式:存储分词后的词条,tii是所有文件,标明了每个.tis文件中词条的位置

fnm格式:fnm格式的文件包含了Document中的所有Field名称。

.fdx和.fdt格式:域值存储表,.fdt存储具有Store.YES属性的Field数据

deletable格式:文档被删除后并不是立刻从索引中去除

nrm:标准化因子文件,索引阶段设置Document Boost和Field Boost,对文档评分权重

9、影响Lucene对文档评分权重的四种方式

在索引阶段设置Document Boost和Field Boost,存储在(.nrm)文件中。

在搜索语句中,设置Query Boost.

继承并实现自己的Similarity,实现其中的接口可以干预打分的过程

继承并实现自己的collector 。将docid和score插入一个PriorityQueue中,使得得分最高的文档先返回。

10、lucene增量索引的关键

1、数据库必须对数据是否已经索引做好标识

2、IndexWriter中有一个参数boolean类型的,用来确定是重建索引(true)还是增量索引。

示例介绍

1.为作为输入参数的文件夹下的所有txt类型的文件做索引,做好的索引文件放入index文件夹。

2.然后在索引的基础上对文件进行全文搜索。

1. 建立索引

IndexWriter writer = new IndexWriter("index",new StandardAnalyzer(),true); 

Document doc = new Document();

doc.Add(new Field(“city”, ”上海”,Field.Store.YES, Field.Index.TOKENIZED));

doc.Add(new Field(“shopname”,”东北菜”,Field.Store.YES,Field.Index.TOKENIZED));

writer.AddDocument(doc);

doc = new Document();

doc.Add(new Field(“city”, ”北京”,Field.Store.YES, Field.Index.TOKENIZED));

doc.Add(new Field(“shopname”,”东北菜菜馆”,Field.Store.YES,Field.Index.TOKENIZED));

writer.AddDocument(doc);

writer.SetUseCompoundFile(true);

writer.Optimize();

writer.Close();



2. 对索引进行搜索

IndexSearcher indexSearcher= new IndexSearcher(indexDir);

QueryParser parser = new QueryParser("shopname", new StandardAnalyzer());

Query query = parser.Parse(“东北”);

Hits hits = indexSearcher.Search(query);

Document doc;

For (int i = 0 ; i < hits.length();i++)

{

   doc = hits.Doc(i);

   doc.Get(“shopname”).ToString()

}

这样就实现了简单的全文搜索了。
分享到:
评论

相关推荐

    供lucene初学者学习的几个类

    下面我们将深入探讨与标题和描述相关的几个关键Lucene类,以及如何进行建索引和查询操作。 1. **Analyzer**: 分析器是Lucene的核心组件之一,负责将输入文本拆分成一系列可搜索的术语(tokens)。例如,`...

    lucene相关十几个包

    这个压缩包包含了十几个与Lucene相关的JAR文件,这些文件分别对应于不同的Lucene组件和版本,用于实现不同的功能。让我们逐一解析这些文件及其在Lucene中的作用。 1. **lukeall-4.7.1.jar**:Luke是Lucene的可视化...

    lucene,lucene教程,lucene讲解

    lucene,lucene教程,lucene讲解。 为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store....

    lucene3.0 lucene3.0

    lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0

    lucene的一个实用例子

    Lucene 包含以下几个关键组件: 1. **索引(Index)**:Lucene 的工作基于索引,而非实时查询数据库。索引是对文档内容进行分析、分词并存储的一个数据结构,类似于书籍的目录,可以快速定位到相关信息。 2. **...

    lucene

    Lucene是一个全文搜索引擎库,由Apache软件基金会开发并维护,它提供了高效的文本检索、分析和存储功能。在Java编程语言中,Lucene被广泛应用于各种需要全文搜索功能的系统,如网站、文档管理、知识库等。其强大的...

    lucene讲义 叫你用lucene算法

    当新文档被添加到索引时,它们首先被分到不同的段(Segment),每个段都是一个独立的倒排索引。快速排序算法确保了段内的Term(关键词)是有序的,这为后续的查找和合并操作提供了高效的基础。 二、多个索引的增量...

    lucene3源码分析

    Lucene的索引文件格式是其高效检索性能的基础,主要包括以下几个方面: - **基本概念**:介绍Lucene索引文件的基本术语和概念。 - **基本类型**:定义了索引文件中使用的数据类型。 - **基本规则**:阐述了文件格式...

    lucene 全包 包括源码

    Lucene 的源码分为几个主要部分,包括分析(Analyzer)、索引(Index)、查询(Query)、搜索(Search)和文档处理(Document)。这些模块共同构成了Lucene的基本架构。 1. 分析(Analyzer):Analyzer是处理文本...

    springmvc集成lucene全文搜索

    在现代Web应用开发中,Spring MVC作为主流的Java Web框架,常常被用来构建高效、可扩展的后端系统。而Lucene是Apache软件基金会的一个开放源代码全文搜索引擎库,能够帮助开发者实现强大的搜索功能。本篇文章将深入...

    lucene.NET 中文分词

    集成第三方分词器到Lucene.NET主要涉及以下几个步骤: 1. **安装分词器**:首先需要在项目中引入分词器的NuGet包或源码。 2. **配置分词器**:在Lucene.NET的索引创建阶段,需要配置Analyzer类,指定使用特定的分词...

    Lucene全文检索引擎

    Lucene是Apache软件基金会的一个开源项目,它是一个高性能、全文本搜索引擎库,可以被集成到各种应用中实现全文检索功能。Lucene提供了完整的搜索功能实现,包括索引创建、文档存储、查询解析和结果排序等。它的设计...

    Annotated Lucene 中文版 Lucene源码剖析

    《Annotated Lucene 中文版 Lucene源码剖析》是一本深入探讨Apache Lucene的书籍,专注于源码解析,帮助读者理解这个强大的全文搜索引擎库的工作原理。Lucene是一款开源的Java库,它提供了高效的文本搜索功能,被...

    lucene in action英文版 lucene 3.30包

    倒排索引是Lucene的核心,它将每个词对应到包含该词的文档列表,便于快速查找。 3. **查询处理** Lucene支持高级查询语法,可以构造复杂的布尔表达式,如AND、OR、NOT等逻辑操作。同时,它还提供了评分机制,用于...

    Lucene3.5源码jar包

    Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发并维护。它为Java开发者提供了强大的文本检索功能,被广泛应用于各种搜索引擎和信息检索系统中。本压缩包包含的是Lucene 3.5.0版本的全部源码,对于想要...

    从lucene到Elasticsearch Lucene6.0,Elasticsearch 5.4

    《从Lucene到Elasticsearch:Lucene6.0,Elasticsearch 5.4》是一本深入探讨全文检索技术的书籍,旨在帮助读者理解从基础的搜索引擎库Lucene到分布式搜索引擎Elasticsearch的过渡。书中涵盖了从核心技术概念到实际...

    Lucene中的FST算法描述

    Lucene中的FST数据结构主要包括以下几个部分: 1. FSTbytes:这是一个字节数组,存储了完整的FST图信息。通过这个数组,可以重建FST图,从而快速定位到term在磁盘上的存储位置。 2. FSTNode:表示FST图中的节点。...

    lucene in action源码

    3. **倒排索引**:倒排索引是Lucene的核心数据结构,它将每个文档中出现的词及其位置存储在一个索引中,使得搜索时可以快速定位到包含特定词的文档。 4. **分词**:在处理文本时,Lucene会使用Analyzer进行分词,将...

    Lucene示例 BM25相似度计算

    总之,Lucene的BM25示例是一个极好的学习资源,它涵盖了从索引构建到查询执行的关键步骤,并通过实际对比展示了如何使用更先进的相似度算法提升搜索效果。对于希望在文本检索领域深入研究或应用Lucene的开发者来说,...

Global site tag (gtag.js) - Google Analytics