SOLR中的索引:纠正分析仪不会产生巨大的条件

时间:2016-06-21 18:47:10

标签: indexing solr nutch analyzer fieldtype

我正在尝试通过运行:

来索引我的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。

1 个答案:

答案 0 :(得分:1)

假设您使用与Nutch捆绑在一起的schema.xml作为Solr安装的基本架构,基本上您只需要添加其中一个过滤器(LengthFilterFactory或{{1} })到TruncateTokenFilterFactory字段类型。

text_general text_generalhttps://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"/> minmaxLengthFilterFactoryprefixLength }}

回答您的其他问题:是的,这会影响TruncateTokenFilterFactory类型的所有字段,但这不是问题,因为如果您在任何其他字段中找到另一个超长期字符,则会抛出相同的错误。如果您仍想仅针对text_general字段隔离此更改,则只需创建一个新名称content fieldType,例如,只需复制并粘贴整个{{1}然后更改truncated_text_general字段(https://github.com/apache/nutch/blob/master/conf/schema.xml#L339)的类型以匹配新创建的fieldType

话虽如此,只需为过滤器选择合理的值,以避免错过索引中的大量术语。