首页 > 解决方案 > 为 Open Documents 索引 last_modified 字段的问题

问题描述

我安装了 Solr 8.1,当我尝试索引 Open Documents (ods, odt, ...) 时,会抛出 last_modified 的无效日期错误。对于其他文档格式(pdf、doc、...),索引工作正常。

字段的 schema.xml 定义:

<field name="last_modified" type="date" indexed="true" stored="true"/> ... <fieldType name="date" class="solr.DatePointField" docValues="true"/>

例外:

org.apache.solr.common.SolrException: 错误: [doc=D42039220124097949-A100020965] 添加字段 'last_modified'='2019-06-14T16:59:47.610000000' 时出错 msg=无效日期字符串:'2019-06-14T16: 59:47.610000000' 在 org.apache.solr.update.AddUpdateCommand.getLuceneDocument(AddUpdateCommand.java:109) 在 org.apache.solr.toDocument(DocumentBuilder.java:215) 在 org.apache.solr.update .DirectUpdateHandler2.updateDocOrDocValues(DirectUpdateHandler2.java:968) 在 org.apache.solr.update.DirectUpdateHandler2.doNormalUpdate(DirectUpdateHandler2.java:342) 在 org.apache.solr.update.DirectUpdateHandler2.addDoc0(DirectUpdateHandler2.java:289) 在org.apache.solr.update.DirectUpdateHandler2.addDoc(DirectUpdateHandler2.java:236) 在 org.apache.solr.update.processor.RunUpdateProcessor。processAdd(RunUpdateProcessorFactory.java:76) at org.apache.solr.update.processor.UpdateRequestProcessor.processAdd(UpdateRequestProcessor.java:55) at org.apache.solr.update.processor.DistributedUpdateProcessor.doLocalAdd(DistributedUpdateProcessor.java:257)在 org.apache.solr.update.processor.DistributedUpdateProcessor.doVersionAdd(DistributedUpdateProcessor.java:483) 在 org.apache.solr.update.processor.DistributedUpdateProcessor.lambda$versionAdd$0(DistributedUpdateProcessor.java:337) 在 org.apache。 solr.update.VersionBucket.runWithLock(VersionBucket.java:50) 在 org.apache.solr.update.processor.DistributedUpdateProcessor.versionAdd(DistributedUpdateProcessor.java:337) 在 org.apache.solr.update.processor.DistributedUpdateProcessor.processAdd( DistributedUpdateProcessor.java:223) 在 org.apache.solr。update.processor.LogUpdateProcessorFactory$LogUpdateProcessor.processAdd(LogUpdateProcessorFactory.java:103) 在 org.apache.solr.handler.extraction.ExtractingDocumentLoader.doAdd(ExtractingDocumentLoader.java:126) 在 org.apache.solr.handler.extraction.ExtractingDocumentLoader。 addDoc(ExtractingDocumentLoader.java:131) at org.apache.solr.handler.extraction.ExtractingDocumentLoader.load(ExtractingDocumentLoader.java:237) at org.apache.solr.handler.ContentStreamHandlerBase.handleRequestBody(ContentStreamHandlerBase.java:68) at org .apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:199) 在 org.apache.solr.core.SolrCore.execute(SolrCore.java:2566) 在 org.apache.solr.servlet.HttpSolrCall.execute(HttpSolrCall .java:756) 在 org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:542) 在 org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:343) 在 org.eclipse.jetty.servlet.ServletHandler $CachedChain.doFilter(ServletHandler.java:1602) 在 org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:540) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146) ) 在 org.eclipse.jetty.handle(SecurityHandler.java:548) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) 在 org.eclipse.jetty.server。 handler.ScopedHandler.nextHandle(ScopedHandler.java:257) 在 org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1588) 在 org.eclipse.jetty.server.handler。ScopedHandler.nextHandle(ScopedHandler.java:255) 在 org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345) 在 org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java: 203) org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480) org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1557) org.eclipse.jetty.server .handler.ScopedHandler.nextScope(ScopedHandler.java:201) 在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler .java:144) 在 org.eclipse.jetty.server.handler.HandlerCollection 的 org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:220)。org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) 的句柄(HandlerCollection.java:126) org.eclipse.jetty.rewrite.handler.RewriteHandler.handle(RewriteHandler.java:335)在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132) 在 org.eclipse.jetty.server.Server.handle(Server.java:502) 在 org.eclipse.jetty.server.HttpChannel .handle(HttpChannel.java:364) 在 org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260) 在 org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305) 在org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) 在 org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118) 在 org.eclipse.jetty.util.thread.strategy .EatWhatYouKill。org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310) 在 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill. java:168) 在 org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366) 在 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)在 org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683) 在 java.lang.Thread 的 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)。运行(Thread.java:748)原因:org.apache.solr.common.SolrException:无效的日期字符串:'2019-06-14T16:59:47.610000000' at org.apache.solr.util.DateMathParser.parseMath(DateMathParser .java:247) 在 org.apache.solr.schema.DatePointField.createField(DatePointField.java:214) 在 org.apache.solr.schema.PointField 的 org.apache.solr.util.DateMathParser.parseMath(DateMathParser.java:226) .createFields(PointField.java:250) 在 org.apache.solr.update.DocumentBuilder.addField(DocumentBuilder.java:65) 在 org.apache.solr.update.DocumentBuilder.toDocument(DocumentBuilder.java:171) ...还有 58 个

标签: solr

解决方案


我遇到了同样的问题,结果证明我应该通过调用 toString() 来传递 Date 的 String 表示,而不是传递 Date 对象。就我而言,它是 LocalDateTime -

Object value = ((LocalDateTime) value).toString();
solrDoc.addField("last_login_on", value);

推荐阅读