我正在尝试通过运行:
来索引我的nutch抓取数据bin/nutch index -D solr.server.url="http://localhost:8983/solr/carerate" crawl/crawldb -linkdb crawl/linkdb crawl/segments/2016*
起初它的工作完全没问题。我索引了我的数据,发送了一些查询并收到了良好的结果。但后来我再次运行爬行,以便它获取更多页面,现在当我运行nutch index命令时,我面对
java.io.IOException:作业失败!
这是我的hadoop日志:
java.lang.Exception:org.apache.solr.client.solrj.impl.HttpSolrServer $ RemoteSolrException:将文档标识http://www.cs.toronto.edu/~frank/About_Me/about_me.html写入索引的异常;可能的分析错误:文档在字段中包含至少一个巨大的术语=“内容”(其UTF8编码长于最大长度32766),所有这些都被跳过。请更正分析仪以不生成此类条款。第一个巨大术语的前缀是:'[70,114,97,110,107,32,82,117,100,122,105,99,122,32,45,32,65,98,111,117 ,116,32,77,101,32,97,98,111,117,116] ......',原始消息:字节长度最多为32766;得到40063.也许该文档有一个索引字符串字段(solr.StrField)太大了 在org.apache.hadoop.mapred.LocalJobRunner $ Job.runTasks(LocalJobRunner.java:462) 在org.apache.hadoop.mapred.LocalJobRunner $ Job.run(LocalJobRunner.java:529) 引起:org.apache.solr.client.solrj.impl.HttpSolrServer $ RemoteSolrException:将文档id http://www.cs.toronto.edu/~frank/About_Me/about_me.html写入索引的异常;可能的分析错误:文档在字段中包含至少一个巨大的术语=“内容”(其UTF8编码长于最大长度32766),所有这些都被跳过。请更正分析仪以不生成此类条款。第一个巨大术语的前缀是:'[70,114,97,110,107,32,82,117,100,122,105,99,122,32,45,32,65,98,111,117 ,116,32,77,101,32,97,98,111,117,116] ......',原始消息:字节长度最多为32766;得到40063.也许该文档有一个索引字符串字段(solr.StrField)太大了 at org.apache.solr.client.solrj.impl.HttpSolrServer.executeMethod(HttpSolrServer.java:552) 在org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:210) 在org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:206) at org.apache.solr.client.solrj.request.AbstractUpdateRequest.process(AbstractUpdateRequest.java:124) at org.apache.nutch.indexwriter.solr.SolrIndexWriter.close(SolrIndexWriter.java:153) 在org.apache.nutch.indexer.IndexWriters.close(IndexWriters.java:115) at org.apache.nutch.indexer.IndexerOutputFormat $ 1.close(IndexerOutputFormat.java:44) 在org.apache.hadoop.mapred.ReduceTask $ OldTrackingRecordWriter.close(ReduceTask.java:502) 在org.apache.hadoop.mapred.ReduceTask.runOldReducer(ReduceTask.java:456) 在org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:392) 在org.apache.hadoop.mapred.LocalJobRunner $ Job $ ReduceTaskRunnable.run(LocalJobRunner.java:319) at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617) 在java.lang.Thread.run(Thread.java:745) 2016-06-21 13:27:37,994 ERROR indexer.IndexingJob - Indexer:java.io.IOException:作业失败! 在org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:836) 在org.apache.nutch.indexer.IndexingJob.index(IndexingJob.java:145) 在org.apache.nutch.indexer.IndexingJob.run(IndexingJob.java:222) 在org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) 在org.apache.nutch.indexer.IndexingJob.main(IndexingJob.java:231)
我意识到在提到的页面中必须有一个非常长的时期。 所以在schema.xml(在nutch中)和managed-schema(在solr中)我将“id”,“content”和“text”的类型从“strings”更改为“text_general”: 但它没有解决问题。
我不是专家,所以我不确定如何在不搞砸其他东西的情况下纠正分析仪。我读过我可以: 1.使用(在索引分析器中)一个LengthFilterFactory来过滤掉那些不符合请求长度范围的令牌。 2.use(在索引分析器中),一个TruncateTokenFilterFactory,用于修复索引标记的最大长度
但架构中有很多分析器。我应该更改为其定义的分析仪吗?如果是,因为内容和其他字段的类型是text_general,它是否也会影响所有这些?
任何人都知道如何解决这个问题?我真的很感激任何帮助。
BTW,我使用的是nutch 1.11和solr 6.0.0。
答案 0 :(得分:1)
假设您使用与Nutch捆绑在一起的schema.xml
作为Solr安装的基本架构,基本上您只需要添加其中一个过滤器(LengthFilterFactory
或{{1} })到TruncateTokenFilterFactory
字段类型。
从text_general
text_general
(https://github.com/apache/nutch/blob/master/conf/schema.xml#L108-L123)的初始定义开始,您需要将以下内容添加到fieldType
部分:
<analyzer type="index">
这也可以使用相同的语法应用于...
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<!-- remove long tokens -->
<filter class="solr.LengthFilterFactory" min="3" max="7"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
...
分析器。如果您想使用query
过滤器,只需将添加的行换成:
TruncateTokenFilterFactory
此外,请不要忘记根据您的需要调整每个过滤器的参数( <filter class="solr.TruncateTokenFilterFactory" prefixLength="5"/>
为min
为max
)LengthFilterFactory
为prefixLength
}}
回答您的其他问题:是的,这会影响TruncateTokenFilterFactory
类型的所有字段,但这不是问题,因为如果您在任何其他字段中找到另一个超长期字符,则会抛出相同的错误。如果您仍想仅针对text_general
字段隔离此更改,则只需创建一个新名称content
fieldType
,例如,只需复制并粘贴整个{{1}然后更改truncated_text_general
字段(https://github.com/apache/nutch/blob/master/conf/schema.xml#L339)的类型以匹配新创建的fieldType
。
话虽如此,只需为过滤器选择合理的值,以避免错过索引中的大量术语。