Solr的Analyzer分析器、Tokenizer分词器、Filter过滤器的区别/联系

  1. Analyzer负责把文本字段转成token stream,然后自己处理、或调用Tokenzier和Filter进一步处理,Tokenizer和Filter是同等级和顺序执行的关系,一个处理完后交给下一个处理。
  2. Tokenizer接收text(从solr那里获得一个Reader来读取文本),拆分成tokens,输出token stream
  3. Filter接收token stream,对每个token进行处理(比如:替换、丢弃、不理),输出token stream。在配置文件中,Tokenizer放在第一位,Filter放在第二位直到最后一位。Filters是顺序执行的,前一个的结果是后一个是输入,所以,一般通用的处理放在前面,特殊的处理靠后

常见的Solr Filter过滤器

ASCII Folding Filter

这个Filter将不属于ASCII(127个字符,包括英文字母,数字,常见符号)的字符转化成与ASCII 字符等价的字符。 
没有参数。

例子:

<analyzer><filter class="solr.ASCIIFoldingFilterFactory"/>
</analyzer>
  • 1
  • 2
  • 3

输入: “á” 
输出:“a”

Classic Filter

这个Filter接受Classic Tokenizer的结果,并处理首字母缩略词和所有格形式(英文中含有 ‘s 的形式)

例子:

<analyzer><tokenizer class="solr.ClassicTokenizerFactory"/><filter class="solr.ClassicFilterFactory"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本:“I.B.M. cat’s can’t” 
输入: “I.B.M”, “cat’s”, “can’t” 
输出:“IBM”, “cat”, “can’t”

Common Grams Filter

这个Filter结合通用tokens来处理常用词。

参数 说明
words 以.txt结尾的文件 提供常用词库
format 可选,例如”snowball” 指定常用词列表的格式
ignoreCase 布尔值,默认false 是否忽略常用词大小写

例子:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.CommonGramsFilterFactory" words="stopwords.txt" ignoreCase="true"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本: “the Cat” 
输入: “the”, “Cat” 
输出: “the_cat”

Edge N-Gram Filter

将输入文本转化成指定范围大小的片段。

参数 说明
minGramSize 整数,默认1 指定最小的片段大小
maxGramSize 整数,默认1 指定最大的片段大小

例如:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.EdgeNGramFilterFactory"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本: “four score and twenty” 
输入: “four”, “score”, “and”, “twenty” 
输出: “f”, “s”, “a”, “t”

例子:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="4"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本: “four score” 
输入: “four”, “score” 
输出: “f”, “fo”, “fou”, “four”, “s”, “sc”, “sco”, “scor”

例子:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="6"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本: “four score and twenty” 
输入: “four”, “score”, “and”, “twenty” 
输出: “four”, “scor”, “score”, “twen”, “twent”, “twenty”

English Minimal Stem Filter

这个Filter将英语中的复数处理成单数形式。 
没有参数。

例子:

<analyzer type="index"><tokenizer class="solr.StandardTokenizerFactory "/><filter class="solr.EnglishMinimalStemFilterFactory"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本: “dogs cats” 
输入: “dogs”, “cats” 
输出: “dog”, “cat”

Keep Word Filter

这个Filter将不属于列表中的单词过滤掉。和Stop Words Filter的效果相反。

参数 说明
words 必填,以.txt结尾的文件 提供保留词列表
ignoreCase 布尔值,默认false 是否忽略保留词列表大小写
enablePositionIncrements 布尔值 Solr5.0以后废弃

例子:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.KeepWordFilterFactory" words="keepwords.txt"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

保留词列表keepwords.txt 
happy 
funny 
silly 
原始文本: “Happy, sad or funny” 
输入: “Happy”, “sad”, “or”, “funny” 
输出: “funny”

例子:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.KeepWordFilterFactory" words="keepwords.txt" ignoreCase="true"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

保留词列表keepwords.txt 
happy 
funny 
silly 
原始文本: “Happy, sad or funny” 
输入: “Happy”, “sad”, “or”, “funny” 
输出: “Happy”, “funny”

例子:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.LowerCaseFilterFactory"/><filter class="solr.KeepWordFilterFactory" words="keepwords.txt"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4
  • 5

保留词列表keepwords.txt 
happy 
funny 
silly 
原始文本: “Happy, sad or funny” 
输入: “happy”, “sad”, “or”, “funny” 
输出: “Happy”, “funny”

Length Filter

这个Filter处理在给定范围长度的tokens。

参数 说明
min 整数,必填 指定最小的token长度
max 整数,必填,需大于min 指定最大的token长度
enablePositionIncrements 布尔值 从Solr5.0以后废弃

例子:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.LengthFilterFactory" min="3" max="7"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本: “turn right at Albuquerque” 
输入: “turn”, “right”, “at”, “Albuquerque” 
输出: “turn”, “right”

Lower Case Filter

这个Filter将所有的大写字母转化为小写。 
没有参数。

例子:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本: “Down With CamelCase” 
输入: “Down”, “With”, “CamelCase” 
输出: “down”, “with”, “camelcase”

N-Gram Filter

将输入文本转化成指定范围大小的片段。

参数 说明
minGramSize 整数,默认1 指定最小的片段大小
maxGramSize 整数,默认2 指定最大的片段大小

例子:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.NGramFilterFactory"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本: “four score” 
输入: “four”, “score” 
输出: “f”, “o”, “u”, “r”, “fo”, “ou”, “ur”, “s”, “c”, “o”, “r”, “e”, “sc”, “co”, “or”, “re”

例子2:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="4"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本: “four score” 
输入: “four”, “score” 
输出: “f”, “fo”, “fou”, “four”, “s”, “sc”, “sco”, “scor”

例子3:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="5"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本: “four score” 
输入: “four”, “score” 
输出: “fou”, “four”, “our”, “sco”, “scor”, “score”, “cor”, “core”, “ore”

Pattern Replace Filter

这个Filter可以使用正则表达式来替换token的一部分内容,与正则表达式想匹配的被替换,不匹配的不变。

参数 说明
pattern 必填,正则表达式 需要匹配的正则表达式
replacement 必填,字符串 需要替换的部分
replace “all” 或 “first”, 默认”all” 全部替换还是,只替换第一个

例子:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.PatternReplaceFilterFactory" pattern="cat" replacement="dog"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本: “cat concatenate catycat” 
输入: “cat”, “concatenate”, “catycat” 
输出: “dog”, “condogenate”, “dogydog”

例子2:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.PatternReplaceFilterFactory" pattern="cat" replacement="dog" replace="first"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本: “cat concatenate catycat” 
输入: “cat”, “concatenate”, “catycat” 
输出: “dog”, “condogenate”, “dogycat”

例子3:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.PatternReplaceFilterFactory" pattern="(\D+)(\d+)$" replacement="$1_$2"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本: “cat foo1234 9987 blah1234foo” 
输入: “cat”, “foo1234”, “9987”, “blah1234foo” 
输出: “cat”, “foo_1234”, “9987”, “blah1234foo”

Standard Filter

这个Filter将首字母缩略词中的点号(如I.B.M处理为IBM)去除,将英文中的所有格形式中的's除去(如stationer’s处理为stationer)。 
没有参数。 
在Solr3.1以后已经废弃。

Stop Filter

这个Filter会在解析时忽略给定的停词列表(stopwords.txt)中的内容。

参数 说明
words 可选,停词列表 指定停词列表的路径
format 可选,如”snowball” 停词列表的格式
ignoreCase 布尔值,默认false 是否忽略大小写
enablePositionIncrements 布尔值 Solr5.0以后废弃

例子:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.StopFilterFactory" words="stopwords.txt"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

保留词列表stopwords.txt 
be 
or 
to 
原始文本: “To be or what?” 
输入: “To”(1), “be”(2), “or”(3), “what”(4) 
输出: “To”(1), “what”(4)

例子2:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

保留词列表stopwords.txt 
be 
or 
to 
原始文本: “To be or what?” 
输入: “To”(1), “be”(2), “or”(3), “what”(4) 
输出: “what”(4)

Synonym Filter

这个Filter用来处理同义词。

参数 说明
synonyms 必选,以.txt结尾的文件 指定同义词列表
ignoreCase 布尔值,默认false 是否忽略大小写
expand 布尔值,默认true TRUE:同义词将扩大至所有等价的同义词;FALSE:所有等价的同义词将相当于列表中的第一个。
format 可选,默认solr 指定解析同义词的策略
tokenizerFactory 可选,默认WhitespaceTokenizerFactory 指定解析同义词列表使用的tokenizer factory
analyzer 可选,默认WhitespaceTokenizerFactory 指定使用的analyzer class

注意,常用的同义词列表格式: 
1. 以#开头的行为注释内容,忽略 
2. 以,分隔的文本,为双向同义词,左右内容等价,互为同义词 
3. 以=>分隔的文本,为单向同义词,匹配到左边内容,将替换为右边内容,反之不成立

例子:

<analyzer><tokenizer class="solr.StandardTokenizerFactory"/><filter class="solr.SynonymFilterFactory" synonyms="mysynonyms.txt"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

同义词列表synonyms.txt 
couch,sofa,divan 
teh => the 
huge,ginormous,humungous => large 
small => tiny,teeny,weeny 
原始文本: “teh small couch” 
输入: “teh”(1), “small”(2), “couch”(3) 
输出: “the”(1), “tiny”(2), “teeny”(2), “weeny”(2), “couch”(3), “sofa”(3), “divan”(3)

原始文本: “teh ginormous, humungous sofa” 
输入: “teh”(1), “ginormous”(2), “humungous”(3), “sofa”(4) 
输出: “the”(1), “large”(2), “large”(3), “couch”(4), “sofa”(4), “divan”(4)

Word Delimiter Filter

这个Filter以每个单词为分隔符。

参数 说明 举例
generateWordParts 整数,默认1 不为0的时候正常分词 CamelCase -> “Camel”, “Case”
generateNumberParts 整数,默认1 不为0的时候可以分隔数字 “1947-32” ->”1947”, “32”
splitOnCaseChange 整数,默认1 为0时,不处理驼峰拼写形式 “BugBlaster-XL” -> “BugBlaster”,”XL”
splitOnNumerics 整数,默认1 为0时,不处理数字和单词组合的形式 “FemBot3000” -> “Fem”, “Bot3000”
catenateWords 整数,默认0 不为0时,会将分析后的单词连接在一起 “hot-spot-sensor’s” -> “hotspotsensor”
catenateNumbers 整数,默认0 不为0时,会将分析后的数字连接在一起 1947-32 -> “194732”
catenateAll 0或1,默认0 不为0时,会将分析后的单词、数字等连接在一起 “Zap-Master-9000” -> “ZapMaster9000”
preserveOriginal 整数,默认0 不为0时,将保留原始的token “Zap-Master-9000” -> “Zap-Master-9000”, “Zap”, “Master”, “9000”
protected 可选,路径名 某个文件的内容将不会分析  
stemEnglishPossessive 整数,默认1 为1时,将除去's形式 “O’Reilly’s” -> “O”, “Reilly”

例子:

<analyzer><tokenizer class="solr.WhitespaceTokenizerFactory"/><filter class="solr.WordDelimiterFilterFactory"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本: “hot-spot RoboBlaster/9000 100XL” 
输入: “hot-spot”, “RoboBlaster/9000”, “100XL” 
输出: “hot”, “spot”, “Robo”, “Blaster”, “9000”, “100”, “XL”

例子2:

<analyzer><tokenizer class="solr.WhitespaceTokenizerFactory"/><filter class="solr.WordDelimiterFilterFactory" generateNumberParts="0" splitOnCaseChange="0"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本: “hot-spot RoboBlaster/9000 100-42” 
输入: “hot-spot”, “RoboBlaster/9000”, “100-42” 
输出: “hot”, “spot”, “RoboBlaster”, “9000”,”100”,”42”

例子3:

<analyzer><tokenizer class="solr.WhitespaceTokenizerFactory"/><filter class="solr.WordDelimiterFilterFactory" catenateWords="1" catenateNumbers="1"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本: “hot-spot 100+42 XL40” 
输入: “hot-spot”(1), “100+42”(2), “XL40”(3) 
输出: “hot”(1), “spot”(2), “hotspot”(2), “100”(3), “42”(4), “10042”(4), “XL”(5), “40”(6)

例子4:

<analyzer><tokenizer class="solr.WhitespaceTokenizerFactory"/><filter class="solr.WordDelimiterFilterFactory" catenateAll="1"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

原始文本: “XL-4000/ES” 
输入: “XL-4000/ES”(1) 
输出: “XL”(1), “4000”(2), “ES”(3), “XL4000ES”(3)

例子5:

<analyzer><tokenizer class="solr.WhitespaceTokenizerFactory"/><filter class="solr.WordDelimiterFilterFactory" protected="protwords.txt"/>
</analyzer>
  • 1
  • 2
  • 3
  • 4

受保护词列表protwords.txt 
AstroBlaster 
XL-5000

原始文本: “FooBar AstroBlaster XL-5000 ==ES-34-” 
输入: “FooBar”, “AstroBlaster”, “XL-5000”, “==ES-34-” 
输出: “FooBar”, “AstroBlaster”, “XL-5000”, “ES”, “34”

Solr Filter过滤器相关推荐

  1. [JAVA EE] Filter过滤器

    Filter过滤器 ◼ 过滤器(Filter)可以动态地拦截请求和响应. ◼ 应用场景:过滤敏感词汇.防止SQL注入.设置字符编码.进行URL级 别的权限访问控制.压缩响应信息等. 启动文件DemoA ...

  2. Filter(过滤器)

    一.Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作. 1.Filter快速入门 1.1.步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方 ...

  3. filter[过滤器]使用大全

    一.页面编码过滤器 1.开发EncodingFilter.java文件,继承自javax.servlet.Filter: package bluemoon.crm.systemmanage.strut ...

  4. (JavaWeb)Filter过滤器

    Filter过滤器 Filter:过滤器,用来过滤网站的数据. 自动登录 统一设置编码格式 访问权限控制 敏感字符过滤等 过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或serv ...

  5. Spring MVC在参数绑定前通过Filter过滤器改变请求参数的值

    第一步,对request请求进行增强: /*** author: zhangxueliang* date: 2019-08-23*/ public class ParameterServletRequ ...

  6. spring boot Filter过滤器的简单使用

    springboot使用Filter过滤器有两种方式: 一种是实现Filter接口然后通过@Component注解向项目加入过滤器 另一种是通过配置类来配置过滤器 @Component public ...

  7. 【Servlet】Filter过滤器详解、使用示例

    Filter过滤器讲解 定义 过滤器处于浏览器与servlet之间,是一个实现了 javax.servlet.Filter 接口的 Java 类 客户端发送的请求.服务器发送的资源,需要通过过滤器,才 ...

  8. JBuilder9+Weblogic8.1——Filter过滤器在Jbuilder9中的运用

    JBuilder9+Weblogic8.1--Filter过滤器在Jbuilder9中的运用 一.首先建立工程FilterTest,建立Web Application,名称也为FilterTest. ...

  9. java filter教程_Java Web Filter 过滤器学习教程(推荐)

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

最新文章

  1. 好多Javascript日期选择器呀-7
  2. 项目: 推箱子游戏【c/c++】
  3. 每天一道LeetCode-----对序列进行排序,要求nums[0] nums[1] nums[2] nums[3] ....
  4. *PAT_B_1052_C++(20分)
  5. 洛谷 P1313 计算系数
  6. style.width与offsetWidth的区别
  7. 页面之间的跳转与交互
  8. MSTP拓扑计算过程与实验
  9. linux增加虚拟内存
  10. 求数组的子数组之和的最大值III(循环数组)
  11. windows2003——工作组和域控制器
  12. IDEA配置LeetCode刷题环境
  13. java speex回声消除_Speex回声消除原理深度解析
  14. python基础之if嵌套与循环
  15. 图片的质量压缩和二次采样
  16. 收藏:国内的12个安全漏洞预警渠道
  17. 捉急:ssh vim中不小心按下ctrl+s后卡死
  18. 国内的商业投诉机构形同虚设!
  19. python基础(四)OOP 面向对象
  20. 福州区网吧管理计费解决方案(转)

热门文章

  1. 一阶系统开环传递函数表达式_机械振动理论(2)-多自由度系统
  2. jenkins自动化_通过Jenkins自动化PSR合规性
  3. POST、GET请求及对应的参数获取
  4. 【matlab_郭彦甫课程_统计题答案】
  5. 建tcode維護自己創建的數據表(SE54/SM30)
  6. 未来10年云计算发展前景如何?云计算的优势在哪里?
  7. 机器视觉丨平行面光源的原理丨打光案例及尺寸图
  8. Rita Hayworth and Shawshank Redemption
  9. STM32使能IIC驱动电流检测芯片INA226
  10. ks 曲线_R语言计算KS值、绘制KS曲线