You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:30:59