`
smallearth
  • 浏览: 37518 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

lucene分布式索引(转)

 
阅读更多

转自:http://www.cnblogs.com/wycg1984/archive/2010/07/13/1776616.html

Lucene是个高度优化的倒转索引搜索引擎。它将倒转的索引存储在定制的文件格式中,文件格式被高度优化以确保能被搜索器快速的加载以及有效的搜索。Lucene产生这些结构以致索引几乎完全的被预先计算好

Lucene 通过使用Directory接口的实现来存储索引,注意不要将Directoryjava.io混淆了.FSDirectoryDirectory接口的一个标准的实现,它将索引保存在文件系统中.还有一些其他的实现,比如有的实现将索引切分小的数据块保存在文件系统中,有的通过使用Map Reduce(google)的集群来分布索引.还有一种数据库的实现,它将索引作为数据块保存在数据库中

(Lucene 的快速是因为它的索引结构,为了能出色的搜索,Lucene需要能有效的寻址扇区块,正是这些扇区块组成了索引.如果底层的存储机制支持这种寻址,那么就没什么好说的,如果不支持那么这就是问题了.在这个问题上,基于文件的FSDirectory 是有效的.如果索引文件保存在本地的文件系统中,那么这种访问效果还不错.如果被放在共享的文件系统中,那么总是会存在一些延迟和潜在的IO阻塞. 上面说的那种数据库的实现方式高度依赖于目标数据库blob实现,而且几乎总是比FSDirectory).一些数据库支持可寻址的blob,比如说oracle.mysql也模拟了这种行为(当你将MySQL的参数emulateLocators设置为true)其他的数据库就是不支持,所以真的是慢(我的意思是指实际上就是很慢)

所有的这些将影响到集群环境中的lucene. 每个进行搜索的节点需要访问索引。所以为了能使实现集群环境中的搜索,我们必须提供共享的索引文件。有3(译注:应该是5 )种方式提供参考。

1)在所有的节点间使用共享文件,而且使用FSDirectory

2)使用节点本地文件系统中的索引,并且保持各节点间的同步

3)使用JDBCDirectory操作数据库(译注:将索引文件保存在数据库中实现节点间的共享)

4)使用分布式的文件系统(例如google文件系统和Nutch 分布式文件系统)

5)使用本地缓存保存数据库中备份

使用共享文件系统存在一些问题.性能会明显低于使用本地文件系统. 如果SAN不能使用,那么一个SAN共享文件系统必须是个真正的SAN file system比如Redhat Global File SystemApple XSan.对于文件系统块的修改必须能立即镜像到所有连接节点的块缓存中,否则文件系统会崩溃.记住SAN是个网络化的块设备,没有额外的帮助,不可能同时被多个计算节点共享.如果共享文件系统的性能可以保证的话,Lucene使用FSDirectory的实现会一如既往地表现出色.Sakai Search组件管理的锁实现解决了Lucene社区提交的锁问题.

以上所说的机制现在在Sakai Search是可用的

这种集群的架构并非一个共享的架构,Lucene索引写到本地磁盘然后在创建索引结束后同步到各节点.这是集群环境中Lucene最佳部署方案,因为这样能确保所有的IO是在本地磁盘因此很快.为了确保总是有一个索引的备份,同步应该制定备份路径

这种方案的困难在于缺乏搜索引擎实现的支持,它需要部署支持.这可能会采用连接镜像来加速同步过程.Lucene索引非常适合采用rsync同步.rsync是一个基于块的同步机制.

这种方案的主要缺陷是本地保存了所有的索引文件.在一个大型的搜索环境中,这种复制是很浪费空间的.然而从搜索引擎的条件看, Sakai的单个部署决不可能占用很大空间(100多兆的documents的索引占用了2TB空间)

但需要实现简单的集群的时候,使用基于数据库的索引是个直接的选择.然而这种方法有明显的缺陷.最值得注意的是性能下降.索引作为块以blob的形式保存在数据库中.这些blob以块结构保存用以消除一些不必要的加载.然而每个快会绕开任何本地磁盘块缓存,而且必须通过网络传递数据流.如果数据库支持可寻址的块,对数据库本身而言,最小化不必要的网络阻塞时可能的.Oracle提供了这种支持, 然而当数据库仅仅是模拟这种行为(比如mysql)的话,当整个blob需要通过流化再在网络上传递的时候,性能是很差的.而且,访问的速度比较慢,因为访问数据时得执行sql statement总之性能会下降.

这种机制是可以使用的,但性能很可能是不可接受的

一些真实的搜索引擎使用分布式的文件系统.这种分布式系统提供了一个自治的系统,数据通过多节点分布,这样的系统能从一个或多个节点的损坏中恢复.Google 文件系统和Nutch分布式文件系统(建模在.Google 文件系统之上)就是这样一个例子.两种实现采用了一种聚合扫描算法,GoogleMap-Reduce详述了这种算法(Google labs)

这种方法使每个节点包含文件系统的一个部分.但索引变得庞大以致保存在每个节点时,这个方法变得更具吸引力. Sakai目前还没有计划提供分布式文件系统的实现

本方法中,索引通过本地磁盘使用,但作为Lucene扇区备份在数据库中,可以安装一个集群应用节点在本地拷贝和数据库之间同步.当接受到索引重载事件,所有的集群应用节点再次与数据库同步从而下载更新和全新的搜索扇区.

这种机制处于测试阶段,我发现当搜索200MB的索引(包含80000文档)的时候,这种机制的性能和基于本地的索引相当.

一旦这种机制经过完全测试,当工作在一个或多个集群节点的环境中,这种机制将变成默认的OOTB机制.额外的优点是索引保存在数据中.

也可以采用共享的文件存储作为一个备份路径来实现这种机制


转自:http://www.cnblogs.com/wycg1984/archive/2010/07/13/1776616.html

Lucene是个高度优化的倒转索引搜索引擎。它将倒转的索引存储在定制的文件格式中,文件格式被高度优化以确保能被搜索器快速的加载以及有效的搜索。Lucene产生这些结构以致索引几乎完全的被预先计算好

Lucene 通过使用Directory接口的实现来存储索引,注意不要将Directoryjava.io混淆了.FSDirectoryDirectory接口的一个标准的实现,它将索引保存在文件系统中.还有一些其他的实现,比如有的实现将索引切分小的数据块保存在文件系统中,有的通过使用Map Reduce(google)的集群来分布索引.还有一种数据库的实现,它将索引作为数据块保存在数据库中

(Lucene 的快速是因为它的索引结构,为了能出色的搜索,Lucene需要能有效的寻址扇区块,正是这些扇区块组成了索引.如果底层的存储机制支持这种寻址,那么就没什么好说的,如果不支持那么这就是问题了.在这个问题上,基于文件的FSDirectory 是有效的.如果索引文件保存在本地的文件系统中,那么这种访问效果还不错.如果被放在共享的文件系统中,那么总是会存在一些延迟和潜在的IO阻塞. 上面说的那种数据库的实现方式高度依赖于目标数据库blob实现,而且几乎总是比FSDirectory).一些数据库支持可寻址的blob,比如说oracle.mysql也模拟了这种行为(当你将MySQL的参数emulateLocators设置为true)其他的数据库就是不支持,所以真的是慢(我的意思是指实际上就是很慢)

所有的这些将影响到集群环境中的lucene. 每个进行搜索的节点需要访问索引。所以为了能使实现集群环境中的搜索,我们必须提供共享的索引文件。有3(译注:应该是5 )种方式提供参考。

1)在所有的节点间使用共享文件,而且使用FSDirectory

2)使用节点本地文件系统中的索引,并且保持各节点间的同步

3)使用JDBCDirectory操作数据库(译注:将索引文件保存在数据库中实现节点间的共享)

4)使用分布式的文件系统(例如google文件系统和Nutch 分布式文件系统)

5)使用本地缓存保存数据库中备份

使用共享文件系统存在一些问题.性能会明显低于使用本地文件系统. 如果SAN不能使用,那么一个SAN共享文件系统必须是个真正的SAN file system比如Redhat Global File SystemApple XSan.对于文件系统块的修改必须能立即镜像到所有连接节点的块缓存中,否则文件系统会崩溃.记住SAN是个网络化的块设备,没有额外的帮助,不可能同时被多个计算节点共享.如果共享文件系统的性能可以保证的话,Lucene使用FSDirectory的实现会一如既往地表现出色.Sakai Search组件管理的锁实现解决了Lucene社区提交的锁问题.

以上所说的机制现在在Sakai Search是可用的

这种集群的架构并非一个共享的架构,Lucene索引写到本地磁盘然后在创建索引结束后同步到各节点.这是集群环境中Lucene最佳部署方案,因为这样能确保所有的IO是在本地磁盘因此很快.为了确保总是有一个索引的备份,同步应该制定备份路径

这种方案的困难在于缺乏搜索引擎实现的支持,它需要部署支持.这可能会采用连接镜像来加速同步过程.Lucene索引非常适合采用rsync同步.rsync是一个基于块的同步机制.

这种方案的主要缺陷是本地保存了所有的索引文件.在一个大型的搜索环境中,这种复制是很浪费空间的.然而从搜索引擎的条件看, Sakai的单个部署决不可能占用很大空间(100多兆的documents的索引占用了2TB空间)

但需要实现简单的集群的时候,使用基于数据库的索引是个直接的选择.然而这种方法有明显的缺陷.最值得注意的是性能下降.索引作为块以blob的形式保存在数据库中.这些blob以块结构保存用以消除一些不必要的加载.然而每个快会绕开任何本地磁盘块缓存,而且必须通过网络传递数据流.如果数据库支持可寻址的块,对数据库本身而言,最小化不必要的网络阻塞时可能的.Oracle提供了这种支持, 然而当数据库仅仅是模拟这种行为(比如mysql)的话,当整个blob需要通过流化再在网络上传递的时候,性能是很差的.而且,访问的速度比较慢,因为访问数据时得执行sql statement总之性能会下降.

这种机制是可以使用的,但性能很可能是不可接受的

一些真实的搜索引擎使用分布式的文件系统.这种分布式系统提供了一个自治的系统,数据通过多节点分布,这样的系统能从一个或多个节点的损坏中恢复.Google 文件系统和Nutch分布式文件系统(建模在.Google 文件系统之上)就是这样一个例子.两种实现采用了一种聚合扫描算法,GoogleMap-Reduce详述了这种算法(Google labs)

这种方法使每个节点包含文件系统的一个部分.但索引变得庞大以致保存在每个节点时,这个方法变得更具吸引力. Sakai目前还没有计划提供分布式文件系统的实现

本方法中,索引通过本地磁盘使用,但作为Lucene扇区备份在数据库中,可以安装一个集群应用节点在本地拷贝和数据库之间同步.当接受到索引重载事件,所有的集群应用节点再次与数据库同步从而下载更新和全新的搜索扇区.

这种机制处于测试阶段,我发现当搜索200MB的索引(包含80000文档)的时候,这种机制的性能和基于本地的索引相当.

一旦这种机制经过完全测试,当工作在一个或多个集群节点的环境中,这种机制将变成默认的OOTB机制.额外的优点是索引保存在数据中.

也可以采用共享的文件存储作为一个备份路径来实现这种机制

分享到:
评论

相关推荐

    基于Lucene的分布式并行索引.pdf

    分布式并行索引技术基于Lucene是在搜索引擎领域中的一项重要进步。随着网络技术的不断进步,互联网资源日益丰富,搜索引擎在信息检索中扮演着越来越重要的角色。搜索引擎的高效运作依赖于其核心组件——索引技术。一...

    分布式索引的研究与应用.pdf

    综上所述,分布式索引通过Lucene和RMI技术实现了在大规模数据环境中的高效信息检索。这种架构解决了集中式存储的限制,提高了搜索引擎的性能,并适应了当前分布式存储的环境。同时,RMI的使用简化了分布式系统的编程...

    应用分布式索引提高海量数据查询性能.pdf

    Solr是基于Lucene构建的一个开源的企业级搜索服务器,它支持分布式搜索并提供了一些额外的功能,如管理搜索索引,使得分布式索引更加易于实现和管理。 分布式索引层的关键技术包括分片(sharding)和B+树。分片是将...

    lucene并行索引

    综上所述,基于Lucene的分布式并行索引技术是解决大数据环境下高效索引构建问题的有效手段。通过采用内存缓冲机制、分布式处理和智能合并策略等关键技术,不仅可以显著提升索引构建的速度,还能有效改善用户体验。...

    Lucene索引器实例

    **Lucene索引器实例详解** Lucene是一个高性能、全文本搜索库,由Apache...在实际项目中,可以根据需求选择合适的存储(如硬盘目录或分布式存储)、优化分析器配置、处理大量文档的批量索引以及实现复杂的查询逻辑。

    Lucene索引和查询

    **Lucene索引和查询** Lucene是Apache软件基金会的开放源码全文搜索引擎库,它提供了文本检索的核心工具,使得开发者能够快速构建自己的搜索应用。本项目中的代码旨在展示如何利用Lucene对多个文件夹下的数据进行...

    lucene排序、设置权重、优化、分布式搜索.pdf

    Lucene 提供了多种分布式搜索方式,包括分布式索引和分布式搜索。 例如,下面的代码演示如何使用 Lucene 对分布式搜索结果进行聚合: ```csharp DistributedSearch distributedSearch = new DistributedSearch();...

    Lucene建立索引

    - 其他相关框架,如Solr和Elasticsearch,是在Lucene基础上构建的,提供了更高级的服务,如分布式搜索、集群管理等。 学习并实践“Lucene建立索引”,不仅可以深入了解倒排索引的工作原理,还能提升处理大规模文本...

    基于Lucene的分布式搜索设计说明书

    Lucene 的分布式搜索设计通过将索引分散到多个节点,实现了横向扩展,解决了这一问题。 #### 1.3 专用名词列表 - **Lucene**: 全文搜索引擎库 - **分布式搜索**: 将索引分布在多台服务器上,通过协调实现全局搜索 -...

    lucene全文索引原理

    对于大型数据集,Lucene可以通过Solr或Elasticsearch等工具实现分布式搜索,将索引分散在多台机器上,提高检索效率和容错能力。 了解并掌握Lucene的这些原理,有助于开发者构建高效、灵活的全文搜索应用,满足各种...

    如何将Lucene索引写入Hadoop?

    标题 "如何将Lucene索引写入Hadoop" 指涉的是在大数据处理场景下,如何利用Apache Lucene的全文检索功能与Apache Hadoop的分布式计算能力相结合,实现高效的数据检索。Apache Lucene是一个高性能、全文本搜索库,而...

    LUCENE索引搜索数据库技术汇总

    - **Solr和Elasticsearch**: 当索引过大时,可以使用基于Lucene的分布式搜索引擎如Solr或Elasticsearch,它们提供了更高级的集群管理、复制、负载均衡等功能。 6. **Lucene与数据库结合** - **数据库集成**: 通过...

    基于Lucene和HDFS的PB级数据索引、搜索、存储系统.zip

    然后,每个节点上的数据被Lucene索引,创建一个分布式索引。Lucene的索引过程可以并行化,以充分利用HDFS的分布式特性,提高索引速度。当用户发起搜索请求时,请求会被分发到各个节点,节点独立执行查询,然后将结果...

    lucene索引

    - **Solr**和**Elasticsearch**:基于Lucene的分布式搜索平台,提供了更高级的功能,如多节点集群、实时索引、复杂查询语法等。 了解并掌握Lucene的索引机制,对于开发高性能的全文检索应用至关重要。无论是从底层...

    lucene检索文档、检索大数据量数据

    综上所述,Lucene是处理大数据量文本检索的理想选择,其强大的索引和查询功能,以及对分布式环境的支持,使得它在各种信息检索应用中表现出色。通过深入理解和有效利用Lucene,开发者可以构建出高效、灵活的全文搜索...

    基于文本聚类与分布式Lucene的知识检索.pdf

    在分布式索引集群框架中,该框架主要由聚类模块和索引集群组成。底层采用了Hadoop分布式文件系统架构。聚类模块负责对非结构化数据进行分类,而索引集群则负责将分类后的数据并行索引,从而实现对海量数据的快速检索...

Global site tag (gtag.js) - Google Analytics