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

标签: lucene 索引 搜索 | 发表时间:2015-08-13 10:05 | 作者:m635674608
出处:http://www.iteye.com

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

2、MultiSearcher

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

public class MultisearcherTest extends TestCase{

   private Indexsearcher[] searchers;

   public void setUp() throws Exception{ 

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

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

        Ananlyzer analyzer=ne WhitespaceAnalyzer();

        Directory aTomDirectory =new RAMDirectory();

        Directory nTOzDirectory=new RAMDirectory();

//建立2个索引

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

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

        

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

            Document doc=new Document();

            String animal=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"),new Term("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{

    private static final String ALPHABET="abcdefghijklmnopqrstuvwxyz";

    public static 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(new File(basedir,""+ALPHABET.charAt(i)).getAbsolutePath());              

        }    

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

        LocateRegistry.createRegistry(1099);

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

        Searcher multiSearcher=new MultiSearcher(searchables);

        RemoteSearchable multiImpl=new RemoteSearchables(multiSearcher);

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

//使用   parallelSearcher   完成搜索 

        Searcher parallelSearcher=new ParallelMultiSearcher(searchables);

        RemoteSearchable parallelImpl=new RemoteSearchables(parallelSearcher);

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

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

        }

    }

2)客户端

public class SearchClient{

   private static HashMap searchercache=new HashMap();

  

   public static void main(String[] args) throws Exception{

      if (args.length!=1){

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

         System.exit(-1);

      }

      String word=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,String word) throws Exception{

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

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

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

           searcher=new MultiSearcher(new Searchable[]{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(String name) throws Exception{

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

     }

 

http://blog.sina.com.cn/s/blog_3dc2673e0100c3ok.html

}



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [lucene 索引 搜索] 推荐:

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

- - 编程语言 - ITeye博客
1、如果应用程序架构由多个LUCENE索引组成,则可以通过MutltiSearcher把所有索引搜索. 也可以通过ParallelMultiSearcher进行多线程搜索. 在单核的情况下,MultiSearcher比ParallelMultiSearcher性能更高. 搜索2个搜索,把动物按首字母在字母表中的位置分成2部分,一部分一个索引.

[原]基于Lucene多索引进行索引和搜索

- - 千与的专栏
Lucene支持创建多个索引目录,同时存储多个索引. 我们可能担心的问题是,在索引的过程中,分散地存储到多个索引目录中,是否在搜索时能够得到全局的相关度计算得分,其实Lucene的ParallelMultiSearcher和MultiSearcher支持全局得分的计算,也就是说,虽然索引分布在多个索引目录中,在搜索的时候还会将全部的索引数据聚合在一起进行查询匹配和得分计算.

LIRE(Lucene Image Retrieval)相似图像索引和搜索机制

- - CSDN博客云计算推荐文章
众说周知,lucene是一个开源的强大的索引工具,但是它仅限于文本索引. 基于内容的图像检索(CBIR)要求我们利用图像的一些基本特征(如颜色纹理形状以及sift,surf等等)搜索相似的图片,LIRE(Lucene Image Retrieval)是一款基于lucene的图像特征索引工具,它能帮助我们方便的对图像特征建立索引和搜索,作者也在不断加入新的特征供用户使用.

开源搜索引擎评估:lucene sphinx elasticsearch

- - 鲁塔弗的博客
lucene系,java开发,包括 solr和 elasticsearch. sphinx,c++开发,简单高性能. 搜索引擎程序这个名称不妥当,严格说来应该叫做 索引程序(indexing program),早期主要用来做中文全文搜索,但是随着互联网的深入普及,各家网站规模越来越大,索引程序在 优化网站架构上发挥了更大的作用: 替代mysql数据库 内置的索引.

有关Lucene的问题(7):用Lucene构建实时的索引

- -
由于前一章所述的Lucene的事务性,使得Lucene可以增量的添加一个段,我们知道,倒排索引是有一定的格式的,而这个格式一旦写入是非常难以改变的,那么如何能够增量建索引呢. Lucene使用段这个概念解决了这个问题,对于每个已经生成的段,其倒排索引结构不会再改变,而增量添加的文档添加到新的段中,段之间在一定的时刻进行合并,从而形成新的倒排索引结构.

全文搜索Lucene——之倒排算法

- - 互联网 - ITeye博客
  关系数据库不适合做全文搜索. like '%xxx%'效率很慢,建的索引将无效,查询的时候会像翻书一样一页一页的翻. 返回的结果没有匹配度的概念,比如在所有文章里索引一篇想要的文章,可能是希望搜索的关键词在文章中出现的次数越多越是我想要的结果. 当搜索live的时候,也想把lives/living搜出来,但是数据库很难做到.

[原]Lucene系列-近实时搜索

- - 文武天下
近实时搜索(near-real-time)可以搜索IndexWriter还未commit的内容,介于immediate和eventual之间,在数据比较大、更新较频繁的情况下使用. lucene的nrt可以控制更新生效的间隔时间. 从indexwriter中获得indexreader. 建立indexsearcher.

lucene索引创建的理解思路

- - ITeye博客
虽然lucene4很早就出来,但是这里仍然以lucene3.0为基础,理解lucene索引创建的思路:. field的数据,fdx,fdt,依次写每个field的即可. 词向量,tvx,tvd,tvf. tvf是真正存储的地方,tvx是每个文档一项,具体包含第一个field的位置,其他field只要记录与覅一个field的偏移量即可.

[原]Lucene系列-索引文件

- - 文武天下
本文介绍下lucene生成的索引有哪些文件组成,每个文件包含了什么信息. 基于Lucene 4.10.0. 索引(index)包含了存储的文档(document)正排、倒排信息,用于文本搜索. 索引又分为多个段(segments),每个新添加的doc都会存到一个新segment中,不同的segments又会合并成一个segment.

减小lucene索引体积大小

- - sling2007的博客
下文讲述了lucene中,如何优化索引,减小索引体积. 如果需要被搜索的数值类型,需要设置合适的precisionstep. 如果不需要搜索,只要排序即可,那么设置precisionstep为Integer.Max即可. 使用geohash算法,给每个区域编码,把编码切成term并索引,然后用于搜索.