`
deepfuture
  • 浏览: 4350581 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:79582
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:68765
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:101968
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:282218
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:14710
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:66133
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:31485
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45406
社区版块
存档分类
最新评论

lucene-对多个索引的搜索和多线程搜索

阅读更多

1、如果应用程序架构由多个LUCENE索引组成,则可以通过MutltiSearcher把所有索引搜索。也可以通过ParallelMultiSearcher进行多线程搜索。在单核的情况下,MultiSearcher比ParallelMultiSearcher性能更高。

2、MultiSearcher

搜索2个搜索,把动物按首字母在字母表中的位置分成2部分,一部分一个索引

public class MultisearcherTest extends TestCase{

private Indexsearcher[]searchers;

public void setUp() throwsException{

String[] animals={"aardvark","beaver","coati","dog","lemur",

"python","vicuna","zebra"};

Ananlyzer analyzer=ne WhitespaceAnalyzer();

Directory aTomDirectory =new RAMDirectory();

Directory nTOzDirectory=new RAMDirectory();

//建立2个索引

IndexWriteraTomwriter=new IndexWriter(atomDirectory,analyzer,true);

IndexWriternTozwriter=new IndexWriter(aTozDirectory,analyzer,true);

 

for(int i=0;i<anaimals.length;i+){

Document doc=new Document();

Stringanimal=animals[i];

doc.add(Filed.Keyword("animal",animal));

if (animal.compareToIgnoreCase("n")<0){

aTomWriter.addDocument(doc);//前半部分索引a-m

}else{

nTozWriter.addDocument(doc);//后半部分索引 n-z

}

}

 

aTomwriter.close();

nTozwriter.close();

searchers=newIndexsearcher[2];

searcher[0]=new IndexSearcher(aTOmDirectory);

searcher[1]=new IndexSearhcer(nTOzDirectory);

 

}

public void testMulti() throws Exception{

MultiSearcher searcher=new MultiSearcher(searchers);

//对2个索引进行搜索

Query query=new RangeQuery(new Term("animal","h"),newTerm("animal","t"),true);

Hits hits= searcher.search(query);

}

}

3、ParallelMultiSearcher多线程搜索

搜索操作为每个Searchable分配一个线程,直到所有线程都完成其搜索。基本搜索和进行过滤的搜索是并行执行的。

lucene通过RMI为用户提供搜索远程索引功能。

RMI服务器绑定了一个RemoteSearchable的实例,它和IndexSearcher、MultiSearch一样,实现Searchable接口

1)把文档按26个字母切分为26个索引。服务器端向客户端提供2个RMI调用

public class SearchServer{

privatestatic final String ALPHABET="abcdefghijklmnopqrstuvwxyz";

publicstatic void main(String[] args) throws Exceptino{

if (args.length!=1){

System.err.printLn("Usage:Searchserver<basedir>");

System.exit(-1);

}

String basedir=args[0];

//为每个索引建立一个IndexSearcher对象

Searchable[] searchables=new Searchable[ALPHABET.length()];

for (int i=0;i<ALPHABET.length;i++){

searchables[]=new IndexSearcher(newFile(basedir,""+ALPHABET.charAt(i)).getAbsolutePath());

}

//注册可供客户端调用服务的端口

LocateRegistry.createRegistry(1099);

//使用multiSearcher完成所有索引的搜索

SearchermultiSearcher=new MultiSearcher(searchables);

RemoteSearchablemultiImpl=new RemoteSearchables(multiSearcher);

Naming.rebind("//localhost/LIA_Multi",multiImpl);//注册RMI方法

//使用parallelSearcher完成搜索

Searcher parallelSearcher=newParallelMultiSearcher(searchables);

RemoteSearchableparallelImpl=new RemoteSearchables(parallelSearcher);

Naming.rebind("//localhost/LIA_Parallel",parallelImpl);//注册RMI方法

System.out.println("server started");

}

}

2)客户端

public class SearchClient{

private static HashMapsearchercache=new HashMap();

 

public static voidmain(String[] args) throws Exception{

if (args.length!=1){

System.err.println("Usage:SearchClient<query>");

System.exit(-1);

}

Stringword=args[0];

for (int i=0;i<5;i++){

search("LIA_Multi",word);//调用服务器的multi方法搜索

search("LIA_Multi",word);//调用服务器的multi方法搜索

}
}

private static void search(String name,Stringword) throws Exception{

TermQuery query=new TermQuery(new Term("word",word));

MultiSearcher searcher=(MultiSearcher)searcherCache.get(name);//检查缓存中是否有该搜索器,该搜索器是带缓存功能的

if (searcher==null){//没有该搜索,则生成新的搜索

searcher=new MultiSearcher(newSearchable[]{lookupRemote(name)});

searcherCache.put(name,searcher);

}

//统计时间

long begin=new Date().getTime();

Hits hits=searcher.search(query);

long end=new Date().getTime()

 

...........

...........

//不要关闭searcher对象

}

private static Searchable lookupRemote(Stringname) throws Exception{

return (Searchable) Naming.lookup("//localhost/"+name);

}

}

分享到:
评论

相关推荐

    lucene-analyzing-infix-suggester-bug:Lucene AnalysisInfixSuggester错误演示

    我试图在多线程设置中从同一索引中提供建议,但是由于这种设计,我只能为每个进程的每个索引创建一个建议程序。 我已经创建了这个GitHub项目来演示该错误。 要运行演示: ./gradlew buildjava -jar build/libs/...

    【分享:lucene学习资料】---<下载不扣分,回帖加1分,欢迎下载,童叟无欺>

    4.12. ParalellMultiSearcher类---多线程搜索 14 5. 排序 14 5.1. Sort类 14 5.2. SortField类 14 5.3. 指定排序的法则 15 5.3.1. 按照文档的得分降序排序 15 5.3.2. 按文档的内部ID升序排序 15 5.3.3. 按照一个...

    基于lucene的搜索引擎总结

    不允许使用多个IndexWriter或IndexReader实例同时对一个索引进行修改 IndexWriter和IndexReader是线程安全的,可以被多线程共享 全文索引/搜索 中文分词器 最大匹配法(机械分词):按照一定的策略将待分析的汉字串...

    lucene.net搜索技术,附带学习资料

    另外就是可以用多线程来分别对不同的内容进行索引并保存到RAMDirectory里,然后再把所有的内存索引合并到FSDirectory里,甚至可以让多台服务器分别处理内容的各个部分,然后把索引结果放到一个队列里,再有一台机器...

    @#Lucene_In_Action中文#@

    Lucene 搜素 分词 ... 希望大家共同探讨.QQ群: 12966179 王小波 2008/12/10 ...本章还涉及Lucene索引的内部结构,用多线程和多进程访问Lucene时的重点和难点,以及防止并发索引修改的锁机制这些内容。

    基于Java搜索引擎的设计与实现开题报告.doc

    同时,需要考虑到搜索引擎的性能和效率,使用数据库管理作业及多线程技术来提高全文搜索的性能和效率。 4.搜索引擎在实践中的应用: 搜索引擎在实践中的应用非常广泛,如Google、Yahoo、Bing等国外知名的搜索引擎...

    UindexWeb搜索

    UindexWeb搜索是一个完整的蜘蛛程序,他的内部使用多线程, 多个自定义组件来实现搜索,在打开工程前,需要先安装如下自定 义组件: Uindex.pas (用来分析Html网页的组件) UindexStatusBar.pas (用来在状态栏画图片) ...

    Tantivy 是受 Apache Lucene 启发并用 Rust 编写的全文搜索引擎库

    10ms),非常适合命令行工具BM25评分(与Lucene相同)自然查询语言(例如(michael AND jackson) OR "king of pop" )短语查询搜索(例如"michael jackson" )增量索引多线程索引(在我的桌面上索引英文维基百科需要 ...

    论文研究-数字图书馆主题搜索引擎的设计与实现.pdf

    提出构建数字图书馆主题搜索引擎的总体...依赖数字图书馆各方面特点,提出支持多线程主题爬行器的设计,并提出一种新颖的URL主题相关性剪切算法EPR,为实现数字图书馆主题搜索引擎原型提供重要的设计。基于开源Lucene平

    ElasticSearch面试题.pdf

    分片(Shards):代表索引分片,ES 可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。 副本(Replicas):代表索引副本,ES 可以给索引设置副本,副本的作用是一...

    小旋风垂直搜索平台,快速拱建垂直搜索引擎

    小旋风是一款集多任务、多线程智能网络爬虫、基于xml / xpath的路径规则的数据抽取系统、无缝集成lucene.net2.3全文索引系统,高性能中文分词组件、多数据库支持的综合垂直搜索引擎平台。 它帮您快速搭建任何一个您...

    开题报告.doc

    该模型从互联网上获取网页,建立索引数据库,并采用数据库管理作业和多线程技术以提高全文搜索的性能和效率。 一、搜索引擎的架构设计 搜索引擎的架构主要由四个部分组成:用户接口、搜索器、索引生成器和查询...

    精选7道Elastic Search面试题!.pdf

    本文将对 Elastic Search(ES)面试题进行详细解析,涵盖了 ES 的基本概念、ES 和 Lucene 的区别、全文检索工具、Bulk 处理数据量、ES 的线程安全问题、ES 管理工具、ES 自动映射规则等方面的知识点。 一、为什么要...

    Hubble.net全文搜索源码

    Hubble.net 设计了较为完善的并发控制程序,数据的增删改查可以多线程同时并发进行,没有任何冲突。Hubble.net 还进行了缓存和内存管理设计,可以帮助用户最大限度的提高查询的效率。Hubble.net 力争在未来的几年内...

    wsm:网络信息搜索与挖掘

    这些文件包含多线程搜寻器的实现。 具体来说,scraper.py是从Goodreads网站抓取网页的实现。 crawler.py实现了搜寻器线程,线程安全的url队列和相关内容。 在SetQueue.py中实现了具有用于url重复数据删除的内置集的...

    HubbleDotNet 全文检索

    HubbleDotNet 是一个基于.net framework 的开源免费的全文搜索数据库组件。开源协议是 Apache 2.0。HubbleDotNet 提供 了基于SQL 的全文检索接口,使用者只需会操作 SQL,就可以很快学会使用 HubbleDotNet 进行全文...

    java开源包1

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包10

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    searchengineer:垂直搜索

    这个项目研究了1年,先是网络爬虫和网页解析,研究了多线程抓取技术,优先队列实现,怎样对html文档一个标签一个标签的解析,生成dom树. 然后是网页去噪,网页自动分类。读了大量论文,研究了怎样把文档用向量的形式进行...

    基于Lucene的海量数据库全文检索的设计与实现 (2011年)

    基于Lucene实现了一个海量数据库全文检索的原型。把关系数据库引入了本系统,可针对...采用多线程,通过动态机制来实现不同类型源数据库中记录的抽取、转换、建立索引;提供定时自动更新索引的功能;提供多种检索方式。

Global site tag (gtag.js) - Google Analytics