Solr理解Analyzers, Tokenizers, and Filters.

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) 算法
不支持中文












  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值