lucene学习(3)

2019-03-03 11:36

2.7 并发、线程安全及锁机制

并发操作

? 任意数量的只读属性的IndexReader类都可以同时打开一个索引.无论这些

Reader是否属于同一个JVM,以及是否属于同一台计算机都无关紧要.但需要 记住:在单个JVM内,利用资源和发挥效率的最好办法是用多线程共享单个的 IndexReader实例.例如,多个线程或进程并行搜索同一个索引.

? 对于一个索引来说,一次只能打开一个Writer. Lucene采用文件锁来提供保

障.一旦建立起IndexWriter对象,系统即会分配一个锁给它. 该锁只有当IndexWriter对象被关闭时才会释放。注意如果你使用IndexReader对象来改变索引的话 比如修改norms或者删除文档。这时IndexReader对象会作为Writer使用:它必须在修改上述内容之前成功地获取Write锁,并在被关闭时释放该锁.

? IndexReader对象甚至可以在IndexWriter对象正在修改索引时打开。每个

IndexReader对象将向索引展示自己被打开的时间点.该对象只有在 IndexWriter对象提交修改或自己被重新打开后才能获知索引的修改情况.所 以一个更好的选择是,在已经有IndexReader对象被打开的情况下,打开新 IndexReader时采用参数create=true:这样,新的IndexReader会持续检查索引的情况.

? 任意多个线程都可以共享同一个IndexReader 类或IndexWriter类。这些类不

仅是线程安全 的,而且是线程友好的,即是说它们能够很好地 扩展到新增线程(假定你的硬件支持并发访问, 因为这些类中标识为同步(synchronized)的代码 数并不多,仅为最小值).

2.7.1远程文件系统访问索引

Solr能比较好的支持索引复制策略。

对于不连贯的客户端缓存出现的间断性问题。程序将在open或reopen方法中抛出FileNotFoundException异常。该问题的解决方法:稍后重新操作即可,因为客户端缓存会在出现问题一段时间后自动修复。

NFS系统中客户端删除操作可能引起IOException异常。处理方式详见[1]P57

2.7.2 锁机制

详见[1]P57页起。

2.8 其他

IndexReader删除文档[1]P61

回收被删除文档所使用过的磁盘空间[1]P62 expungeDeletes 缓

[1]P62

setRAMBufferSizeMB

setMaxBufferedDocs

setMaxBufferedDeleteTerm。刷新操作是用来释放被缓存的更改的;提交操作是用来让所有的更改在索引中保持可视。 索引提交与事务[1]P63 两阶段提交 prepareCommit() 合并段[1]P66

3. 实现搜索

QueryParser可将输入的搜索语句转化为查询条件Query,而Query也可通过简单查询对象来构建。

IndexSearcher

大多数情况下我们搜索的索引都是存在于文件系统的: Directory dir = FSDirectory.open(new File(\然后建立一个 IndexReader:

IndexReader reader = IndexReader.open(dir); 最后,创建IndexSearcher:

IndexSearcher searcher = new IndexSearcher(reader);

由于打开一个IndexReader需要较大的系统开销,因此最好是在所有搜索期间都重复使用同一个IndexReader实例,只在必要时才打开新的IndexReader。 如需获取索引中的变更信息,必须打开一个新的reader。IndexReader.reopen可有效获取新的IndexReader,并耗费较少。可使用writer.getReader()获取处于相同jvm中IndexWriter的近实时reader,此速度更快。 IndexReader newReader = reader.reopen(); if (reader != newReader) {

reader.close(); reader = newReader;

searcher = new IndexSearcher(reader); }

如果索引有所变更,reopen方法值返回一个新的reader,这时程序必须关闭旧的reader并创建新的IndexSearcher。在实际的应用程序中,可能有多个线程还在使用旧的reader进行捜索,因此必须保证这段代码是线程安全的。

QueryParser

QueryParser parser = new QueryParser(Version matchVersion, String field,

Analyzer analyzer)

域名参数指所有被搜索项所定义的默认域,除了以下情况:搜索文本明确要求与 之匹配的域名必须用“field:text”的语法形式(详见[1]3.5.11小节)。然后调用parse()方法。

解析不成功会抛出ParseException异常。

TopDocs

TopDocs.totalHits属性会返回匹配文档数量。默认情况下,匹配文档是根据评分按照降 序排列的。TopDocs.scoreDocs属性是一个数组,它包含程序所要求的顶部匹配文档数量。 每个ScoreDoc实例都有一个浮点类型的评分,该评分是相关性评分,该实例还包括一个整 型的文档号,它用于标识文档ID,能够用于检索文档中保存的域,具体可以通过调用 IndexSearcher .document (doc) 方法进行。最后,TopDocs .getMaxScore () 方法会返回 所有匹配文档的最大评分,当使用相关性评分进行排序时(在默认情况下),返回的最大评分通常就是第一个搜索结果对应的评分。

分页功能

? 将首次搜索获得的多页搜索结果收集起来并保存在ScoreDocs和

IndexSearcher实 例中,并在用户换页浏览时展现这几页结果; ? 每次用户换页浏览时都重新进行查询操作。

重新查询通常是更好的解决方案。这个方案可以不用存储每个用户的当前浏览状态, 而这个操作对于Web应用程序来说开销巨大,特别是对于拥有巨大用户群的应用程序来 说。咋一看,重新查询似乎比较浪费,但Lucene的快速处理


lucene学习(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:星级酒店餐厅菜单之认识

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: