【Lucene】近实时搜索】的更多相关文章

Lucene做站内搜索的时候经常会遇到实时搜索的应用场景,比如用户搜索的功能.实现实时搜索,最普通的做法是,添加新的document之后,调用 IndexWriter 的 Commit 方法把内存中的索引提交到硬盘:然后重新打开IndexReader,进行搜索.但是索引一般存储在硬盘上,而且当索引文件比较大的时候,Commit操作和重新打开IndexReader效率比较低. 于是就想,可否一份索引的IndexWriter始终打开,当需要添加或删除Document时,直接调用该IndexWrite…
近实时搜索(near-real-time)可以搜索IndexWriter还未commit的内容,介于immediate和eventual之间,在数据比较大.更新较频繁的情况下使用.本文主要来介绍下如何使用,其原理还没弄透,改天再续.本文代码基于lucene 4.10 IndexReader的重建 想要看到新的结果就需要重新打开一个IndexReader,DirectoryReader提供了DirectoryReader openIfChanged(DirectoryReader oldReade…
近实时搜索:可以使用一个打开的IndexWriter快速搜索索引的变更内容,而不必首先关闭writer,或者向该writer提交:这是2.9版本之后推出的新功能. 代码示例(本例参考<Lucene In Action>): package com.tan.code; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.Analyzer; import org.apache.luce…
近实时搜索就是他能打开一个IndexWriter快速搜索索引变更的内容,而不必关闭writer,或者向writer提交,这个功能是在2.9版本以后引入的,在以前没有这个功能时,必须调用writer的commit方法,然后重新打开reader,这个过程很耗费时间,因为writer的提交必须对索引里的所有新文件进行同步,同步操作耗费系统资源,近实时搜索使我们能够对新创建还未提交的索引进行搜索. 在4.5的版本上做一个简单的测试示例,参考lucene in action [java] view pla…
转载:http://www.infoq.com/cn/articles/anatomy-of-an-elasticsearch-cluster-part03 近实时搜索 虽然Elasticsearch中的变更不能立即可见,它还是提供了一个近实时的搜索引擎.如前一篇中所述,提交Lucene的变更到磁盘是一个代价昂贵的操作.为了避免在文档对查询依然有效的时候,提交变更到磁盘,Elasticsearch在内存缓冲和磁盘之间提供了一个文件系统缓存.内存缓存(默认情况下)每1秒刷新一次,在文件系统缓存中使…
好久没干这块东西了,近几天须要做这个.所以又一次学了一下.首先很感谢孔浩老师,没孔浩老师的视频我也不会进入lucene的殿堂. 老师当时讲的实时搜索还是NRTManager,如今已经都变了,这个类已经不存在了,在4.0之后消失的.到我如今使用的5.2.1都是以下的方法: 首先罗列会使用的特殊类(经常使用的不再赘述): TrackingIndexWriter  追踪writer,在api中有介绍,仅仅有通过这个类进行更新ControlledRealTimeReopenThread才干获得更新 Co…
摘要: Solr的近实时搜索NRT(Near Real Time Searching)意味着文档可以在索引以后马上可以被查询到. Solr不会因为本次提交而阻塞更新操作,不会等待后台合并操作(merge)的完成而是直接检索索引并返回数据.参见原文 利用NRT,就可以设置soft commit,因为标准的commit操作代价高昂,soft commit可以做到近乎实时的查询效果而不丢失数据. Commits 与 Optimizing 一个commit操作可以使新的查询请求能够感知到索引的变化,一般…
在solr中,实时搜索有3种方案 ①soft commit,这其实是近实时搜索,不能完全实时. ②RealTimeGet,这是实时,但只支持根据文档ID的查询. ③和第一种类似,只是触发softcommit. 综上,其实是由实时(②)和近实时(①③)两种. solr4.0 之后使用NRT的方法和需要的配置 方案1 使用soft commit达到近实时搜索的效果. 为了使用soft commit ,需要配置solrconfig.xml.其中两个地方需要修改 <autoCommit> <ma…
Lucene版本:3.0 一般情况下,lucene的IndexSearcher都要写成单实例,因为每次创建IndexSearcher对象的时候,它都需要把索引文件加载进来,如果访问量比较大,而索引也比较大,那就很容易造成内存溢出! 但是如果仅仅按照一般的单实例来写的话,如果更新了索引,那么在不重启服务的情况下,Searcher对象是搜索不到索引更新后的内容的.如何解决呢,这里给出一个方法! 在这个方法里,建造了一个Factory类,分别管理IndexReader和IndexSearcher的单实…
这两天加班,不能兼顾博客的更新.请大家见谅. 有时候我们创建完索引之后,数据源可能有更新的内容.而我们又想像数据库那样能直接体如今查询中.这里就是我们所说的增量索引.对于这种需求我们怎么来实现呢?lucene内部是没有提供这种增量索引的实现的. 这里我们一般可能会想到.将之前的索引所有删除,然后进行索引的重建. 对于这样的做法.假设数据源的条数不是特别大的情况下倒还能够.假设数据源的条数特别大的话.势必会造成查询数据耗时.同一时候索引的构建也是比較耗时的,几相叠加,势必可能造成查询的时候数据缺失…