Solr中如何丢弃生成的首个NGram令牌?
解决方案:使用Solr内置脚本过滤器(ScriptFilter)
不需要编写自定义Java过滤器,你可以借助Solr自带的ScriptFilterFactory实现跳过第一个令牌的需求,具体步骤如下:
- 配置字段类型:在字段的索引分析器中,在NGram过滤器之后添加脚本过滤器,示例配置如下:
<fieldType name="ngram_custom" class="solr.TextField"> <analyzer type="index"> <tokenizer class="solr.KeywordTokenizerFactory"/> <!-- 保持输入字符串完整,适配你的整串输入场景 --> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="100"/> <!-- 按实际需求设置最大NGram长度 --> <filter class="solr.ScriptFilterFactory" language="groovy" script="skipFirstToken.groovy"/> </analyzer> <analyzer type="query"> <!-- 查询阶段分析器可根据需求调整,示例与索引阶段保持一致 --> <tokenizer class="solr.KeywordTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="100"/> </analyzer> </fieldType>
- 编写过滤脚本:在Solr的
conf/scripts目录下(无则创建)新建skipFirstToken.groovy文件,内容如下:
def skipFirst = true; while (input.incrementToken()) { if (skipFirst) { skipFirst = false; continue; // 跳过第一个令牌 } // 保留后续所有令牌 output.copyAttributes(input); output.emit(); }
- 开启脚本支持:检查
solrconfig.xml中是否开启脚本功能,若未开启则添加配置:
<str name="script.enabled">true</str>
方案优势
- 全程使用Solr内置功能,无需编写编译自定义Java过滤器,降低维护成本。
- 精准跳过索引0的令牌,不会影响包含开头三字母的长令牌(如
abcd、abcde等),满足你保留语境中开头字符的需求。 - 无需调整NGram最小尺寸,也不依赖正则匹配,避开了你提到的限制条件。
内容的提问来源于stack exchange,提问作者Christopher Schneider
相关产品推荐
相关产品推荐

