Java 自定义QueryResponseWriter在solr 7.3.0中不工作

Java 自定义QueryResponseWriter在solr 7.3.0中不工作,java,solr,Java,Solr,我以taming textbook为例,在solr中添加自定义QueryResponseWriter。但是它在wt中没有显示为tah 当我点击下面的查询时,将显示空响应 http://localhost:8983/solr/collectiona/type-ahead?q=fayes&wt=tah 在我的solr配置中,我已经放置了lib的以下dir路径 <lib dir="${solr.install.dir:../../../..}/contrib/customrespons

我以taming textbook为例,在solr中添加自定义
QueryResponseWriter
。但是它在
wt
中没有显示为
tah

当我点击下面的查询时,将显示空响应

http://localhost:8983/solr/collectiona/type-ahead?q=fayes&wt=tah
在我的solr配置中,我已经放置了lib的以下dir路径

<lib dir="${solr.install.dir:../../../..}/contrib/customresponsewriter" regex=".*\.jar" />

我已经为这本书中提到的内容创建了一个jar文件。这是我的java类

public class TypeAheadResponseWriter implements QueryResponseWriter {
        private Set<String> fields;


        public void write(Writer writer, SolrQueryRequest solrQueryRequest, SolrQueryResponse solrQueryResponse) throws IOException {
            SolrIndexSearcher searcher = solrQueryRequest.getSearcher();
            NamedList namedList = solrQueryResponse.getValues();
            int size = namedList.size();
            for (int i = 0; i < size; i++) {
                Object val = namedList.getVal(i);
                if (val instanceof DocList) {
                    DocList docList = (DocList) val;
                    DocIterator docIterator = docList.iterator();
                    writer.append("<ul>\n");
                    while (docIterator.hasNext()) {
                        int id = docIterator.nextDoc();
                        Document doc = searcher.doc(id, fields);
                        String name = doc.get("title");
                        writer.append("<li>" + name + "</li>");
                    }
                    writer.append("</ul>\n");
                }
            }
        }


        public String getContentType(SolrQueryRequest solrQueryRequest, SolrQueryResponse solrQueryResponse) {
            return "text/html;charset=UTF-8";
        }


        public void init(NamedList namedList) {
            fields = new HashSet<String>();
            fields.add("title");
        }
}
公共类TypeAheadResponseWriter实现QueryResponseWriter{
私有集合字段;
公共void write(Writer-Writer、SolrQueryRequest-SolrQueryRequest、SolrQueryResponse-SolrQueryResponse)引发IOException{
solrindexearcher searcher=solrQueryRequest.getSearcher();
NamedList NamedList=solrQueryResponse.getValues();
int size=namedList.size();
对于(int i=0;i\n”);
while(docIterator.hasNext()){
int id=docIterator.nextDoc();
文档文档=searcher.doc(id,字段);
字符串名称=doc.get(“title”);
writer.append(“
  • ”+name+”
  • ”); } writer.append(“\n”); } } } 公共字符串getContentType(SolrQueryRequest SolrQueryRequest,SolrQueryResponse SolrQueryResponse){ 返回“text/html;charset=UTF-8”; } public void init(NamedList NamedList){ 字段=新的HashSet(); 字段。添加(“标题”); } }
    这是我的queryResponsewriter的solr配置

    <queryResponseWriter name="tah" class="cqw.TypeAheadResponseWriter"/>
       <requestHandler name="/type-ahead" class="solr.SearchHandler">
        <lst name="defaults">
         <str name="wt">tah</str>
         <str name="defType">dismax</str>
         <str name="qf">title_prefix_typeahead^1.0</str>
     </lst>
    </requestHandler>
    
    
    塔赫
    沮丧
    title\u prefix\u typeahead ^1.0
    
    自定义库在solr启动期间加载,这是我的solr日志

    从以下路径向类加载器添加了63个lib:[/home/bibek/software/java/solr-7.3.0/contrib/clustering/lib,/home/bibek/software/java/solr-7.3.0/contrib/customresponsewriter,/home/bibek/software/java/solr-7.3.0/contrib/extraction/lib,/home/bibek/software/java/solr-7.3.0/contrib/java/solr-7.3.0/dist]


    在solr core 7.3中,
    NameList::getVal(index)
    将返回
    BasicResultContext
    ,它将包含
    DocList
    实例的内容。下面是我更改的代码,供将来参考

    public void write(Writer writer, SolrQueryRequest solrQueryRequest, SolrQueryResponse solrQueryResponse) throws IOException {
        LOGGER.info("Here we are....");
        SolrIndexSearcher searcher = solrQueryRequest.getSearcher();
        NamedList namedList = solrQueryResponse.getValues();
        LOGGER.info("Named List " + namedList.size());
        int size = namedList.size();
        for (int i = 0; i < size; i++) {
            Object val = namedList.getVal(i);
            LOGGER.info(val.toString());
            if (val instanceof BasicResultContext) {
                BasicResultContext basicResultContext = (BasicResultContext) val;
                DocList docList = basicResultContext.getDocList();
                LOGGER.info("docList List " + docList.size());
                DocIterator docIterator = docList.iterator();
                writer.append("<ul>\n");
                while (docIterator.hasNext()) {
                    int id = docIterator.nextDoc();
                    LOGGER.info("id id " + id);
                    Document doc = searcher.doc(id, fields);
                    for (String field : fields) {
                        String value = doc.get(field);
                        LOGGER.info(value);
                        if (!StringUtils.isEmpty(value)) {
                            writer.append("<li>" + value + "</li>");
                        }
                    }
                }
                writer.append("</ul>\n");
            }
        }
    }
    
    public void write(Writer-Writer、SolrQueryRequest-SolrQueryRequest、SolrQueryResponse-SolrQueryResponse)引发IOException{
    LOGGER.info(“我们到了……”);
    solrindexearcher searcher=solrQueryRequest.getSearcher();
    NamedList NamedList=solrQueryResponse.getValues();
    LOGGER.info(“命名列表”+namedList.size());
    int size=namedList.size();
    对于(int i=0;i\n”);
    while(docIterator.hasNext()){
    int id=docIterator.nextDoc();
    LOGGER.info(“id”+id);
    文档文档=searcher.doc(id,字段);
    用于(字符串字段:字段){
    字符串值=单据获取(字段);
    LOGGER.info(值);
    如果(!StringUtils.isEmpty(值)){
    writer.append(“
  • ”+value+“
  • ”); } } } writer.append(“\n”); } } }
    在solr core 7.3
    NameList::getVal(index)
    中,将返回
    BasicResultContext
    ,其中将包含
    DocList
    实例。下面是我更改的代码,供将来参考

    public void write(Writer writer, SolrQueryRequest solrQueryRequest, SolrQueryResponse solrQueryResponse) throws IOException {
        LOGGER.info("Here we are....");
        SolrIndexSearcher searcher = solrQueryRequest.getSearcher();
        NamedList namedList = solrQueryResponse.getValues();
        LOGGER.info("Named List " + namedList.size());
        int size = namedList.size();
        for (int i = 0; i < size; i++) {
            Object val = namedList.getVal(i);
            LOGGER.info(val.toString());
            if (val instanceof BasicResultContext) {
                BasicResultContext basicResultContext = (BasicResultContext) val;
                DocList docList = basicResultContext.getDocList();
                LOGGER.info("docList List " + docList.size());
                DocIterator docIterator = docList.iterator();
                writer.append("<ul>\n");
                while (docIterator.hasNext()) {
                    int id = docIterator.nextDoc();
                    LOGGER.info("id id " + id);
                    Document doc = searcher.doc(id, fields);
                    for (String field : fields) {
                        String value = doc.get(field);
                        LOGGER.info(value);
                        if (!StringUtils.isEmpty(value)) {
                            writer.append("<li>" + value + "</li>");
                        }
                    }
                }
                writer.append("</ul>\n");
            }
        }
    }
    
    public void write(Writer-Writer、SolrQueryRequest-SolrQueryRequest、SolrQueryResponse-SolrQueryResponse)引发IOException{
    LOGGER.info(“我们到了……”);
    solrindexearcher searcher=solrQueryRequest.getSearcher();
    NamedList NamedList=solrQueryResponse.getValues();
    LOGGER.info(“命名列表”+namedList.size());
    int size=namedList.size();
    对于(int i=0;i\n”);
    while(docIterator.hasNext()){
    int id=docIterator.nextDoc();
    LOGGER.info(“id”+id);
    文档文档=searcher.doc(id,字段);
    用于(字符串字段:字段){
    字符串值=单据获取(字段);
    LOGGER.info(值);
    如果(!StringUtils.isEmpty(值)){
    writer.append(“
  • ”+value+“
  • ”); } } } writer.append(“\n”); } } }
    那么您是如何启用配置的呢?如果您使用的是集合,听起来像是在云模式下运行Solr-在这种情况下,您必须在嵌入式zookeeper实例中上载和更新配置。@MatsLindh我使用的是Solr core,我有配置