zoukankan      html  css  js  c++  java
  • lucene

    Lucene学习笔记

    Lucene介绍与入门使用

    lucene创建索引高级特性和索引创建参数优化 【这个很不错!】

    lucene索引优化之多线程创建索引

    lucene 索引合并策略

    关于Lucene索引合并解决方法 

    lucene影响索引速度的因素-MergeFactor, MaxMergeDocs, RAMBufferSizeMB

    IndexWriterConfig配置参数说明

    lucene 中关于Store.YES 关于Store.NO的解释  (不存,且索引,可以查,但是不能显示内容)

    MySQL5.6版本性能调优my.cnf详解

    How to make searching faster

    How to make indexing faster

    Lucene索引优化之setUseCompoundFile

    停用词

    几种压缩算法的压缩和速度比较 LZ4太快了 

    一个JS实现的LZW压缩算法方法实现字符串的压缩和解压 

    LZW压缩

    搜索引擎选择: Elasticsearch与Solr

    全文搜索引擎 Elasticsearch 入门教程

    进程和线程的区别   :一个进程可以有一个或多个线程。

    参考:http://www.cnblogs.com/lmule/archive/2010/08/18/1802774.html

    lucene中存在的两种锁

    第一种, 针对每个索引文件目录有一个锁, 该锁保证了只有一个IndexWriter实例写该目录

    第二种, 在每个IndexWriter实例下, 有一个ThreadState对象池, 默认大小为8(该对象池也被称为线程池, 但实际上他只是一个锁池),   

    lucene的多线程索引可以分为三类, 

    第一种, 单线程单目录索引, 该方式只会使用一个IndexWriter实例, 每个IndexWriter实例下只使用一个ThreadState对象

    第二种, 多线程单目录索引, 该方式只会使用一个IndexWriter实例, 每个IndexWriter的实例下使用的ThreadState对象数取决于线程个数, 线程个数即ThreadState对象池大小

    第三种, 多线程多目录索引, 有几个目录则使用几个IndexWriter实例

    在使用多线程索引时, 每个线程(DocWriterPerThread) 各生成一个segment

    lucene多线程环境下的使用原则和commit.lock与write.lock实现的锁机制。

    设计之初就是服务于多线程环境,大多数情况下索引会被不至一个线程访问。索引时一个关键资源。在对这样的资源进行访问时,不可避免地会出现同步访问 的问题。因此需要有很好的策略来处理这些并发访问,以保证资源的合理使用。对索引的非法访问可能导致索引数据异常,进而毁坏重要的数据,导致整个系统的失 败。

    下面是索引访问的原则:

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

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

    在Lucene中,对索引发生修改的类主要集中在IndexWriter和IndexReader。其中,IndexWriter主要负责对索引的写入和索引的整体的维护,如合并,优化等操作;IndexReader则负责从索引中删除文档。

    如果按照上面第一句所说,则可以得出以下结论:

    1.任一时刻,在系统中只能有一个IndexWriter的实例对索引进行操作,不允许有多个IndexWriter向索引添加Document,或是优化索引,合并索引。

     lucene3.0API:Opening an IndexWriter creates a lock file for the directory in use. Trying to open another IndexWriter on the same directory will lead to a LockObtainFailedException. The LockObtainFailedException is also thrown if an IndexReader on the same directory is used to delete documents from the index.

    2.任一时刻,不能有多个IndexReader在执行文档的删除操作。下一个InderReader应当在上一个InderReader执行close方法之后运行。

    3.在使用IndexWriter向索引加入文档前,必须先关闭执行删除操作的IndexReader实例。

     lucene3.0API:An IndexReader can be opened on a directory for which an IndexWriter is opened already, but it cannot be used to delete documents from the index then.

    4.在使用IndexReader删除前,必须先关闭执行添加Document操作IndexWriter的实例。

    综合说来,任何对索引发生修改的操作都不能同时发生;或是在上一修改操作未保存的情况下,用新的实例对索引进行下一修改操作。 

    Lucene锁机制

    lucene使用commit.lock

    与write.lock实现锁机制。所谓的锁其实是存放于系统临时目录内的一个文件。例如,建立索引时,可以看到一个write.lock存放在临时目录中。又如,当合并索引时,会看到一个commit.lock存放在临时目录中。

    那么,这些锁究竟在什么时候会出现呢?正如前面所说到的,Lucene的同步问题只可能发生在对索引进行文档添加,文档删除,合并segment和优化时,因此lucene锁也基本都出现在这时候。

    1.write.lock

    writer.lock出现在向索引添加文档时,或是将文档从索引中删除时。writer.lock会在indexwriter被初始化时创建,然 后会在调用IndexWriter的close()方法时被释放。另外,会在IndexReader使用delete方法删除文档时创建,并在调用 IndexReader的close()方法时被释放。

    2.commit.lock

    commit.lock主要与segment合并和读取的操作相关。例如,他出现在IndexWriter的初始化时,但是一旦当segment的 信息被读取完毕,它就会立刻被释放。另外,当调用IndexWriter的AddIndexs()或MergeSegment()方法时,都会生成这个 锁。

    事实上,由于有了这两个锁的所有,才使得lucene具有了保护器索引不受非法操作的功能。 

    建议IndexWriter作为单例模式得到,IndexReader进行删除时上锁


     

  • 相关阅读:
    CSDN博客频道维护公告
    JavaScript高级编程II
    ORACLE触发器具体解释
    下拉刷新和上拉载入的原理
    在遍历中使用 iterator/reverse_iterator 进行 Erase 的使用方法
    python解析Yahoo的XML格式的天气预报,获取当天和近期几天的天气:
    CheckBoxPreference组件
    Java中Integer类的方法
    TFS(Team Foundation Server)介绍和入门
    电脑报2014年第43期 pdf高清版
  • 原文地址:https://www.cnblogs.com/lhuser/p/10678054.html
Copyright © 2011-2022 走看看