java - 自定义 QueryResponseWriter 在 solr 7.3.0 中不起作用

标签 java solr

我以驯服文本书为例,在 solr 中添加自定义QueryResponseWriter。但它在 wt 中没有显示为 tah

当我点击以下查询时,显示空响应

http://localhost:8983/solr/collectiona/type-ahead?q=fayes&wt=tah

在我的 solr 配置中,我放置了以下库的目录路径

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

这是我的 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>

自定义库在 solr 启动期间加载,这是我的 Solr 日志

Added 63 libs to classloader, from paths: [/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/langid/lib, /home/bibek/software/java/solr-7.3.0/contrib/velocity/lib, /home/bibek/software/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");
        }
    }
}

关于java - 自定义 QueryResponseWriter 在 solr 7.3.0 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50312621/

相关文章:

java - 父类返回子类

SOLR - 结果分组的结果计数

java - 无法在solrj中创建CoreContainer,在java中创建embeddedsolrserver

Java Swing JButton

java - SpringJUnit4ClassRunner - 静态访问EntityManager(Factory)

Java 输入流。有没有正确有效的方法?

java - 如何在 @Query Solr 搜索中传递/设置 "start"和 "rows"参数

java - 为 TermVectors 安装 Solr 补丁

java - 如何获取字段的值?

java - 如何创建自定义 GWT CellTable 类?