2013-05-04 50 views
2

我正在開發使用solr API的自定義請求處理程序。 那麼作爲參考,我正在參考「MoreLikeThis」。Solr API,如何訪問文檔?

我能夠使用「getDocList」API訪問文檔,然後採用「迭代器」對象,但它只給我文檔ID。

我該如何訪問文檔的每個字段?

package org.apache.solr.handler.ext; 

import org.apache.solr.request.*; 
import org.apache.solr.response.*; 
import org.apache.solr.handler.*; 
import org.apache.solr.core.*; 
import org.apache.solr.schema.*; 
import org.apache.lucene.analysis.*; 
import org.apache.solr.common.params.*; 
import org.apache.solr.search.*; 
import org.apache.lucene.search.*; 
import org.apache.solr.search.SolrIndexSearcher.*; 

import org.apache.lucene.document.Document; 
import org.apache.lucene.index.IndexReader; 

import java.util.*; 
import java.io.*; 

public class MyRequestHandler extends RequestHandlerBase{ 


@Override 
    public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) 
     throws Exception { 

    System.out.println("I am in My Handler"); 

    /** 
    * Working with core 
    */ 
    SolrCore core = req.getCore(); 
    System.out.println("Core is " + "" + core.getDescription()); 
    System.out.println("Data directory is " + "" + core.getDataDir()); 
    System.out.println("Index directory is " + "" + core.getIndexDir()); 


    /** 
    * Working with schema 
    */ 
    IndexSchema schema = core.getSchema(); 
    SchemaField field = schema.getField("country"); 

    System.out.println(field.isRequired()); 

    /** 
    * Create Map 
    */ 

    IndexSchema schemaObj = req.getSchema(); 

    Map<String , SchemaField>map = req.getSchema().getFields(); 

    // Iterate over keys 
    for (String str : map.keySet()){ 
     System.out.println(str); 
    } 

    // Iterate over SchemaField 

    for (SchemaField schemaFieldObj: map.values()){ 

     System.out.println(schemaFieldObj.isRequired()); 
    } 

    /** 
    * Find the Unique Key Field 
    */ 

    field = schemaObj.getUniqueKeyField(); 
    System.out.println(field.getName()); 

    System.out.println(schemaObj.getQueryParserDefaultOperator()); 



    /** 
    * Working with request parameters 
    */ 

    SolrParams reqParams = req.getParams(); 
    String q = reqParams.get(CommonParams.Q); 
    System.out.println(reqParams.get(CommonParams.Q)); 

    String defType = reqParams.get(QueryParsing.DEFTYPE , QParserPlugin.DEFAULT_QTYPE); 
    System.out.println(defType); 


    /** 
    * Working with QParser 
    */ 
    QParser queryParser = QParser.getParser(q, defType, req); 
    Query query = queryParser.getQuery(); 


    /** 
    * Now get searcher 
    */ 

    SolrIndexSearcher indexSearcher = req.getSearcher(); 
    DocList matchDocs = indexSearcher.getDocList(query, null, null, 1, 100000,10000); 

    // Number of documents matched 
    System.out.println(matchDocs.matches()); 
    // Get Iterator 
     // get documentreader 
     Reader reader; 
    IndexReader readDoc; 
    Document doc; 
    DocIterator iterator = matchDocs.iterator(); 
    while (iterator.hasNext()){ 
    Integer id = iterator.nextDoc(); 
    System.out.println("Here I am " + id); 


     /* HOW TO ACCESS ALL FIELDS OF DOCUMENT */ 


    } 

} 

    @Override 
    public String getDescription() { 
    return "My Search Handler"; 
    } 

    @Override 
    public String getSource() { 
    return "$Source$"; 
    } 


    @Override 
    public String getVersion() { 
    return "$Revision$"; 
    } 

} 

回答

4

嗯,我得到了答案.. 這裏是幫我去每個字段代碼..

package org.apache.solr.handler.ext; 


public class MyRequestHandler extends RequestHandlerBase{ 


@Override 
    public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) 
     throws Exception { 

    System.out.println("I am in My Handler"); 

    /** 
    * Working with core 
    */ 
    SolrCore core = req.getCore(); 
    System.out.println("Core is " + "" + core.getDescription()); 
    System.out.println("Data directory is " + "" + core.getDataDir()); 
    System.out.println("Index directory is " + "" + core.getIndexDir()); 


    /** 
    * Working with schema 
    */ 
    IndexSchema schema = core.getSchema(); 
    SchemaField field = schema.getField("country"); 

    System.out.println(field.isRequired()); 

    /** 
    * Create Map 
    */ 

    IndexSchema schemaObj = req.getSchema(); 

    Map<String , SchemaField>map = req.getSchema().getFields(); 

    // Iterate over keys 
    for (String str : map.keySet()){ 
     System.out.println(str); 
    } 

    // Iterate over SchemaField 

    for (SchemaField schemaFieldObj: map.values()){ 

     System.out.println(schemaFieldObj.isRequired()); 
    } 

    /** 
    * Find the Unique Key Field 
    */ 

    field = schemaObj.getUniqueKeyField(); 
    System.out.println(field.getName()); 

    System.out.println(schemaObj.getQueryParserDefaultOperator()); 



    /** 
    * Working with request parameters 
    */ 

    SolrParams reqParams = req.getParams(); 
    String q = reqParams.get(CommonParams.Q); 
    System.out.println(reqParams.get(CommonParams.Q)); 

    String defType = reqParams.get(QueryParsing.DEFTYPE , QParserPlugin.DEFAULT_QTYPE); 
    System.out.println(defType); 


    /** 
    * Working with QParser 
    */ 
    QParser queryParser = QParser.getParser(q, defType, req); 
    Query query = queryParser.getQuery(); 


    /** 
    * Now get searcher 
    */ 

    SolrIndexSearcher indexSearcher = req.getSearcher(); 
    IndexReader reader = indexSearcher.getIndexReader(); 
    DocList matchDocs = indexSearcher.getDocList(query, null, null, 1, 100000,10000); 

    // Number of documents matched 
    System.out.println(matchDocs.matches()); 
    // Get Iterator 
     // get documentreader 

    Document doc; 
    String[] DocFields; 

    DocIterator iterator = matchDocs.iterator(); 
    while (iterator.hasNext()){ 
    Integer id = iterator.nextDoc(); 
    System.out.println("Here I am " + id); 
    doc = reader.document(id); 
    DocFields = doc.getValues("state"); 

    for(int i=0;i<DocFields.length;i++){ 
     System.out.println(DocFields[i]); 
    } 

    } 

} 

    @Override 
    public String getDescription() { 
    return "My Search Handler"; 
    } 

    @Override 
    public String getSource() { 
    return "$Source$"; 
    } 


    @Override 
    public String getVersion() { 
    return "$Revision$"; 
    } 

} 

那麼總之,我們對我們需要的「讀者」的訪問文件「IndexReader」類的對象,然後從'reader'調用方法'getValues('YOUR FIELD NAME')'。它將返回字符串數組。