solr-filter

Solr Filter过滤器介绍

标签(空格分隔): solr


###Solr的Analyzer分析器、Tokenizer分词器、Filter过滤器的区别/联系
本文转自CSDN随-忆
Solr Filter过滤器介绍[http://blog.csdn.net/jiangchao858/article/details/54989025]

  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 字符等价的字符。
没有参数。
例如:

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

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

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

1
2
3
4
<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”

####Common Grams Filter
这个Filter结合通用tokens来处理常用词。
| 参数 | 值 | 说明 |
| ——– | ——- | —- |
| words | 以.txt结尾的文件| 提供常用词库 |
| format | 可选,例如”snowball” | 指定常用词列表的格式 |
| ignoreCase | 布尔值,默认false | 是否忽略常用词大小写 |
例如:

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

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

####Edge N-Gram Filter
将输入文本转化成指定范围大小的片段。
| 参数 | 值 | 说明 |
| ——– | ——- | —- |
| minGramSize | 整数,默认1| 指定最小的片段大小 |
| maxGramSize | 整数,默认1 | 指定最大的片段大小 |
例如:

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

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

1
2
3
4
<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”
例子:

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

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

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

例子:

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

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

####Keep Word Filter
这个Filter将不属于列表中的单词过滤掉。和Stop Words Filter的效果相反。
| 参数 | 值 | 说明 |
| ——– | ——- | —- |
| words | 必填,以.txt结尾的文件| 提供保留词列表 |
| ignoreCase | 布尔值,默认false | 是否忽略常用词大小写 |
| enablePositionIncrements | 布尔值 | Solr5.0以后废弃 |
例子:

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

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

例子:

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

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

例子:

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

保留词列表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以后废弃 |
例子:

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

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

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

例子:

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

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

####N-Gram Filter
将输入文本转化成指定范围大小的片段。
| 参数 | 值 | 说明 |
| ——– | ——- | —- |
| minGramSize | 整数,默认1| 指定最小的片段大小 |
| maxGramSize | 整数,默认2 | 指定最大的片段大小 |
例子:

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

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

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

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

例子3:

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

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

####Pattern Replace Filter
这个Filter可以使用正则表达式来替换token的一部分内容,与正则表达式想匹配的被替换,不匹配的不变。
| 参数 | 值 | 说明 |
| ——– | ——- | —- |
| pattern | 必填,正则表达式| 需要匹配的正则表达式 |
| replacement | 必填,字符串 | 需要替换的部分 |
| replace | “all” 或 “first”, 默认”all” | 全部替换还是,只替换第一个 |
例子:

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

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

例子2:

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

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

例子3:

1
2
3
4
<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”

####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以后废弃 |
例子:

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

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

例子2:

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

保留词列表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. 以=>分隔的文本,为单向同义词,匹配到左边内容,将替换为右边内容,反之不成立

例子:

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

同义词列表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”|
例子:

1
2
3
4
<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:

1
2
3
4
<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”,”100”,”42”

例子3:

1
2
3
4
<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)

例子4:

1
2
3
4
<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)

例子5:

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

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

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

热评文章