【问题标题】:custom QueryResponseWriter is not working in solr 7.3.0自定义 QueryResponseWriter 在 solr 7.3.0 中不起作用
【发布时间】:2018-10-23 01:39:35
【问题描述】:

我以驯服文本书为例,在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");
        }
}

这是我对 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 日志

向类加载器添加了 63 个库,来自路径:[/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/软件/java/solr-7.3.0/contrib/velocity/lib, /home/bibek/software/java/solr-7.3.0/dist]

【问题讨论】:

  • 那么你是如何启用配置的呢?如果您使用集合,听起来就像您在云模式下运行 Solr - 在这种情况下,您必须上传和更新嵌入式 Zookeeper 实例中的配置。
  • @MatsLindh 我正在使用 solr 核心,我已将 solr 配置为经典 schema.xml 类型
  • 你在服务器日志中看到 jar 被加载了吗?
  • 如果您尝试使用响应编写器会发生什么?例外?没有? XML 输出?您的查询是什么?
  • 啊,抱歉,错过了查询 - 但是您是否尝试在日志中添加一些调试信息?如果没有条目或您的 val 不是 DocList (您期望的 - 也许不是?)您不会向作者添加任何内容。将您的正常调试器附加到进程,使用可用的日志记录或至少添加打印语句(这些通常包含在日志文件中,具体取决于您的日志级别)。由于它没有抱怨也没有返回任何内容,它可能正在运行但没有触发任何写入。

标签: java solr


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-01
    • 2023-03-19
    • 2020-10-22
    • 2021-03-11
    • 2020-12-04
    • 2013-07-21
    • 2019-07-22
    • 2011-10-27
    相关资源
    最近更新 更多