在Nutch与Solr中实现URL去重:统一URL大小写的问题
解决Solr索引中URL大小写导致的重复问题
因为你将URL作为id字段,但无法修改传入URL的大小写,可通过以下Solr内置机制统一处理,避免大小写不同的URL重复索引:
方案1:修改id字段的类型为带小写过滤的文本类型
在managed-schema(或旧版schema.xml)中定义一个支持自动小写转换的字段类型,将id字段关联到该类型:
<!-- 定义带小写过滤的字段类型 --> <fieldType name="string_lower" class="solr.TextField"> <analyzer> <!-- 保持整个URL为单个token --> <tokenizer class="solr.KeywordTokenizerFactory"/> <!-- 强制转为小写 --> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType> <!-- 将id字段的类型改为上述自定义类型 --> <field name="id" type="string_lower" indexed="true" stored="true" required="true"/>
这样无论传入的URL是https://www.example.com/xxx还是https://www.example.com/XXX,索引时都会被统一转为小写存储,确保id唯一。
方案2:使用更新请求处理器(URP)自动转换id为小写
在solrconfig.xml中配置更新请求处理器链,在文档进入索引前自动修改id字段的大小写:
<!-- 定义处理链 --> <updateRequestProcessorChain name="lowercase-id"> <processor class="solr.FieldMutatingUpdateProcessorFactory"> <str name="fieldName">id</str> <str name="mutator">lowercase</str> </processor> <!-- 保留默认的日志和更新处理器 --> <processor class="solr.LogUpdateProcessorFactory"/> <processor class="solr.RunUpdateProcessorFactory"/> </updateRequestProcessorChain> <!-- 绑定到更新请求处理器 --> <requestHandler name="/update" class="solr.UpdateRequestHandler"> <lst name="defaults"> <str name="update.chain">lowercase-id</str> </lst> </requestHandler>
后续所有通过/update接口提交的文档,id字段都会被自动转为小写后再索引。
方案3:数据导入时(DIH)转换URL大小写
如果使用DataImportHandler导入数据,可在data-config.xml中通过脚本转换器处理:
<!-- 定义脚本 --> <script><![CDATA[ function toLowerCase(row) { var url = row.get('id'); if (url) { row.put('id', url.toLowerCase()); } return row; } ]]></script> <!-- 在实体中应用转换器 --> <entity name="your_entity" query="SELECT url AS id FROM your_table"> <field column="id" name="id" transformer="script:toLowerCase"/> </entity>
导入过程中会自动将URL转为小写作为id字段值。
内容的提问来源于stack exchange,提问作者wrc3
相关产品推荐
相关产品推荐

