java - 索引 : how to write document id to log? 期间的 SOLR RuntimeException

标签 java solr jetty

我们正在为数百万文档编制索引。我们使用 Solr 3.1 和 Jetty。我按照此处所述在 Jetty 中启用了日志记录:http://wiki.apache.org/solr/LoggingInDefaultJettySetup

对于某些全文,我们得到异常,因此记录如下:

<record>
  <date>2012-09-04T15:55:16</date>
  <millis>1346766916578</millis>
  <sequence>0</sequence>
  <logger>org.apache.solr.core.SolrCore</logger>
  <level>SEVERE</level>
  <class>org.apache.solr.common.SolrException</class>
  <method>log</method>
  <thread>10</thread>
  <message>java.lang.RuntimeException: [was class java.io.CharConversionException] Invalid UTF-8 character 0xd835(a surrogate character)  at c
har #1144, byte #127)
        at com.ctc.wstx.util.ExceptionUtil.throwRuntimeException(ExceptionUtil.java:18)
        at com.ctc.wstx.sr.StreamScanner.throwLazyError(StreamScanner.java:731)
        at com.ctc.wstx.sr.BasicStreamReader.safeFinishToken(BasicStreamReader.java:3657)
        at com.ctc.wstx.sr.BasicStreamReader.getText(BasicStreamReader.java:809)
        at org.apache.solr.handler.XMLLoader.readDoc(XMLLoader.java:287)
        at org.apache.solr.handler.XMLLoader.processUpdate(XMLLoader.java:146)
        at org.apache.solr.handler.XMLLoader.load(XMLLoader.java:77)
        at org.apache.solr.handler.ContentStreamHandlerBase.handleRequestBody(ContentStreamHandlerBase.java:55)
        at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:129)
        at org.apache.solr.core.SolrCore.execute(SolrCore.java:1360)
        at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:356)
        at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:252)
        at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
        at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399)
        at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
        at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
        at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
        at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
        at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
        at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
        at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
        at org.mortbay.jetty.Server.handle(Server.java:326)

</message>
</record>

最好也记录发送的文档 ID。我们如何做到这一点?

谢谢!

最佳答案

您是在问如何让 Jetty 记录 ID?您不太可能能够通过 Jetty 记录它,因为无法解析请求中的 XML 以获取 ID 值。请注意,堆栈跟踪通知 XMLLoader.readDoc() 方法永远不会超过第 287 行。这是该类的代码(适用于您的版本): http://svn.apache.org/viewvc/lucene/dev/tags/lucene_solr_3_1/solr/src/java/org/apache/solr/handler/XMLLoader.java?revision=1086927&view=markup

相关部分:

 SolrInputDocument readDoc(XMLStreamReader parser) throws XMLStreamException {
264     SolrInputDocument doc = new SolrInputDocument();
265     
266     String attrName = "";
267     for (int i = 0; i < parser.getAttributeCount(); i++) {
268     attrName = parser.getAttributeLocalName(i);
269     if ("boost".equals(attrName)) {
270     doc.setDocumentBoost(Float.parseFloat(parser.getAttributeValue(i)));
271     } else {
272     XmlUpdateRequestHandler.log.warn("Unknown attribute doc/@" + attrName);
273     }
274     }
275     
276     StringBuilder text = new StringBuilder();
277     String name = null;
278     float boost = 1.0f;
279     boolean isNull = false;
280     while (true) {
281     int event = parser.next();
282     switch (event) {
283     // Add everything to the text
284     case XMLStreamConstants.SPACE:
285     case XMLStreamConstants.CDATA:
286     case XMLStreamConstants.CHARACTERS:
287     text.append(parser.getText());

Solr 文档尚未构建,因此没有真正的方法获取记录 ID 字段。

解决方法是让您的索引器脚本检查 Solr 响应的状态代码,如果状态不为 0(成功),则将记录 ID 写入日志。同样,如果您使用的是 Java 或 PHP 或一种可以捕获异常的语言,您也可以捕获这些异常并写入日志。

希望这对您有所帮助,祝您好运。

关于java - 索引 : how to write document id to log? 期间的 SOLR RuntimeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12265277/

相关文章:

java - 比 Solr 更喜欢 Apache Lucene 的情况?

mysql - Solr - DIH 定义和导入多对多字段

java - 由于找不到 ALPN 处理器,与 WireMock 的集成测试失败

java - 本地 AtomicReference 和带有 lambda 的数组

java - 尽管使用 indexInBounds 仍获取 ArrayIndexOutOfBounds

java - xml 模式验证错误 “The content of element ' flowPara' 不完整”

apache - 如何让 Solr Suggester 也返回拼写建议

java - SolrJetty 日志记录 - 如何让自定义日志格式化程序正常工作?

java - 将 JSON 数据从 Javascript 发送到 Java

java - 如何作为后台线程启动 Spring Batch 作业