如何在solrj中使用termvector

osh3o9ms  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(241)

solr/solrj版本:6.0.0
我已经在solrconfig.xml中设置了termvector组件,请求处理程序是“/tvrh”,我在浏览器中测试了它,结果成功了。现在我想在solrj中使用它,但它只返回文档。以下是我的代码:

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));
        }
    }
hsgswve4

hsgswve41#

您的问题是如何在solr中使用非标准的请求处理程序。
请注意,术语向量组件属于“非标准”请求处理程序,solrj不支持:https://cwiki.apache.org/confluence/display/solr/the+term+vector+component#thetermvectorcomponent-solrjanthetermvector组件
您可以在通用模式下通过solrj调用“/tvrh”。您不能为此使用solrclient#query(solrparams params)方法,因为在这种情况下,“request handler”仅作为“qt”参数发送,而不是url路径的一部分(默认情况下忽略qt参数)。
因此,请尝试“solrclient#request”方法。

yqlxgs2m

yqlxgs2m2#

正如@karsten r所说,我们不能使用solrclient.query发送请求。在我进行了大量的搜索和实验之后,下面的代码可以工作了。

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();
}

java引用sakai solr github代码,该类的功能是解析resonse对象并获取term信息。和原来的代码有点不同。不同之处如下所示。

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);
    }
}

相关问题