Solr 8.0+词级nGram实现:自定义词串分词方案咨询
Solr 8.0+ 满足指定词级分词需求的过滤器方案
一、生成左向词级前缀组合(如ABC、ABC regional、ABC regional private…)
要生成从第一个词开始的连续前缀词组合,可通过ShingleFilterFactory配合过滤规则解决默认Shingle生成多余中间分片的问题:
基础配置思路
先通过标准分词器拆分单个词,再用Shingle生成所有连续词组合,最后过滤掉非前缀开头的分片:<fieldType name="text_prefix_shingle" class="solr.TextField"> <analyzer> <!-- 拆分原文本为单个词 --> <tokenizer class="solr.StandardTokenizerFactory"/> <!-- 生成1到5词的所有连续分片(5对应原文本最大词数) --> <filter class="solr.ShingleFilterFactory" minShingleSize="1" maxShingleSize="5" outputUnigrams="true"/> <!-- 过滤掉不以首词开头的分片(示例首词为ABC,通用场景可替换为脚本过滤) --> <filter class="solr.PatternReplaceFilterFactory" pattern="^(?!ABC).*$" replacement="" replace="all"/> </analyzer> </fieldType>若需适配任意首词的通用场景,将第三步替换为ScriptFilterFactory,通过token起始位置过滤:
<filter class="solr.ScriptFilterFactory" script="keepPrefixShingles.js"/>keepPrefixShingles.js脚本内容:function filter(token) { // 仅保留从第一个词开始的前缀分片 return token.startOffset === 0; }简洁替代逻辑
无需额外过滤的话,也可通过多次叠加Shingle配合LimitTokenPositionFilterFactory限制仅处理前N个词,但上述Shingle+过滤的方案更直接。
二、生成带占位符的跳词分片(如regional _ coastal)
要生成跳过中间词的带占位符分片,可通过ShingleFilterFactory结合token移除+占位符配置实现:
配置示例
先移除需要跳过的中间词,再用Shingle生成分片并填充占位符:<fieldType name="text_shingle_with_placeholder" class="solr.TextField"> <analyzer> <tokenizer class="solr.StandardTokenizerFactory"/> <!-- 移除需跳过的词(示例为private) --> <filter class="solr.RemoveTokenFilterFactory" words="skip_words.txt"/> <!-- 生成3词分片,用_填充缺失token --> <filter class="solr.ShingleFilterFactory" minShingleSize="3" maxShingleSize="3" fillers="_" outputUnigrams="false"/> </analyzer> </fieldType>skip_words.txt中写入需跳过的词:private通用跳词场景
若需灵活指定跳过位置,可改用ScriptFilterFactory手动生成跳词分片,或结合WordDelimiterFilterFactory调整token后再生成Shingle。
关键参数说明
- ShingleFilterFactory核心参数:
minShingleSize/maxShingleSize:控制生成分片的词数范围fillers:设置缺失token时的占位符outputUnigrams:是否保留单个词的分片
内容的提问来源于stack exchange,提问作者AMAN
相关产品推荐
相关产品推荐

