1. 关于
关于Solr如何切分文本数据。需要理解三个主要概念:analyzers, tokenizers, and filters.Field analyzers:在索引(index)单个文档和查询(query)时都被使用。它检查字段的文本并生成一个token stream. Analyzers可以是单个class或是由tokenizer和filter序列组成。
Tokenizers: 将字段数据切分为词元。
Filters: 检查tokens流,并且保持、转换或抛弃,或生成新的tokens. Tokenizers和Filters可以组成管道,或链,一个的输出为另一个的输入,这样的一个序列称为Analyzer, 其输出结果用于查询或建索引。
Tokenizers 读取字符流(Reader)并且生成序列的Token对象(TokenStream)
Tokenizer 的输出作为第一个Filter的输入(一个Analyzer只有一个Tokenizer)。
Filters 继承自org.apache.lucene.analysis.TokenStream, 输入是另外一个TokenStream.
2. Tokenizers
可以在schema.xml中为TextField配置Tokenizer, 使用<tokenizer>元素,作为<analyzer>的孩子节点。<tokenizer>的class属性指定一个factory类,实现了org.apache.solr.analysis.util.TokenizerFactory,
其create()方法返回一个TokenStream. Tokenizer是TokenStream对象。
通过设置<tokenizer>的属性,可以传递参数。
<fieldType name="text" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory" param="something" />
<filter class="solr.StandardFilterFactory"/>
</analyzer>
</fieldType>
Token的最大长度为255.
- Standard Tokenizer
Factory类:solr.StandardTokenizerFactory
参数: maxTokenLength (默认255)
空格和标点作为分隔符,分隔符被抛弃。
- Classic Tokenizer
Factory类:solr.ClassicTokenizerFactory
参数: maxTokenLength (默认255)
空格和标点作为分隔符,分隔符被抛弃。
保留域名和邮件地址为单独的token.
- Keyword Tokenizer
Factory类:solr.KeywordTokenizerFactory
参数: 无
将整个文本字段示为一个token.
- Letter Tokenizer
Factory类:solr.LetterTokenizerFactory
参数: 无
抛弃所有非字母字符。
- Lower Case Tokenizer
Factory类:solr.LowerCaseTokenizerFactory
参数: 无
将所有字母转成小写,抛弃所有空格和非字母字符。
- N-Gram Tokenizer
Factory类:solr.NGramTokenizerFactory
参数:
minGramSize (默认1) > 0
maxGramSize (默认2) >= minGramSize
不区分空格,空格也包含在Token中
- Edge N-Gram Tokenizer
Factory类:solr.EdgeNGramTokenizerFactory
参数:
minGramSize (默认1) > 0
maxGramSize (默认2) >= minGramSize
side ("front" or "back", default is "front")
- ICU Tokenizer
Factory类:solr.ICUTokenizerFactory
参数: rulefile 一个逗号分隔的code:rulefile列表
处理多语言,并基于其脚本属性做适当的处理。
<analyzer>
<tokenizer class="solr.ICUTokenizerFactory"
rulefiles="Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi"/>
</analyzer>
- Path Hierarchy Tokenizer
Factory类:solr.PathHierarchyTokenizerFactory
参数:
delimiter (字符,无默认值)
replace (字符,无默认值)
从文件路径层次创建同义词。
<fieldType name="text_path" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="\" replace="/"/>
</analyzer>
</fieldType>
In:"c:\usr\local\apache"
Out:"c:", "c:/usr", "c:/usr/local", "c:/usr/local/apache"
- Regular Expression Pattern Tokenizer
Factory类:solr.PatternTokenizerFactory
参数:
pattern (必要) 正则式,由java.util.regex.Pattern定义。
group (可选,默认-1) -1 表示正则作为分隔符; >=0 表示正则作为token匹配规则。
0 匹配整个regex, >0 匹配括号中的sub-regex,从左到右数。
使用Java正则式来切分文本为Token.
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory" pattern="\s*,\s*"/>
</analyzer>
In:"fee,fie, foe , fum, foo"
Out:"fee", "fie", "foe", "fum", "foo"
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory" pattern="[A-Z][A-Za-z]*" group="0"/>
</analyzer>
In:"Hello. My name is Inigo Montoya. You killed my father. Prepare to die."
Out:"Hello", "My", "Inigo", "Montoya", "You", "Prepare"
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory" pattern="(SKU|Part(\sNumber)?):?\s(\[0-9-\]+)" group="3"/>
</analyzer>
In:"SKU: 1234, Part Number 5678, Part: 126-987"
Out:"1234", "5678", "126-987"
- UAX29 URL Email Tokenizer
Factory类:solr.UAX29URLEmailTokenizerFactory
参数: maxTokenLength (默认255)
空格和标点作为分隔符,分隔符被抛弃。
除非包含数字,连字符(-)作为分隔符。
识别并保留以下作为单独的token:
* 网络域名
* 邮件地址
* file://, http(s)://, and ftp:// 连接
* IPv4 和 IPv6 地址
- White Space Tokenizer
Factory类:solr.WhitespaceTokenizerFactory
参数:
rule 如何定义空格, "java" 使用Character.isWhitespace(int); "unicode" 使用Unicode的WHITESPACE属性。
使用空格做分隔符,并返回非空格token.
3. Filters
在schema.xml中配置<filter>元素,在<tokenizer>或另一个<filter>后面。class属性指定了一个Filter Factory类,它需要实现org.apache.solr.analysis.util.TokenFilterFactory.
Filter是TokenStream对象,处理的也是TokenStream对象。
通过设置<filter>元素属性,可以传递参数到Filter Factory.
- ASCII Folding Filter
- Beider-Morse Filter
- Classic Filter
- Common Grams Filter
- Collation Key Filter
- Daitch-Mokotoff Soundex Filter
- Double Metaphone Filter
- Edge N-Gram Filter
Factory类: solr.EdgeNGramFilterFactory
参数:
minGramSize (默认1)
maxGramSize (默认1)
这里可实现对单个token的ngram效果。
- English Minimal Stem Filter
复数变单数。
- Hunspell Stem Filter
- Hyphenated Words Filter
- ICU Folding Filter
- ICU Normalizer 2 Filter
- ICU Transform Filter
- Keep Word Filter
Factory类: solr.KeepWordFilterFactory
参数:
words (必要) 文本文件,words列表,每行一个,#注释
ignoreCase: (true/false) 默认false
将不在word列表中的词全部抛弃,跟Stop filter是相反的。
- KStem Filter
可代替Porter Stem Filter
- Length Filter
Factory类: solr.LengthFilterFactory
参数:
min: (integer, required)
max: (integer, required, must be >= min)
将不在min/max范围内的token抛弃。
- Lower Case Filter
- Managed Stop Filter
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ManagedStopFilterFactory" managed="english"/>
</analyzer>
通过REST API管理:/solr/collection_name/schema/analysis/stopwords/english
- Managed Synonym Filter
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ManagedSynonymFilterFactory" managed="english"/>
</analyzer>
通过REST API管理:/solr/collection_name/schema/analysis/synonyms/english
- N-Gram Filter
Factory类: solr.NGramFilterFactory
参数:
minGramSize (默认1)
maxGramSize (默认1)
对单个token进行ngram切分。
- Numeric Payload Token Filter
Factory类: solr.NumericPayloadTokenFilterFactory
参数:
payload (必要) 浮点数值
typeMatch (必要) token类型名称
对匹配给定类型的token添加一个浮点数值payload.
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.NumericPayloadTokenFilterFactory" payload="0.75" typeMatch="word"/>
</analyzer>
- Pattern Replace Filter
给定正则式,匹配的token,用给定值替换。
- Phonetic Filter
- Porter Stem Filter
Porter Stemming Algorithm for English
- Remove Duplicates Token Filter
- Reversed Wildcard Filter
- Shingle Filter
- Snowball Porter Stemmer Filter
- Standard Filter
- Stop Filter
Factory类: solr.StopFilterFactory
参数:
words (可选) 包含停用词列表的文本文件,#注释
format(可选) 如,format="snowball"
ignoreCase (true/false) 默认false
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt"/>
</analyzer>
- Suggest Stop Filter
停用词后跟随空格,才去掉。
- Synonym Filter
Factory类: solr.SynonymFilterFactory
参数:
synonyms (必要) 包含同义词的文件。
两种指定同义词映射的方法(每行):
* 逗号分隔,生成包含原token的所有词
* "=>"符号指定,只输出右边的词。
ignoreCase (可选) 默认false
expand (可选) 默认true
format (可选) 默认solr, wordnet
tokenizerFactory (可选) 默认 WhitespaceTokenizerFactory
analyzer (可选) 默认 WhitespaceTokenizerFactory
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="mysynonyms.txt"/>
</analyzer>
mysynonyms.txt
----------------
couch,sofa,divan
teh => the
huge,ginormous,humungous => large
small => tiny,teeny,weeny
----------------
- Token Offset Payload Filter
添加token的字符偏移作为payload值,添加到token.
- Trim Filter
移除首尾空格。
- Type As Payload Filter
添加token的类型作为payload值,添加到token.
- Type Token Filter
按指定文件定义的类型过滤。
- Word Delimiter Filter
分隔符规则:
* "CamelCase" -> "Camel", "Case". 取消: splitOnCaseChange="10"
* "Gonzo5000" -> "Gonzo", "5000" "4500XL" -> "4500", "XL". 取消: splitOnNumerics="0"
* "O'Reilly's" "O", "Reilly"
* "--hot-spot--" "hot", "spot"
4. CharFilterFactories
Char Filter是预处理输入字符的组件。<charFilter>可以依次配置在<tokenizer>元素前。在保留原始字符偏移的同时,添加、改变或移除字符,可以支持如highlighting的功能。
org.apache.solr.analysis
- solr.MappingCharFilterFactory
- solr.HTMLStripCharFilterFactory
移除HTML标签
- solr.ICUNormalizer2CharFilterFactory
使用ICU4J规范化Unicode
- solr.PatternReplaceCharFilterFactory
5. 语言分析 Language Anaysis
KeywordMarkerFilterFactory
KeywordRepeatFilterFactory
StemmerOverrideFilterFactory
Dictionary Compound Word Token Filter
Unicode Collation
ASCII & Decimal Folding Filters
- Language-Specific Factories
<analyzer>
<tokenizer class="solr.HMMChineseTokenizerFactory"/>
<filter class="solr.StopFilterFactory words="org/apache/lucene/analysis/cn/smart/stopwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
6. Phonetic Matching
拼写不同但发音相似的tokens.Beider-Morse Phonetic Matching (BMPM) 算法
不支持中文