yomin
yomin

Reputation: 551

How to use termVector in solrJ

Solr/SolrJ Version: 6.0.0

I've set termvector component in solrconfig.xml, and the request handler is "/tvrh", I test it in the browser and this works. Now I want to use it in solrJ, but it only returns the document. The following is my code:

    SolrClient solrClient = new HttpSolrClient("http://localhost:8983/solr/test");
    SolrQuery solrQuery = new SolrQuery();
    solrQuery.setQuery(String.format("id:%s","clueweb12-0000tw-06-17744"));
    solrQuery.setRequestHandler("/tvrh");
    solrQuery.set("tv", true);
    solrQuery.set("tv.all", true);

    QueryResponse response = solrClient.query(solrQuery);
    SolrDocumentList docs = response.getResults();

    for (SolrDocument doc: docs){
        for (String key: doc.keySet()){
            System.out.println(key);
            System.out.println(doc.getFieldValue(key));
        }
    }

Upvotes: 0

Views: 374

Answers (2)

yomin
yomin

Reputation: 551

As @Karsten R says, we could not use SolrClient.query to send request. After I searched a lot and experimented a lot, the following code could work.

SolrClient solrClient = new HttpSolrClient("http://localhost:8983/solr/trecB13");
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery(String.format("id:%s","clueweb12-0000tw-06-17744"));
solrQuery.setRequestHandler("/tvrh");
solrQuery.set("tv", true);
solrQuery.set("tv.all", true);

try {
    NamedList<Object> response = solrClient.request(new QueryRequest(solrQuery));
    TermVectorExtractor extractor = new TermVectorExtractor(response);
    System.out.println(extractor.getTermVectorInfo());
    } catch (Exception e) {
        e.printStackTrace();
}

TermVectorExtractor.java reference Sakai-Solr Github code, the function of the class is to parse resonse object and get term info. A little different from original code. The different has been shown below.

import org.apache.solr.common.util.NamedList;

import java.util.*;

public class TermVectorExtractor {
    private static final String TERM_VECTORS = "termVectors";

    private Map<String, Map<String, Map<String, TermInfo>>> termVectorInfo = Collections.emptyMap();

    /**
     * Creates a TermVectorExtractor for the given query response sent by Solr.
     *
     * @param queryResponse response sent by the solr server for a search query.
    */
    @SuppressWarnings("unchecked")
    public TermVectorExtractor(NamedList<Object> queryResponse) {
        NamedList<Object> res = (NamedList<Object>)  queryResponse.get(TERM_VECTORS);
        if (res != null)
            termVectorInfo = extractTermVectorInfo(res);
    }
}

Upvotes: 0

Karsten R.
Karsten R.

Reputation: 1758

Your question is how to use a non standard request handler in solr.

Be aware that the Term Vector Component belongs to a "non standard" request handler and is not supported from solrj: https://cwiki.apache.org/confluence/display/solr/The+Term+Vector+Component#TheTermVectorComponent-SolrJandtheTermVectorComponent

You can call "/tvrh" via solrj in a generic mode. You can not use the method SolrClient#query(SolrParams params) for this, because in this case the "request handler" is only send as "qt"-Parameter and will not be part of the url-path (and qt-Parameter is ignored by default).

So please try the method "SolrClient#request" instead.

Upvotes: 1

Related Questions