MultiSearcher在多个索引上搜索

 

以前的搜索都是单域搜索,下面就是多域搜索MultiFieldQueryParser

public static Query parse(String[ ] queries,String[ ] fields,BooleanClause.Occur.[ ] flags,Analyzer analyzer)   t hroiws ParseExcepton

queries 表示要查找的域中关键字;fields表示域的名称;flags表示查询子句间的关系;analyzer表示分析器。

索引并非总存放在一个目录中,很多时候是按照“某种散列算法”放置在不同的目录中;这就用到了

MultiSearcher:

第一个索引

 

package  ch4.searcher;

import  java.io.IOException;
import  org.apache.lucene.analysis.standard. * ;
import  org.apache.lucene.document. * ;
import  org.apache.lucene.index. * ;
import  org.apache.lucene.search. * ;
import  org.apache.lucene.search.spans. * ;
import  org.apache.lucene.queryParser.ParseException;
import  org.apache.lucene.queryParser. * ;
public   class  Multisearcher
{
    
private   static  String INDEX_STORE_PATH1 = " d:/ch4/TermQuery10 " ;
    
private   static  String INDEX_STORE_PATH2 = " d:/ch4/TermQuery11 " ;
    
public   static   void  main(String[] args)  throws  Exception
    {
        Multisearcher.multisearcher();
    }
    
public   static   void  multisearcher() throws  Exception
    {
        IndexWriter writer
= new  IndexWriter(INDEX_STORE_PATH1, new  StandardAnalyzer(), true );
        writer.setUseCompoundFile(
false );
        
        Document doc1
= new  Document();
        Field f1
= new  Field( " bookname " , " 钢铁是怎样炼成的 " ,Field.Store.YES,Field.Index.TOKENIZED);
        Field  f11
= new  Field( " price " , " 20.5 " ,Field.Store.YES,Field.Index.UN_TOKENIZED);
        
        doc1.add(f1);
        doc1.add(f11);
        
        Document doc2
= new  Document();
        Field f2
= new  Field( " bookname " , " 钢铁战士 " ,Field.Store.YES,Field.Index.TOKENIZED);
        Field  f22
= new  Field( " price " , " 18.4 " ,Field.Store.YES,Field.Index.UN_TOKENIZED);
        
        doc2.add(f2);
        doc2.add(f22);
        
        Document doc3
= new  Document();
        Field f3
= new  Field( " bookname " , " 钢和铁是两种不同的元素 " ,Field.Store.YES,Field.Index.TOKENIZED);
        Field  f33
= new  Field( " price " , " 7.6 " ,Field.Store.YES,Field.Index.UN_TOKENIZED);
        
        doc3.add(f3);
        doc3.add(f33);
        
        writer.addDocument(doc1);
        writer.addDocument(doc2);
        writer.addDocument(doc3);
        
        writer.close();

第二个索引

 

// 创建第二个索引器;
        IndexWriter writer2 = new  IndexWriter(INDEX_STORE_PATH2, new  StandardAnalyzer(), true );
        writer.setUseCompoundFile(
false );
        
        Document doc4
= new  Document();
        Field f4
= new  Field( " bookname " , " 钢要比铁有更多的元素 " ,Field.Store.YES,Field.Index.TOKENIZED);
        Field  f44
= new  Field( " price " , " 22.5 " ,Field.Store.YES,Field.Index.UN_TOKENIZED);
        
        doc4.add(f4);
        doc4.add(f44);
        
        Document doc5
= new  Document();
        Field f5
= new  Field( " bookname " , " 钢和铁是两种重要的金属 " ,Field.Store.YES,Field.Index.TOKENIZED);
        Field  f55
= new  Field( " price " , " 15.9 " ,Field.Store.YES,Field.Index.UN_TOKENIZED);
        
        doc5.add(f5);
        doc5.add(f55);
        
        Document doc6
= new  Document();
        Field f6
= new  Field( " bookname " , " 钢铁是两种重要的金属 " ,Field.Store.YES,Field.Index.TOKENIZED);
        Field  f66
= new  Field( " price " , " 19.00 " ,Field.Store.YES,Field.Index.UN_TOKENIZED);
        
        doc6.add(f6);
        doc6.add(f66);
        
        writer.addDocument(doc4);
        writer.addDocument(doc5);
        writer.addDocument(doc6);
        
        writer2.close();

多域搜索

 

String query1 = " "
        String query2
= " [10 TO 20] " ; // 注意格式:中括号还有关键字TO是大写的 
        String[] queries = {query1,query2}; 

//          指定两个域Field 
        String field1 = " bookname "
        String field2
= " price "
        String[] fields
= {field1,field2}; 

//          指定查询字句之间的关系 
        BooleanClause.Occur[] clauses = {BooleanClause.Occur.MUST, 
        BooleanClause.Occur.MUST}; 

//          转成多域查询MultiFieldQuery 
        Query q = MultiFieldQueryParser.parse(queries, fields, clauses, 
        
new  StandardAnalyzer() ); 

//          打印Query的内容 
        System.out.println(q.toString()); 

//          创建两个IndexSearcher,以实现在多个索引目录进行查询 
        IndexSearcher searcher1 = new  IndexSearcher(INDEX_STORE_PATH1); 
        IndexSearcher searcher2
= new  IndexSearcher(INDEX_STORE_PATH2); 

        IndexSearcher[] searchers
= {searcher1,searcher2}; 

       
// 使用MultiSearcher进行多域搜索
        MultiSearcher searcher = new  MultiSearcher(searchers); 
        Hits hits
= searcher.search(q); 
        
for ( int  i = 0 ;i  < hits.length();i ++ )
        { 
             System.out.println(hits.doc(i)); 
        }
    }
}

MultiSearcher原理是对一个IndexSearcher的数组进行循环遍历。分别进行查找,然后合并,使用HitCollector收集后返回;

注:1,其实这个程序还没调试好……

        2.打印Query内容是可以直接写成System.out.println(q).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值