Filters

ASCIIFoldingFilter

  • 将 Unicode 转换成 ascii

  • 工厂类

    • solr.ASCIIFoldingFilterFactory

  • 示例

输入
  "á" (Unicode character 00E1)

输出
  "a" (ASCII character 97)

Beider-MorseFilter

  • Beider-Morse Phonetic Matching (BMPM),貌似是一个识别名字的算法,即使名字拼写错误或者是用的不同的语言

  • 工厂类

    • solr.BeiderMorseFilterFactory

  • 参数

    • nameType:名字的类型,取值为 [GENERIC , ASHKENAZI , SEPHARDIC]。如果不处理 Ashkenazi 或者 Sephardic 名字, 就用 GENERIC

    • ruleType:规则类型,取值为 [APPROX(近似) , EXACT(精确)]

    • concat:多个可能的匹配是否用管道符"|"连接

    • languageSet:语言集,"auto" 表示允许过滤器识别语言,或者是一个逗号分隔的列表

  • 示例

<analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.BeiderMorseFilterFactory" nameType="GENERIC" ruleType="APPROX"
            concat="true" languageSet="auto">
    </filter>
</analyzer>

ClassicFilter

  • 这个过滤器接收 ClassicTokenizer 的输出,去掉缩写词里的句点和所有格里的 s

  • 工厂类

    • solr.ClassicFilterFactory

  • 示例

<analyzer>
    <tokenizer class="solr.ClassicTokenizerFactory"/>
    <filter class="solr.ClassicFilterFactory"/>
</analyzer>
输入
  "I.B.M. cat's can't"

词元
  "I.B.M", "cat's", "can't"

输出
  "IBM", "cat", "can't"

CommonGramsFilter

  • 貌似是用来过滤常用词的,例如停止词:将常用词和词元组合

  • 工厂类

    • solr.CommonGramsFilterFactory

  • 参数

    • words:常用词文件名,txt 格式,例如 stopwords.txt.

    • format:可选的,如果常用词文件格式是 Snowball,通过这个参数指定

    • ignoreCase:与常用词文件比较时,是否忽略大小写,默认=fasle

  • 示例

<analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.CommonGramsFilterFactory" words="stopwords.txt"
                ignoreCase="true"/>
</analyzer>
输入
  "the Cat"

词元
  "the", "Cat"

输出
  "the_cat"

CollationKeyFilter

  • 可用于语言相关的排序,一般用于排序,也可用于高级搜索

Daitch-MokotoffSoundexFilter

  • 实现了 Daitch-Mokotoff Soundex 算法(?),用于识别相似的名字,即使有拼写错误

  • 工厂类

    • solr.DaitchMokotoffSoundexFilterFactory

  • 参数

    • inject :true 表示新的词元会添加到词元流,false 表示开启匹配但是精确的拼写将不会被匹配。默认=true

DoubleMetaphoneFilter

  • 使用 DoubleMetaphone 编码来创建词元

  • 工厂类

    • solr.DoubleMetaphoneFilterFactory

  • 参数

    • inject:true 表示新的词元会添加到词元流,false 表示开启匹配但是精确的拼写将不会被匹配。默认=true

    • maxCodeLength:将要生成的 code 的最大长度

  • 示例

<analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.DoubleMetaphoneFilterFactory"/>
</analyzer>
输入
  "four score and Kuczewski"

词元
  "four"(1), "score"(2), "and"(3), "Kuczewski"(4)

输出
  "four"(1), "FR"(1), "score"(2), "SKR"(2), "and"(3), "ANT"(3), "Kuczewski"(4), "KSSK"(4), "KXFS"(4)

EdgeN-GramFilter

  • 貌似和 edge n-gram Tokenizer 没什么不同

  • 工厂类

    • solr.EdgeNGramFilterFactory

  • 参数

    • minGramSize:gram 最小值,默认=1

    • maxGramSize:gram 最大值,默认=1

  • 示例

<analyzer>
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.EdgeNGramFilterFactory"/>
</analyzer>
输入
  "four score and twenty"

词元
  "four", "score", "and", "twenty"

输出
  "f", "s", "a", "t"
  • 示例2

<analyzer>
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="4"/>
</analyzer>
输入
  "four score"

词元
  "four", "score"

输出
  "f", "fo", "fou", "four", "s", "sc", "sco", "scor"

EnglishMinimalStemFilter

  • 将英文单词的复数形式变为单数形式

  • 工厂类

    • solr.EnglishMinimalStemFilterFactory

  • 参数

  • 示例

<analyzer type="index">
  <tokenizer class="solr.StandardTokenizerFactory "/>
  <filter class="solr.EnglishMinimalStemFilterFactory"/>
</analyzer>
输入
  "dogs cats"

词元
  "dogs", "cats"

输出
  "dog", "cat"

FingerprintFilter

  • 将输入的多个 token 排序,去重,然后串联在一起,返回单个 token,可用于聚集/链接的用例(?)

  • 工厂类

    • solr.FingerprintFilterFactory

  • 参数

    • separator :用于连接多个 token 的字符,默认是空格(" ")

    • maxOutputTokenSize :输出的 token 最大长度,如果超过的话,未输出的 token 被忽略(?),默认=1024

  • 示例

<analyzer type="index">
  <tokenizer class="solr.WhitespaceTokenizerFactory"/>
  <filter class="solr.FingerprintFilterFactory" separator="_" />
</analyzer>
输入
  "the quick brown fox jumped over the lazy dog"

词元
  "the", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"

输出
  "brown_dog_fox_jumped_lazy_over_quick_the"

HunspellStemFilter

貌似是个英文词根过滤器,把各种时态的动词变成一般现在时态

HyphenatedWordsFilter

用于处理用连字符连接的单词:去掉连字符;一般是因为换行导致一个单词位于 2 行,这时可以用连字符表示这是同一个单词

ICUFoldingFilter

这个过滤器可以更好的代替 ASCII Folding Filter, Lower Case Filter, ICU Normalizer 2 Filter 的组合使用

ICUNormalizer2Filter

ICUTransformFilter

KeepWordFilter

  • 凡是不在保留字文件里的 token 都会被丢弃

  • 工厂类

    • solr.KeepWordFilterFactory

  • 参数

    • words:必须,保留字文件路径,绝对路径或者相对路径(相对 solr 配置目录)均可;该文件是个文本文件,每行一个保留字,空行或者以 # 开头的行会被忽略

    • ignoreCase:是否忽略大小写,默认=false;若为 true,那么会假设保留字文件里的保留字全部为小写

    • enablePositionIncrements:如果 luceneMatchVersion>=5.0,该参数无效

  • 示例

keepwords.txt内容如下

happy
funny
silly
<analyzer>
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.KeepWordFilterFactory" words="keepwords.txt"/>
</analyzer>
输入
  "Happy, sad or funny"

词元
  "Happy", "sad", "or", "funny"

输出
  "funny"
  • 示例2

keepwords.txt内容如下

happy
funny
silly
<analyzer>
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.KeepWordFilterFactory" words="keepwords.txt" ignoreCase="true"/>
</analyzer>
输入
  "Happy, sad or funny"

词元
  "Happy", "sad", "or", "funny"

输出
  "Happy", "funny"
  • 示例3

    先用 LowerCaseFilterFactory 过滤,KeepWordFilterFactory 不忽略大小写

keepwords.txt内容如下

happy
funny
silly
<analyzer>
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.LowerCaseFilterFactory"/>
  <filter class="solr.KeepWordFilterFactory" words="keepwords.txt"/>
</analyzer>
输入
  "Happy, sad or funny"

词元
  "Happy", "sad", "or", "funny"

输出
  "happy", "funny"

KStemFilter

貌似是对英文动词时态进行过滤

LengthFilter

  • 对 token 的长度进行过滤,范围内的 token 保留,范围外的 token 被丢弃

  • 工厂类

    • solr.LengthFilterFactory

  • 参数

    • min:token 最小长度

    • max:token 最大长度,必须 >= min

  • 示例

<analyzer>
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.LengthFilterFactory" min="3" max="7"/>
</analyzer>
输入
  "turn right at Albuquerque"

词元
  "turn", "right", "at", "Albuquerque"

输出
  "turn", "right"

LowerCaseFilter

很显然是把大小转换为小写的过滤器

ManagedStopFilter

  • 和 StopFilter 一样,只不过 stopword 文件是通过一个 url 获取而不是直接访问磁盘文件

  • 参数

    • managed:貌似是一个 REST API 接口的名字

ManagedSynonymFilter

  • 和 SynonymFilter 一样,只不过 synonyms 文件是通过一个 url 获取而不是直接访问磁盘文件

  • 参数

    • managed:貌似是一个 REST API 接口的名字

N-GramFilter

和 n-gram 分词器类似吧

NumericPayloadTokenFilter

貌似是给 token 一个浮点数的值

PatternReplaceFilter

  • 将 token 与一个正则表达式匹配,匹配的就替换成指定的值,不匹配的保持原样

  • 工厂类

    • solr.PatternReplaceFilterFactory

  • 参数

    • pattern:必须,正则表达式,用来匹配 token

    • replacement:必须,用来替换 token 中匹配的部分的字符串

    • replace:取值为 ["all" , "first"],默认=all,表示是替换所有匹配的还是仅替换第一个匹配的

  • 示例

<analyzer>
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.PatternReplaceFilterFactory" pattern="cat" replacement="dog"/>
</analyzer>
输入
  "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>
输入
  "cat concatenate catycat"

词元
  "dog", "condogenate", "dogycat"

输出
  "dog", "condogenate", "dogydog"
  • 示例3

    复杂的

<analyzer>
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.PatternReplaceFilterFactory" pattern="(\D+)(\d+)$"
replacement="$1_$2"/>
</analyzer>
输入
  "cat foo1234 9987 blah1234foo"

词元
  "cat", "foo1234", "9987", "blah1234foo"

输出
  "cat", "foo_1234", "9987", "blah1234foo"

PhoneticFilter

基于 phonetic 语音编码算法过滤......

PorterStemFilter

貌似这又是一个对英文单词时态做过滤的

RemoveDuplicatesTokenFilter

  • 移除重复的 token,所谓重复 token 是文本和位置值相同的 token

  • 工厂类

    • solr.RemoveDuplicatesTokenFilterFactory

  • 参数

  • 示例

    本例中用到了同义词过滤器,同义词文件(synonyms.txt)内容如下

Television, Televisions, TV, TVs
<analyzer>
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt"/>
  <filter class="solr.EnglishMinimalStemFilterFactory"/>
  <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
输入
  "Watch TV"

词元1
  "Watch"(1) "TV"(2)

词元2
  "Watch"(1) "Television"(2) "Televisions"(2) "TV"(2) "TVs"(2)

词元3
  "Watch"(1) "Television"(2) "Television"(2) "TV"(2) "TV"(2)

输出
  "Watch"(1) "Television"(2) "TV"(2)

ReversedWildcardFilter

通配符反转过滤器,不含通配符的 token 不会反转,例如输入 "abc",输出 "cba"

ShingleFilter

把输入的 token 组合成一个新的 token,组合采用 n-gram 算法

SnowballPorterStemmerFilter

一个词根相关的过滤器,貌似不支持中文

StandardFilter

貌似在 luceneMatchVersion >= 3.1时无效

提示:luceneMatchVersion 的值在 solrconfig.xml 里查看

StopFilter

  • 停止词过滤,停止词会被丢弃,solr 自带了一个标准的停止词文件,即配置目录下的 stopwords.txt,用于英文......

  • 工厂类

    • solr.StopFilterFactory

  • 参数

    • words:可选,停止词文件路径,停止词文件每行一个停止词,空行和 # 开头的行被忽略,可以用绝对路径,或相对(solr 配置目录)

    • format:可选,停止词格式,取值可以是 snowball

    • ignoreCase:是否忽略大小写,默认=false

    • enablePositionIncrements:如果 luceneMatchVersion >=5.0,该参数无效

  • 示例

<analyzer>
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.StopFilterFactory" words="stopwords.txt"/>
</analyzer>
输入
  "To be or what?"

词元
  "To"(1), "be"(2), "or"(3), "what"(4)

输出
  "To"(1), "what"(4)

SuggestStopFilter

  • 与 StopFilter 的区别是:不会把最后一个 token 移除,除非是该 token 紧跟一个分隔符(例如空格,标点符号,......)

  • StopFilter 用于索引的分词,而 SuggestStopFilter 用于查询的分词

SynonymFilter

  • 同义词过滤器,每个 token 都会在同义词列表里查找,如果有匹配,会用同义词代替原 token

  • 工厂类

    • solr.SynonymFilterFactory

  • 参数

    • synonyms:必须,同义词文件路径,有2种指定同义词映射的方式

      • 逗号分隔的单词列表,token 匹配任意一个单词,所有同义词都会替换原 token,且原 token 会保留

      • 2个逗号分隔的单词列表,2个列表之间用"=>"分隔,token 匹配左边列表中任意单词,会用右边列表里的单词进行替换的同义词列表,除非右边列表里有原 token,否则原 token 不会保留

    • ignoreCase:可选的,是否忽略大小写,默认=false

    • expand:可选,true 表示用所有同义词来替换原 token,false 表示只用第一个同义词来替换,默认=true

    • format:可选,默认=solr,同义词格式

    • tokenizerFactory:可选,默认=WhitespaceTokenizerFactory,用来对同义词文件进行分析的分词器

    • analyzer:可选,默认=WhitespaceTokenizerFactory,用来对同义词文件进行分析的分析器

  • 同义词文件 mysynonyms.txt:

couch,sofa,divan
teh => the
huge,ginormous,humungous => large
small => tiny,teeny,weeny
  • 示例

<analyzer>
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.SynonymFilterFactory" synonyms="mysynonyms.txt"/>
</analyzer>
输入
  "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)

TokenOffsetPayloadFilter

  • 将 token 在原输入流中的位置记录下来,位置表示为[起始位置, 结束位置]

  • 工厂类

    • solr.TokenOffsetPayloadTokenFilterFactory

  • 参数

  • 示例

<analyzer>
  <tokenizer class="solr.WhitespaceTokenizerFactory"/>
  <filter class="solr.TokenOffsetPayloadTokenFilterFactory"/>
</analyzer>
输入
  "bing bang boom"

词元
  "bing", "bang", "boom"

输出
  "bing"[0,4], "bang"[5,9], "boom"[10,14]

TrimFilter

  • 去掉 token 头尾的空白,多数分词器都是用空白进行分词的,所以这个过滤器用于一些特殊的场景

  • 工厂类

    • solr.TrimFilterFactory

  • 参数

    • updateOffsets:如果 luceneMatchVersion>=5.0,该参数无效

  • 示例

<analyzer>
  <tokenizer class="solr.PatternTokenizerFactory" pattern=","/>
  <filter class="solr.TrimFilterFactory"/>
</analyzer>
输入
  "one, two , three ,four "

词元
  "one", " two ", " three ", "four "

输出
  "one", "two", "three", "four"

TypeAsPayloadFilter

为 token 添加类型,例如

输入
  "Pay Bob's I.O.U."

词元
  "Pay", "Bob's", "I.O.U."

输出
  "Pay"[<ALPHANUM>], "Bob's"[<APOSTROPHE>], "I.O.U."[<ACRONYM>]

TypeTokenFilter

  • 貌似是黑白名单的过滤器(?),又或者是给 token 标记类型的过滤器(?)

  • 工厂类

    • solr.TypeTokenFilterFactory

  • 参数

    • types:类型文件的位置

    • useWhitelist:

      • true, types 是个白名单

      • false,types 是个黑名单

    • enablePositionIncrements:luceneMatchVersion>=5.0,该值无效

WordDelimiterFilter

  • 用分隔符 token 的过滤器,下面的规则用于决定什么是分隔符

    • 大小写,例如:"CamelCase" -> "Camel", "Case"。开关为 splitOnCaseChange="0"

    • 字母数字,例如:"Gonzo5000" -> "Gonzo", "5000" "4500XL" -> "4500", "XL"。开关为 splitOnNumerics="0"

    • 非字母数字的字符被丢弃,例如:"hot-spot" -> "hot", "spot"

    • 末尾的"s"被移除,例如:"O'Reilly's" -> "O", "Reilly"

    • 头尾的分隔符被丢弃,例如:"--hot-spot--" -> "hot", "spot"

  • 工厂类

    • solr.WordDelimiterFilterFactory

  • 参数

    • generateWordParts:默认=1,If non-zero, splits words at delimiters. For example:"CamelCase","hot-spot" -> "Camel", "Case", "hot", "spot"

    • generateNumberParts:默认=1,If non-zero, splits numeric strings at delimiters:"1947-32" ->"1947", "32"

    • splitOnCaseChange:默认=1,If 0, words are not split on camel-case changes:"BugBlaster-XL" -> "BugBlaster", "XL". Example 1 below illustrates the default (non-zero) splitting behavior.

    • splitOnNumerics:默认=1,If 0, don't split words on transitions from alpha to numeric:"FemBot3000" -> "Fem", "Bot3000"

    • catenateWords:默认=0,If non-zero, maximal runs of word parts will be joined:"hot-spot-sensor's" -> "hotspotsensor"

    • catenateNumbers:默认=0,If non-zero, maximal runs of number parts will be joined:1947-32" -> "194732"

    • catenateAll:默认=0,If non-zero, runs of word and number parts will be joined:"Zap-Master-9000" -> "ZapMaster9000"

    • preserveOriginal:默认=0,If non-zero, the original token is preserved:"Zap-Master-9000" -> "Zap-Master-9000", "Zap", "Master", "9000"

    • protected:可选,保护文件的路径,该文件包含一个保护词列表,这些保护词不会被分割

    • stemEnglishPossessive:默认=1,去掉表示所有格的"s"

  • 示例

<analyzer>
  <tokenizer class="solr.WhitespaceTokenizerFactory"/>
  <filter class="solr.WordDelimiterFilterFactory"/>
</analyzer>
输入
  "hot-spot RoboBlaster/9000 100XL"

词元
  "hot-spot", "RoboBlaster/9000", "100XL"

输出
  "hot", "spot", "Robo", "Blaster", "9000", "100", "XL"
  • 示例2

    不用大小写分隔,不生成数字 token

<analyzer>
  <tokenizer class="solr.WhitespaceTokenizerFactory"/>
  <filter class="solr.WordDelimiterFilterFactory" generateNumberParts="0" splitOnCaseChange="0"/>
</analyzer>
输入
  "hot-spot RoboBlaster/9000 100-42"

词元
  "hot-spot", "RoboBlaster/9000", "100-42"

输出
  "hot", "spot", "RoboBlaster", "9000"
  • 示例3

<analyzer>
  <tokenizer class="solr.WhitespaceTokenizerFactory"/>
  <filter class="solr.WordDelimiterFilterFactory" catenateWords="1" catenateNumbers="1"/>
</analyzer>
输入
  "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)
  • 示例3

<analyzer>
  <tokenizer class="solr.WhitespaceTokenizerFactory"/>
  <filter class="solr.WordDelimiterFilterFactory" catenateAll="1"/>
</analyzer>
输入
  "XL-4000/ES"

词元
  "XL-4000/ES"(1)

输出
  "XL"(1), "4000"(2), "ES"(3), "XL4000ES"(3)
  • 示例4

    使用一个保护文件,包含了"AstroBlaster", "XL-5000"

<analyzer>
  <tokenizer class="solr.WhitespaceTokenizerFactory"/>
  <filter class="solr.WordDelimiterFilterFactory" protected="protwords.txt"/>
</analyzer>
输入
  "FooBar AstroBlaster XL-5000 ==ES-34-"

词元
  "FooBar", "AstroBlaster", "XL-5000", "==ES-34-"

输出
  "FooBar", "FooBar", "AstroBlaster", "XL-5000", "ES", "34"

Last updated